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

39

Estou com problemas para trabalhar com as regras de reescrita do WordPress e poderia usar alguma ajuda.

Eu tenho um tipo de postagem personalizado chamado _shows_.

Todos os shows têm uma única categoria de taxonomia personalizada _show-category_.A _show_nunca terá mais de um _show-category_.

Gostaria que meus URLs fossem roteados desta 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 _show-category_"Foo" e um _show_post intitulado "Bar" que possui "Foo" como está _show-category_. Espero que meu aplicativo WordPress fique assim:

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.

Paul T
fonte
1
apenas apontando você para algo que eu tinha que fazer antes .. wordpress.stackexchange.com/questions/102246/…
reikyoushin

Respostas:

70

Em primeiro lugar, registrar sua taxonomia e definir o slugargumento de rewriteque shows:

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

Em seguida, registre seu tipo de postagem, defina a lesma como shows/%show_category%e defina o has_archiveargumento como shows:

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

Por fim, adicione um filtro para post_type_linksubstituir a categoria de show nos links permanentes de show 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 );

EDITAR

Esqueceu o has_archiveargumento register_post_typeacima, que deve ser definido como shows.

Milo
fonte
1
Milo, obrigado! O filtro post_type_link era a peça que faltava para mim. Qualquer pessoa que esteja lendo este tópico com o mesmo problema, a única coisa a se notar é que há um pequeno erro na função wpa_show_permalinks, em que $ post-> post_type == 'show' deve realmente ser 'shows'. Mais uma vez obrigado Milo!
Paul T
4
Se estiver fazendo uma alteração em uma instância existente do WordPress, acesse Configurações> Links permanentes e clique em Salvar. As alterações que você fez no functions.php não terão efeito até você.
Jay Neely
2
Isso quase funcionou para mim, pois a taxonomia é exibida na página de tipo de postagem, / post_type / taxonomy / é uma página legítima (anteriormente 404), mas meu / post_type / taxonomy / post é 404'ing. Notei que ao registrar a taxonomia acima de "show_category" e "show" estavam sendo registrados, mesmo que apenas o show_category seja a taxonomia. Só estou registrando a taxonomia.
justinavery 28/09/16
4
@ Milo alguma maneira de fazê-lo funcionar com sub sub impostos como shows / tax / subtax / post?
Benn
2
Eu desejei que isso funcionasse para mim também, mas todo singular termina em um 404 ...
Beee