ti-enxame.com

Permalinks: tipo de postagem personalizada -> taxonomia personalizada -> postagem

Eu estou tendo problemas para trabalhar com as regras de reescrita do WordPress, e poderia usar alguma ajuda.

Eu tenho um tipo de post personalizado chamado _shows_.

Todos mostra tem uma única categoria de taxonomia personalizada _show-category_. Um _show_ nunca terá mais de um _show-category_.

Gostaria que meus URLs fossem encaminhados dessa maneira:

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

Então, como um exemplo do mundo real, digamos que temos um post de _show-category_ "Foo" e um _show_ intitulado "Bar" que tem "Foo" como _show-category_. Eu esperaria que meu aplicativo WordPress se parecesse com isso:

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

Eu tento evitar plugins quando possível, mas estou aberto a qualquer solução.

38
Paul T

Primeiro, registre sua taxonomia e defina o argumento slug de rewrite para shows:

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

Em seguida, registre seu tipo de postagem e defina o slug como shows/%show_category% e defina o argumento has_archive como shows:

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

Por último, adicione um filtro a post_type_link para substituir a categoria de exibição em permalinks de apresentação individuais:

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

Esqueceu o argumento has_archive de register_post_type acima, que deve ser definido como shows.

65
Milo