I've registered a custom post type "book" and a taxonomy "authors" as below:

add_action( 'init', 'post_book_init' );

function post_book_init() {

    $labels = array(
        'name'               => 'BOOKs',
        'singular_name'      => 'BOOK',
        'menu_name'          => 'BOOKs',
        'name_admin_bar'     => 'BOOK',
        'add_new'            => 'Add New',
        'add_new_item'       => 'Add New BOOK',
        'new_item'           => 'New BOOK',
        'edit_item'          => 'Edit BOOK',
        'view_item'          => 'View BOOK',
        'all_items'          => 'All BOOKs',
        'search_items'       => 'Search BOOKs',
        'parent_item_colon'  => 'Parent BOOKs',
        'not_found'          => 'No BOOK found.',
        'not_found_in_trash' => 'No BOOK found in Trash.'

    $args = array(
        'labels'             => $labels,
        'taxonomies'         => array('authors'),       
        'public'             => true,
        'publicly_queryable' => true,
        'show_ui'            => true,
        'show_in_menu'       => true,
        'query_var'          => true,
        'rewrite'            => false,  
        'with_front' => false,      
        'capability_type'    => 'post',
        'has_archive'        => 'bookarchives',
        'hierarchical'       => false,
        'menu_position'      => null,
        'supports'           => array( 'title', 'editor', 'author', 'thumbnail', 'excerpt', 'trackbacks','custom-fields','comments','revisions','page-attributes','post-formats' )
    register_post_type('book', $args );

$labels = array(
        'name'              => 'Authors',
        'singular_name'     => 'Author',
        'search_items'      => 'Search Author',
        'all_items'         => 'All Authors',
        'parent_item'       => 'Parent Author',
        'parent_item_colon' => 'Parent Author:',
        'edit_item'         => 'Edit Author',
        'update_item'       => 'Update Author',
        'add_new_item'      => 'Add New Author',
        'new_item_name'     => 'New Author Name',
        'menu_name'         => 'Author'

    $args = array(
        'hierarchical'      => true,
        'labels'            => $labels,
        'show_ui'           => true,
        'show_admin_column' => true,
        'show_in_nav_menus' => true,
        'query_var'         => true,
        'rewrite'           => array( 'slug' => 'authors' ),

    register_taxonomy('authors', 'book', $args );

        global $wp_rewrite;
    $book_structure = '/book/%authors%/%book%-blah-blah-blah';
$wp_rewrite->add_rewrite_tag("%book%", '([^/]+)', "book=");
$wp_rewrite->add_permastruct('book', $book_structure, false);


I want to use taxonomy term in permalink and applied rewrite rules after registration of post & taxonomy. And also replaced taxonomy term using below code:

add_filter('post_type_link', 'author_permalink_structure', 10, 4);
function author_permalink_structure($post_link, $post, $leavename, $sample) {
    if (false !== strpos($post_link, '%authors%')) {
        $author_type_term = get_the_terms($post->ID, 'authors');
        if (!empty($author_type_term))
            $author_slug = array_pop($author_type_term)->slug;
            $post_link = str_replace('%authors%', $author_slug, $post_link);
            $post_link = str_replace('%authors%', 'uncategorized', $post_link);
    return $post_link;

So the following links works fine: localhost/book/[authors]/[book-title]-blah-blah blah and localhost/book/[authors] But I also need parent taxonomy slug with child taxonomy like [parent-taxonomy-slug]/[child-taxonomy-slug] I tried concating parent & child slugs with "/" but it returns 404 page not found, although concating with "-" works fine.

$author_slug = array_pop($author_type_term)->slug;
$post_link = str_replace('%authors%', $parent_slug . "-" .$author_slug , $post_link);

How can I use "[parent-taxonomy-slug]/[child-taxonomy-slug]" in permalink?

  • note that author is already a core query var, you should use something else.
    – Milo
    Commented Jan 3, 2016 at 19:49
  • Yes, I have used different var. Forgot to change it here..
    – Mihir
    Commented Jan 4, 2016 at 2:11

1 Answer 1


To handle the extra URL segment you need to add another rewrite rule similar to the one generated by add_permastruct, but with an extra capture group and slash for the additional level of terms:


Also, as I mentioned in my comment, the query var and slug author are already in use by core, you should probably change those.

Also in your post_type_link function, you should check if terms/parent terms exist before trying to access their properties, which will produce warnings with debugging enabled.


Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Not the answer you're looking for? Browse other questions tagged or ask your own question.