Permalinks: niestandardowy typ postu -> niestandardowa taksonomia -> post

39

Mam problem z pracą z regułami przepisywania WordPress i mogę skorzystać z pomocy.

Mam niestandardowy typ postu o nazwie _shows_.

Wszystkie programy mają jedną niestandardową kategorię systematyki _show-category_.A, _show_która nigdy nie będzie miała więcej niż jedną _show-category_.

Chciałbym, aby moje adresy URL były kierowane w następujący sposób:

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

Jako przykład z prawdziwego świata, powiedzmy, że mamy _show-category_„Foo” i _show_post zatytułowany „Bar”, który ma „Foo” _show-category_. Spodziewałbym się, że moja aplikacja WordPress będzie wyglądać tak:

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

Staram się unikać wtyczek, gdy jest to możliwe, ale jestem otwarty na każde rozwiązanie.

Paul T.
źródło
1
tylko wskazując na coś, co musiałem zrobić wcześniej .. wordpress.stackexchange.com/questions/102246/…
reikyoushin

Odpowiedzi:

70

Najpierw zarejestrować taksonomii i ustaw slugargument rewritedo shows:

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

Następnie zarejestruj swój typ postu, ustaw ślimak na shows/%show_category%i ustaw has_archiveargument na shows:

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

Na post_type_linkkoniec dodaj filtr, aby zastąpić kategorię programu w pojedynczych linkach do programu:

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 );

EDYTOWAĆ

Zapomniałem powyższego has_archiveargumentu register_post_type, który należy ustawić na shows.

Milo
źródło
1
Milo, dziękuję! Brakowało mi filtra post_type_link. Każdy, kto czyta ten wątek z tym samym problemem, jedyną rzeczą godną uwagi jest niewielki błąd w funkcji wpa_show_permalinks, gdzie $ post-> post_type == 'show' powinno być w rzeczywistości „pokazuje”. Jeszcze raz dziękuję Milo!
Paul T
4
Jeśli dokonujesz zmiany w istniejącej instancji WordPress, upewnij się, że idziesz do Ustawienia> Permalinks i kliknij zapisz. Zmiany, które wprowadziłeś w functions.php, nie będą obowiązywać, dopóki tego nie zrobisz.
Jay Neely,
2
To prawie dla mnie zadziałało, ponieważ taksonomia wyświetla się na stronie typu postu, / post_type / taxonomy / jest prawidłową stroną (wcześniej 404), ale mój / typ_tytu / taksonomia / post ma 404'ing. Zauważyłem, rejestrując systematykę powyżej obu kategorii „show_category”, „show” były rejestrowane, mimo że tylko kategoria show_category jest taksonomią. Rejestruję tylko taksonomię.
justinavery
4
@Milo w jakikolwiek sposób, aby to działało z sub-podatkiem, takim jak show / tax / subtax / post?
Benn
2
Tak bardzo żałuję, że to też nie zadziała, ale każda liczba pojedyncza kończy się na 404 ....
Beee