web-dev-qa-db-fra.com

Permaliens: type d'article personnalisé -> taxonomie personnalisée -> article

J'ai de la difficulté à travailler avec les règles de réécriture de WordPress et je pourrais avoir besoin d'aide.

J'ai un type de message personnalisé appelé _shows_.

Tous shows ont une seule catégorie de taxonomie personnalisée _show-category_. Un _show_ n'aura jamais plus d'un _show-category_.

J'aimerais que mes urls soient routés de cette manière:

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

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

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

Ainsi, à titre d'exemple, nous avons un _show-category_ "Foo" et un article _show_ intitulé "Bar" qui a "Foo" en tant que _show-category_. Je m'attendrais à ce que mon application WordPress ressemble à ceci:

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

J'essaie d'éviter les plugins quand c'est possible, mais je suis ouvert à toute solution.

38
Paul T

Tout d’abord, enregistrez votre taxonomie et définissez l’argument slug de rewrite sur shows:

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

Ensuite, enregistrez votre type de message et définissez le slug sur shows/%show_category%, et définissez l'argument has_archive sur shows:

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

Enfin, ajoutez un filtre à post_type_link pour remplacer la catégorie d’émission dans les permaliens d’émission individuels:

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

J'ai oublié l'argument has_archive de register_post_type ci-dessus, qui devrait être défini sur shows.

65
Milo