Permaliens: type de message personnalisé -> taxonomie personnalisée -> post

39

Je ne parviens pas à utiliser 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 les spectacles ont une seule taxonomie personnalisée. La catégorie _show-category_.A _show_n'en aura jamais plus d'une _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 _show_article intitulé "Bar" qui a "Foo" tel quel _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.

Paul T
la source
1
je vous
indique

Réponses:

70

Tout d' abord, enregistrer votre taxonomie et définir l' slugargument rewriteà 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' has_archiveargument 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 pour post_type_linksubstituer 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 );

MODIFIER

Oublié l' has_archiveargument de register_post_typeci-dessus, cela devrait être réglé sur shows.

Milo
la source
1
Milo, merci! Le filtre post_type_link était la pièce manquante pour moi. Toute personne lisant ce fil avec le même problème, la seule chose à noter est qu'il y a une petite erreur sur la fonction wpa_show_permalinks, où $ post-> post_type == 'show' devrait en réalité être 'shows'. Merci encore Milo!
Paul T
4
Si vous modifiez une instance WordPress existante, veillez à accéder à Paramètres> Permaliens et à cliquer sur Enregistrer. Les modifications que vous avez apportées à functions.php ne prendront effet que si vous le faites.
Jay Neely
2
Cela a presque fonctionné pour moi dans la mesure où la taxonomie est affichée sur la page de type d'article, le / post_type / taxonomy / est une page légitime (précédemment 404) mais mon / post_type / taxonomy / post vaut 404 '. J'ai remarqué lors de l'enregistrement de la taxonomie au-dessus que "show_category", "show" étaient en cours d'enregistrement, même si seule la show_category est la taxonomie. Je n'enregistre que la taxonomie.
justinavery
4
@Milo un moyen de faire en sorte que cela fonctionne avec des sous-taxes telles que des émissions / taxes / sous-taxes / publications?
Benn
2
J'aurais tellement voulu que cela fonctionne pour moi aussi, mais chaque singulier se termine par un 404 ....
Beee