Permalinks: Benutzerdefinierter Beitragstyp -> Benutzerdefinierte Taxonomie -> Beitrag

39

Ich habe Probleme mit der Arbeit mit WordPress-Umschreiberegeln und könnte Hilfe gebrauchen.

Ich habe einen benutzerdefinierten Beitragstyp namens _shows_.

Alle Shows haben eine eigene Taxonomie. Kategorie _show-category_.A _show_hat nie mehr als eine _show-category_.

Ich möchte, dass meine URLs wie folgt weitergeleitet werden:

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

Nehmen wir als Beispiel aus der Praxis an, wir haben ein _show-category_"Foo" und einen _show_Beitrag mit dem Titel "Bar", in dem "Foo" steht _show-category_. Ich würde erwarten, dass meine WordPress-App so aussieht:

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

Ich versuche, Plugins zu vermeiden, bin aber offen für jede Lösung.

Paul T
quelle
1
Ich möchte Sie nur auf etwas hinweisen, das ich vorher tun musste. wordpress.stackexchange.com/questions/102246/…
reikyoushin

Antworten:

70

Zuerst registrieren Sie Ihre Taxonomie und setzen Sie das slugArgument rewriteauf shows:

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

Registrieren Sie als Nächstes Ihren Beitragstyp und setzen Sie den Slug auf shows/%show_category%und das has_archiveArgument auf shows:

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

Zuletzt fügen Sie einen Filter hinzu, post_type_linkum die Show-Kategorie in einzelnen Show-Permalinks zu ersetzen:

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

BEARBEITEN

Habe das obige has_archiveArgument vergessen register_post_type, das sollte auf gesetzt werden shows.

Milo
quelle
1
Milo, danke! Der post_type_link Filter war das fehlende Teil für mich. Wenn Sie diesen Thread mit demselben Problem lesen, ist nur zu beachten, dass ein kleiner Fehler in der Funktion wpa_show_permalinks vorliegt, bei der $ post-> post_type == 'show' eigentlich 'shows' sein sollte. Nochmals vielen Dank, Milo!
Paul T
4
Wenn Sie eine vorhandene WordPress-Instanz ändern, gehen Sie zu Einstellungen> Permalinks und klicken Sie auf Speichern. Die Änderungen, die Sie in functions.php vorgenommen haben, werden erst wirksam, wenn Sie dies tun.
Jay Neely
2
Dies hat für mich fast funktioniert, da die Taxonomie auf der Post-Typ-Seite / post_type / taxonomy / eine legitime Seite ist (zuvor 404), aber meine / post_type / taxonomy / post ist 404'ing. Beim Registrieren der Taxonomie über "show_category" ist mir aufgefallen, dass "show" registriert wurde, obwohl nur die show_category die Taxonomie ist. Ich registriere nur die Taxonomie.
Justinavery
4
@Milo wie kriegt man das mit sub sub tax wie shows / tax / subtax / post hin?
Benn
2
Ich wünschte, das würde auch für mich funktionieren, aber jeder Singular endet mit einem 404 ....
Beee