wc_fix_rewrite_rules()
Various rewrite rule fixes.
No Hooks.
Returns
array.
Usage
wc_fix_rewrite_rules( $rules );
- $rules(array) (required)
- Rules.
Changelog
| Since 2.2 | Introduced. |
wc_fix_rewrite_rules() wc fix rewrite rules code WC 11.2.1
function wc_fix_rewrite_rules( $rules ) {
global $wp_rewrite;
$permalinks = wc_get_permalink_structure();
// Fix the rewrite rules when the product permalink have %product_cat% flag.
if ( preg_match( '`/(.+)(/%product_cat%)`', $permalinks['product_rewrite_slug'], $matches ) ) {
foreach ( $rules as $rule => $rewrite ) {
if ( preg_match( '`^' . preg_quote( $matches[1], '`' ) . '/\(`', $rule ) && preg_match( '/^(index\.php\?product_cat)(?!(.*product))/', $rewrite ) ) {
unset( $rules[ $rule ] );
}
}
}
$shop_page_id = wc_get_page_id( 'shop' );
$product_base = trim( rawurldecode( $permalinks['product_base'] ), '/' );
$uses_shop_as_base = false;
// The product base is site-wide, while multilingual extensions can filter the Shop page for the current request.
$shop_page_ids = array_unique( array( absint( get_option( 'woocommerce_shop_page_id' ) ), $shop_page_id ) );
foreach ( $shop_page_ids as $candidate_shop_page_id ) {
$shop_page = $candidate_shop_page_id > 0 ? get_post( $candidate_shop_page_id ) : null;
$shop_base = $shop_page instanceof WP_Post && 'page' === $shop_page->post_type ? trim( rawurldecode( (string) get_page_uri( $candidate_shop_page_id ) ), '/' ) : '';
if ( '' !== $shop_base && ( $shop_base === $product_base || 0 === strpos( $product_base, $shop_base . '/' ) ) ) {
$uses_shop_as_base = true;
break;
}
}
if ( ! $uses_shop_as_base ) {
return $rules;
}
if ( $shop_page_id ) {
$page_rewrite_rules = array();
$subpages = wc_get_page_children( $shop_page_id );
// Subpage rules.
foreach ( $subpages as $subpage ) {
$uri = get_page_uri( $subpage );
$page_rewrite_rules[ $uri . '/?$' ] = 'index.php?pagename=' . $uri;
$wp_generated_rewrite_rules = $wp_rewrite->generate_rewrite_rules( $uri, EP_PAGES, true, true, false, false );
foreach ( $wp_generated_rewrite_rules as $key => $value ) {
$wp_generated_rewrite_rules[ $key ] = $value . '&pagename=' . $uri;
}
$page_rewrite_rules = array_merge( $page_rewrite_rules, $wp_generated_rewrite_rules );
}
// Merge with rules.
$rules = array_merge( $page_rewrite_rules, $rules );
}
return $rules;
}