WooCommerce Product URL re-writing

I am trying to re-write my WooCommerce product urls to be have the Post ID at the end, like this:

/product/product-name-post-id/

I've used the code from this thread How to rewrite URI of custom post type? which is working, but we have /product/post-id-product-name/.

add_filter('post_type_link', 'wpse33551_post_type_link', 1, 3);

function wpse33551_post_type_link( $link, $post = 0 ){
    if ( $post-post_type == 'product' ){
        return home_url( 'product/' . $post-post_name . '-' . $post-ID );
    } else {
        return $link;
    }
}

add_action( 'init', 'wpse33551_rewrites_init' );

function wpse33551_rewrites_init(){
    add_rewrite_rule(
        'product/([0-9]+)?$',
        'index.php?post_type=productp=$matches[1]',
        'top' );
}

I can't work out how to work the re-write rule in the second function here to get the Post-ID to be at the end?

Topic woocommerce-offtopic Wordpress

Category Web


This should work:

add_action( 'init', 'wpse33551_rewrites_init' );

function wpse33551_rewrites_init(){
    add_rewrite_rule(
        'product/.+\-([0-9]+)?$',
        'index.php?post_type=product&p=$matches[1]',
        'top' );
}

The filter function is changing the permalink to like product/my-product-name-88. You just need to tweak the regex in the second function to deal with that pattern.

The regex is:

product/ – matches the literal string product/

.+ – matches one or more other characters

\- – matches a hyphen (the backslash escapes it, so the regex engine doesn't think it's a special regex operator, like in the next bit)

([0-9]+)?$ – matches and captures one or more numbers at the end of the URL

As @gregory says, after making this change you need to click the save button on your permalink page wp-admin/options-permalink.php to flush the rewrite cache.

About

Geeks Mental is a community that publishes articles and tutorials about Web, Android, Data Science, new techniques and Linux security.