simonvk
simonvk

Reputation: 76

Woocommerce product ID in url

I'm looking for a way to put a Woocommerce product ID in a URL, e.g.:

domain.com/product-category/id/product-title

The ID is the product's post ID, e.g. "12092". Automatically created by WooCommerce in Wordpress.

Can this be done in a way? Either easily through the Wordpress permalinks settings or in a different way through hacking my way into the files.

This nearly works:

<?php

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( 'p/' . $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=product&p=$matches[1]',
    'top' );
}

?>

But the output is:

 domain.com/p/45

I'd like it to be:

 domain.com/p/45/title-of-the-post

Thanks!

Upvotes: 0

Views: 13135

Answers (2)

user6580560
user6580560

Reputation:

Why so complicated? Go to settings -> permalinks and click "Shop based URL" and save. Now you can see that the permalink structure in the "Custom structure". It should looks like this now:

/shop/%product_cat%/

Now add the post_id to the permalink setting like this:

/shop/%product_cat%/%post_id%/

Save it and go ahead.

Upvotes: 8

Derk-Jan
Derk-Jan

Reputation: 1954

You can use $post->post_name to get the slug.

Use a more permissive regular expression to accept any url that ends with /p/[id][anything]

<?php

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 $link;

    return home_url( 'p/' . $post->ID . '/' . $post->post_name );
}

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

?>

You might need to 'reset' your permalinks in the settings menu for WordPress to accept the new rule.

Upvotes: 4

Related Questions