Include taxonomy slug in url?

I have the following custom post-type and custom taxonomy setup:

add_action( 'init', 'create_post_type' );
function create_post_type() {
    register_post_type( 'system',
        array(
            'labels' => array(
                'name' => __( 'Systems' ),
                'singular_name' => __( 'System' )
            ),
        'capability_type' => 'post',
        'supports' => array('title','editor','comments'),   
        'public' => true,
        'has_archive' => true,
        'rewrite' => array( 'slug' => 'system' ),
        )
    );
}

function news_init() {
    register_taxonomy(
        'system',
        'system',
        array(
            'label' => __( 'Product Category' ),
            'sort' => true,
            'hierarchical' => true,
            'args' => array( 'orderby' => 'term_order' ),
            'rewrite' => array( 'slug' => 'product-category' )
        )
    );  
}
add_action( 'init', 'news_init' );

Is it possible to include the custom taxonomy name in the URL?

At present when I goto a custom post the URL looks like this:

http://www.domain/product-category/(post-name)/

How can I make it look like the following?

http://www.domain/(category-slug)/(post-name)/

3 Answers
3

This can be a bit challenging for WordPress, because it wouldn’t know whether you are referring to post, page or taxonomy. Nevertheless, rename your taxonomy to something like product_category and try changing the slug in your post type arguments to system/%product_category%, and slug in your taxonomy arguments to just system. WordPress should now handle /system/your-product-category/post-name/

Out of the box WordPress doesn’t recognize the permalink structure tag %product_category%, so we need to declare it:

function filter_post_type_permalink($link, $post)
{
    if ($post->post_type != 'system')
        return $link;

    if ($cats = get_the_terms($post->ID, 'product_category'))
        $link = str_replace('%product_category%', array_pop($cats)->slug, $link);
    return $link;
}
add_filter('post_type_link', 'filter_post_type_permalink', 10, 2);

NOTES:

  1. This will just grab the first product category for the post ordered
    by name.
  2. There still may be some 404 errors, if pages, posts etc., have same names.

Leave a Comment