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
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:
- This will just grab the first product category for the post ordered
by name. - There still may be some 404 errors, if pages, posts etc., have same names.