it-swarm.com.de

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

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 'rewrite' => array( 'slug' => 'tax-name', 'with_front' => true, 'hierarchical' => true ), verwenden müssen, um hierarchische Slugs zu erhalten, was auf den Archivseiten gut funktioniert, aber die benutzerdefinierten Beiträge vom Typ post werden 404 angezeigt. Wenn ich den Teil 'hierarchical' => true entferne, funktionieren die Beiträge, 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.

53
Jeff

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 Beitrag und dieser hat mir geholfen, also danke an diese Jungs.

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

Achten Sie beim Definieren Ihrer benutzerdefinierten Beitragstypen und Taxonomien zuerst darauf, dass Ihre Slugs richtig sind: Für den benutzerdefinierten Beitragstyp sollte basename/%taxonomy_name% und für Ihre Taxonomie sollte der Slug nur basename lauten. Vergessen Sie nicht, auch 'hierarchical' => true zum Taxonomie-Umschreibearray hinzuzufügen, um verschachtelte Begriffe in Ihrer URL zu erhalten. Stellen Sie außerdem sicher, dass query_var in beiden Fällen auf true 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 %taxonomy_name% in Ihrer benutzerdefinierten Slug-Struktur für das Umschreiben von Posts verarbeiten kann:

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 basierend auf Wordpress's eigenem get_category_parents erstellt:

// 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 basename erstellen, 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!

68
Jeff

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 .

2
vmassuchetto