So erstellen Sie eine Permalink-Struktur mit benutzerdefinierten Taxonomien und benutzerdefinierten Beitragstypen wie Basisname / Elternsteuer / Kindersteuer / benutzerdefinierter Beitragstypname

53

Ich habe diese Site und google nach der Antwort durchsucht und bin völlig leer herausgekommen. Grundsätzlich möchte ich genau das tun, was dieser Beitrag verlangt, aber ich brauche eine hierarchische Taxonomie. Die Antwort in diesem Beitrag funktioniert hervorragend, aber nur mit einer Taxonomie auf einer Ebene. Ist es möglich zu tun was ich will? Ich habe eine Million Dinge ausprobiert, aber keine funktioniert, bestenfalls kann ich die richtigen Permalinks bekommen, aber sie kommen auf 404.

So veranschaulichen Sie visuell, was ich möchte:

/basename/ - ideally a page, but I think this will cause a permalink collision    
/basename/top-cat/ - top parent custom taxonomy archive    
/basename/top-cat/child-cat/ - child cat custom taxonomy archive     
/basename/top-cat/child-cat/grandchild-cat/ - grandchild cat custom taxonomy archive    
/basename/top-cat/child-cat/grandchild-cat/post-name/ - my custom post type post

Sie können dies mit den eingebauten Posts und Kategorien gut machen. Wie geht das mit benutzerdefinierten Taxonomien und benutzerdefinierten Post-Typen? Ich weiß, dass Sie verwenden müssen, 'rewrite' => array( 'slug' => 'tax-name', 'with_front' => true, 'hierarchical' => true ),um hierarchische Slugs zu erhalten, was auf den Archivseiten gut funktioniert, aber die benutzerdefinierten Posts vom Typ "Posts" werden 404 'hierarchical' => trueangezeigt. Wenn ich den Teil entferne , funktionieren die Posts, aber ich verliere die hierarchischen URLs (nur / basename) / enkelkatze / postname / arbeitet).

Also irgendwelche Lösungen? Vielen Dank, das macht mich jetzt seit ungefähr 3 Wochen verrückt.

Jeff
quelle

Antworten:

68

Nachdem ich einige andere Antworten kombiniert hatte, funktionierte es! Hier ist die Lösung für diejenigen unter Ihnen, die auch damit zu kämpfen haben:

Dieser und dieser Beitrag haben mir geholfen, also vielen Dank an diese Leute.

Beachten Sie, dass der gesamte Code sowie Ihr ursprünglicher benutzerdefinierter Beitragstyp und Taxonomie-Registrierungscode in Ihrer functions.phpDatei enthalten sind.

Achten Sie beim Definieren Ihrer benutzerdefinierten Beitragstypen und Taxonomien zuerst darauf, dass Ihre Slugs richtig sind: Für den benutzerdefinierten Beitragstyp sollte dies der Fall sein, basename/%taxonomy_name%und für Ihre Taxonomie sollte der Slug der richtige Wert sein basename. Vergessen Sie nicht 'hierarchical' => true, das Array zum Umschreiben der Taxonomie zu ergänzen , um verschachtelte Begriffe in Ihrer URL zu erhalten. Stellen Sie außerdem sicher query_var, dass truein beiden Fällen auf eingestellt ist.

Sie müssen eine neue Umschreiberegel hinzufügen, damit WordPress Ihre URL-Struktur interpretieren kann. In meinem Fall ist der benutzerdefinierte Beitragstyp-Teil des URI immer das 5. URI-Segment, daher habe ich meine Übereinstimmungsregel entsprechend definiert. Beachten Sie, dass Sie dies möglicherweise ändern müssen, wenn Sie mehr oder weniger Uri-Segmente verwenden. Wenn Sie unterschiedliche Ebenen von verschachtelten Begriffen haben, müssen Sie eine Funktion schreiben, um zu überprüfen, ob das letzte URI-Segment ein benutzerdefinierter Beitragstyp oder ein Taxonomiebegriff ist, um zu wissen, welche Regel hinzugefügt werden muss (fragen Sie mich, ob Sie Hilfe benötigen) Das).

add_filter('rewrite_rules_array', 'mmp_rewrite_rules');
function mmp_rewrite_rules($rules) {
    $newRules  = array();
    $newRules['basename/(.+)/(.+)/(.+)/(.+)/?$'] = 'index.php?custom_post_type_name=$matches[4]'; // my custom structure will always have the post name as the 5th uri segment
    $newRules['basename/(.+)/?$']                = 'index.php?taxonomy_name=$matches[1]'; 

    return array_merge($newRules, $rules);
}

