$conf, $runtime; function_exists('chdir') AND chdir(APP_PATH); $r = 'mysql' == $conf['cache']['type'] ? website_set('runtime', $runtime) : cache_set('runtime', $runtime); } function runtime_truncate() { global $conf; 'mysql' == $conf['cache']['type'] ? website_set('runtime', '') : cache_delete('runtime'); } register_shutdown_function('runtime_save'); ?>Permalinks: custom post type -> custom taxonomy -> post|Programmer puzzle solving
最新消息:Welcome to the puzzle paradise for programmers! Here, a well-designed puzzle awaits you. From code logic puzzles to algorithmic challenges, each level is closely centered on the programmer's expertise and skills. Whether you're a novice programmer or an experienced tech guru, you'll find your own challenges on this site. In the process of solving puzzles, you can not only exercise your thinking skills, but also deepen your understanding and application of programming knowledge. Come to start this puzzle journey full of wisdom and challenges, with many programmers to compete with each other and show your programming wisdom! Translated with DeepL.com (free version)

Permalinks: custom post type -> custom taxonomy -> post

matteradmin7PV0评论

I am having trouble working with WordPress rewrite rules, and could use some help.

I have a custom post type called _shows_.

All shows have a single custom taxonomy category _show-category_. A _show_ will never have more than one _show-category_.

I would like my urls to route in this manner:

www.mysite/shows/  =>  archive-shows.php

www.mysite/shows/%category%/ => taxonomy-show-category.php

www.mysite/shows/%category%/%postname%/ => single-shows.php

So as a real world example, lets say we have a _show-category_ "Foo" and a _show_ post titled "Bar" that has "Foo" as it's _show-category_. I would expect my WordPress app to look like this:

www.mysite/shows/foo/ => shows all posts under the foo category
www.mysite/shows/foo/bar => shows the indivual post

I try to avoid plugins when possible, but am open to any solution.

I am having trouble working with WordPress rewrite rules, and could use some help.

I have a custom post type called _shows_.

All shows have a single custom taxonomy category _show-category_. A _show_ will never have more than one _show-category_.

I would like my urls to route in this manner:

www.mysite/shows/  =>  archive-shows.php

www.mysite/shows/%category%/ => taxonomy-show-category.php

www.mysite/shows/%category%/%postname%/ => single-shows.php

So as a real world example, lets say we have a _show-category_ "Foo" and a _show_ post titled "Bar" that has "Foo" as it's _show-category_. I would expect my WordPress app to look like this:

www.mysite/shows/foo/ => shows all posts under the foo category
www.mysite/shows/foo/bar => shows the indivual post

I try to avoid plugins when possible, but am open to any solution.

Share Improve this question edited Jul 28, 2016 at 6:58 user9447 1,7927 gold badges30 silver badges55 bronze badges asked Aug 1, 2013 at 16:16 Paul TPaul T 6671 gold badge6 silver badges7 bronze badges 2
  • 1 just pointing you to something i had to do before.. wordpress.stackexchange/questions/102246/… – reikyoushin Commented Aug 1, 2013 at 17:14
  • Brilliant question, and the accepted answer by @Milo is so well done it really should be in official Wordpress documentation. This is a VERY common use case for proper URLs. – Khom Nazid Commented Apr 6, 2022 at 1:36
Add a comment  | 

1 Answer 1

Reset to default 93

First, register your taxonomy and set the slug argument of rewrite to shows:

register_taxonomy(
    'show_category',
    'show',
    array(
        'rewrite' => array( 'slug' => 'shows', 'with_front' => false ),
        // your other args...
    )
);

Next, register your post type and set the slug to shows/%show_category%, and set has_archive argument to shows:

register_post_type(
    'show',
    array(
        'rewrite' => array( 'slug' => 'shows/%show_category%', 'with_front' => false ),
        'has_archive' => 'shows',
        // your other args...
    )
);

Last, add a filter to post_type_link to substitute the show category in individual show permalinks:

function wpa_show_permalinks( $post_link, $post ){
    if ( is_object( $post ) && $post->post_type == 'show' ){
        $terms = wp_get_object_terms( $post->ID, 'show_category' );
        if( $terms ){
            return str_replace( '%show_category%' , $terms[0]->slug , $post_link );
        }
    }
    return $post_link;
}
add_filter( 'post_type_link', 'wpa_show_permalinks', 1, 2 );

EDIT

Forgot the has_archive argument of register_post_type above, that should be set to shows.

Post a comment

comment list (0)

  1. No comments so far