Anschließend müssen Sie diesen Code hinzufügen, damit Workpress weiß, wie mit %taxonomy_name%Ihrer benutzerdefinierten Slug-Struktur für das Umschreiben von Posts umzugehen ist :

function filter_post_type_link($link, $post)
{
    if ($post->post_type != 'custom_post_type_name')
        return $link;

    if ($cats = get_the_terms($post->ID, 'taxonomy_name'))
    {
        $link = str_replace('%taxonomy_name%', get_taxonomy_parents(array_pop($cats)->term_id, 'taxonomy_name', false, '/', true), $link); // see custom function defined below
    }
    return $link;
}
add_filter('post_type_link', 'filter_post_type_link', 10, 2);

Ich habe eine benutzerdefinierte Funktion erstellt, die auf der eigenen von Wordpress basiert get_category_parents:

// my own function to do what get_category_parents does for other taxonomies
function get_taxonomy_parents($id, $taxonomy, $link = false, $separator = '/', $nicename = false, $visited = array()) {    
    $chain = '';   
    $parent = &get_term($id, $taxonomy);

    if (is_wp_error($parent)) {
        return $parent;
    }

    if ($nicename)    
        $name = $parent -> slug;        
else    
        $name = $parent -> name;

    if ($parent -> parent && ($parent -> parent != $parent -> term_id) && !in_array($parent -> parent, $visited)) {    
        $visited[] = $parent -> parent;    
        $chain .= get_taxonomy_parents($parent -> parent, $taxonomy, $link, $separator, $nicename, $visited);

    }

    if ($link) {
        // nothing, can't get this working :(
    } else    
        $chain .= $name . $separator;    
    return $chain;    
}

Dann müssen Sie Ihre Permalinks leeren (laden Sie einfach die Seite mit den Einstellungen für Permalinks).

Jetzt sollte hoffentlich alles funktionieren! Erstellen Sie eine Reihe von Taxonomiebegriffen und verschachteln Sie sie richtig. Erstellen Sie dann benutzerdefinierte Posts und kategorisieren Sie sie richtig. Sie können auch eine Seite mit der Schnecke erstellen basename, und alles sollte so funktionieren, wie ich es in meiner Frage angegeben habe. Möglicherweise möchten Sie einige benutzerdefinierte Taxonomie-Archivseiten erstellen, um deren Aussehen zu steuern, und eine Art Taxonomie-Widget- Plugin hinzufügen , um Ihre verschachtelten Kategorien in der Seitenleiste anzuzeigen.

Hoffe das hilft dir!

Jeff
quelle
Behoben - siehe Frage. Jeff, danke für deine Erklärung! Aber können Sie möglicherweise den benutzerdefinierten Build für Posttyp / Taxonomie veröffentlichen? Also kann ich sehen, was ich falsch mache ? Wäre echt dankbar!
Reitze Bos
Hey Jeff, danke für deine Antwort! Nach 4 Stunden Kampf bin ich fast da. Mein einziges Problem ist, dass ich vor dem Post-Namen einen doppelten Schrägstrich bekomme (wie folgt: portfolio / diseno-grafico-2 / logo // alquimia-sonora /) Kannst du mir helfen?
Cmorales
1
@Cmorales, Du bist dir nicht sicher, ob du deinen Code nicht siehst, suchst aber nach einem Ort, an dem du manuell einen Schrägstrich vor deinem Postnamen definierst, wie z. Wenn Sie nicht herausfinden können, wo Sie den zusätzlichen Schrägstrich einfügen, können Sie einfach das letzte Zeichen aus dem zurückgegebenen Wert der Funktion get_taxonomy_parents entfernen, die in filter_post_type_link aufgerufen wird der Doppelgänger. Viel Glück.
Jeff
1
Msgstr "" "Wenn Sie unterschiedliche Ebenen von verschachtelten Begriffen haben, müssen Sie eine Funktion schreiben, um zu überprüfen, ob das letzte URI - Segment ein benutzerdefinierter Beitragstyp oder ein Taxonomiebegriff ist, um zu wissen, welche Regel hinzugefügt werden muss (fragen Sie mich, ob Sie Hilfe benötigen dazu) ... "Können Sie mir bitte helfen? :)
Cmorales
2
^ Genau das habe ich gebraucht. Weiß jemand, wie es geht? siehe meine
frage
2

Schauen Sie sich dieses Plugin an . Es enthält hierarchische URLs für Kategorien, die Sie jedoch problemlos an jede Taxonomie anpassen können.

Die Regelerstellung folgt einer rekursiven Funktion .

vmassuchetto
quelle
2
Dieses Plugin ist nicht mehr verfügbar.
Enkode