Ich habe einen benutzerdefinierten Post-Typ von “Portfolio” mit einem Neuschreiben von portfolio
. Die URL am Frontend lautet also: domain.com/portfolio
.
Ich habe eine benutzerdefinierte Taxonomie von “Categories” mit einem Neuschreiben von portfolio/category
. Die URL am Frontend lautet also: domain.com/portfolio/category//
Wenn ich domain.com/portfolio/
die Vorlage ” domain.com/portfolio/
einfach angezeigt.
Wenn ich domain.com/portfolio/category//
besuche, domain.com/portfolio/category//
die Taxonomie-Term-Vorlage domain.com/portfolio/category//
.
Wenn ich jedoch: domain.com/portfolio/category/
besuche, domain.com/portfolio/category/
die Taxonomie-Vorlage nicht. Ich bekomme einen 404 Fehler.
Ich habe sogar auf Core Post Type: post
und Core Taxonomy: category
getestet, wobei die Posts-Seite auf /blog/
.
Gleiche Sache…
domain.com/blog/
Zeigt Posts in Ordnung, serviert von home.php
Vorlage. domain.com/blog/category//
Zeigt nur gut an, serviert von category.php
Vorlage. domain.com/blog/category/
Zeigt Fehler 404 an. Eine alternative Route, die ich in der Vergangenheit unternommen habe, ist eine “Seite” für diese 404-Fehler zu erstellen. So habe ich zum Beispiel /blog/
schon als “Seite” erstellt. Dann würde ich /blog/category/
als eine andere Seite erstellen, so dass ich keinen 404-Fehler bekommen würde, wenn der Benutzer zu: domain.com/blog/category/
navigiert domain.com/blog/category/
.
Ist das erwartetes Verhalten? Gibt es eine Arbeit, um keine Seiten für diese “Taxonomy Archives” zu erstellen?
Wie kann ich eine verschachtelte Taxonomie URL haben und die taxonomy.php
oder sogar die archive.php
Vorlage funktionieren lassen?
Das wird erwartet und wie die Template-Hierarchie funktioniert. Ich weiß, dass es vor ein paar Jahren ein Track-Ticket bezüglich dieses Problems gab, wenn ein Index für Archive im core eingeführt werden sollte oder nicht. ( BEARBEITEN: Finde das Ticket, schau es dir hier an: Ticket # 13816 Es sollte eingebaute Indexseiten für Taxonomien geben ) Diese Idee wurde verschrottet und wird niemals Licht im core sehen. Daher wird es immer eine Lücke für eine Archivindexseite in der Vorlagenhierarchie geben
Sie können jedoch eine Indexseite für alle Ihre separaten Archive mit Hilfe von Seitenvorlagen erstellen. Erstellen Sie beispielsweise eine neue Seite, fügen Sie alles hinzu, was Sie zu dieser Seite hinzufügen möchten, und weisen Sie ihr eine category
. Wenn Sie domain.com/blog/category/
besuchen, sehen Sie die von Ihnen erstellte Inhalts- / Indexseite.
Abgesehen davon gibt es keine andere Lösung, die ich kenne.
Ich glaube, ich habe eine zufällige Lösung aus verschiedenen Quellen online gefunden.
Ich würde gerne jemanden auf meine Antwort erweitern, um es sozusagen “kugelsicher” zu machen. Auf kurze Sicht funktioniert diese Lösung jedoch.
Haken Sie sich in die aktuellen Rewrite-Regeln ein.
add_action('rewrite_rules_array', 'mbe_rewrite_rules_array', 100);
Fügt unseren bestehenden Rewrite-Regeln neue Rewrite-Regeln hinzu.
function mbe_rewrite_rules_array($rules){ $new_rules = mbe_get_new_rewrite_rules(); return ($new_rules + $rules); }
Fügen Sie einige neue Rewrite-Regeln hinzu … (Dieser Bereich ist meiner Meinung nach verbesserungsbedürftig – ich habe keine Ahnung von Rewrite-Regeln.)
function mbe_get_new_rewrite_rules(){ $post_type = 'mbe-portfolio'; $post_type_slug = 'portfolio'; $taxonomy = 'mbe-portfolio-categories'; $taxonomy_slug = 'category'; $slug = $post_type_slug.'/'.$taxonomy_slug; return array( "{$slug}/?$" => "index.php?post_type={$post_type}&taxonomy={$taxonomy}" ); }
Durch das Hinzufügen der neuen Rewrite-Regel sieht WordPress domain.com/portfolio/category/
nicht mehr als 404, sondern als Post-Type-Archiv.
domain.com/portfolio/category/
das Vorlagensystem, um taxonomy.php
beim Anzeigen von domain.com/portfolio/category/
add_filter('archive_template', 'mbe_taxonomy_template');
function mbe_taxonomy_template($template){ $templates = array(); $post_type = 'mbe-portfolio'; $taxonomy = 'mbe-portfolio-categories'; if(get_query_var('post_type') == $post_type && !get_query_var('taxonomy')){ return $template; } if(get_query_var('post_type') == $post_type && get_query_var('taxonomy') == $taxonomy){ $templates[] = 'taxonomy.php'; } $templates[] = $template; return locate_template($templates); }
Wenn Sie nun zu domain.com/portfolio/category/
gehen, domain.com/portfolio/category/
taxonomy.php
aus Ihrem aktuellen WordPress-Themenverzeichnis domain.com/portfolio/category/
.
Also musste ich ein bisschen nachdenken. Während taxonomy.php
geladen ist, anstatt zu prüfen, ob wir Informationen über eine Taxonomie oder Informationen über einen Begriff in der Taxonomie anzeigen sollten. Ich habe mich entschieden, eine neue Vorlagendatei namens term.php
zu term.php
, um die Verwirrung zu vermeiden.
term.php
das Vorlagensystem, um term.php
anzuzeigen, wenn Sie domain.com/portfolio/category/
anzeigen
add_filter('taxonomy_template', 'mbe_term_template');
function mbe_term_template($template){ $templates = array(); $queried_object = get_queried_object(); if(property_exists($queried_object, 'term_id')){ $templates[] = 'term.php'; } $templates[] = $template; return locate_template($templates); }
Wenn Sie nun zu domain.com/portfolio/category/
gehen, wird die domain.com/portfolio/category/
term.php
aus Ihrem aktiven WordPress-Themenverzeichnis term.php
.
domain.com/portfolio/
– Standard- domain.com/portfolio/
werden wie gewohnt geladen. ( archive.php
, archive-posttype.php
, usw.) von Ihrem gerade aktiven WordPress Theme. domain.com/portfolio/category/
die taxonomy.php
Vorlagendatei von Ihrem derzeit aktiven WordPress-Theme geladen. domain.com/portfolio/category/
term.php
– Die Datei term.php
wird von Ihrem derzeit aktiven WordPress-Theme geladen. Sie können leicht testen, ob das funktioniert. Sie benötigen nur drei Dateien in Ihrem gerade aktiven WordPress-Themenverzeichnis. ( archive.php
oder archive-posttype.php
, taxonomy.php
und term.php
)
Setzen Sie dies in archive.php
oder archive-posttype.php
$current_post_type = get_query_var('post_type'); echo 'Current View: Post Type
'.PHP_EOL; echo 'Current Post Type: '.$current_post_type.'
'.PHP_EOL;
Setzen Sie dies in taxonomy.php
$current_post_type = get_query_var('post_type'); $current_taxonomy = get_query_var('taxonomy'); echo 'Current View: Taxonomy
'.PHP_EOL; echo 'Current Post Type: '.$current_post_type.'
'.PHP_EOL; echo 'Current View: '.$current_taxonomy.'
'.PHP_EOL;
Setzen Sie dies in term.php
$current_term = get_queried_object(); echo 'Current View: Term
'.PHP_EOL; echo 'Current Term Name: '.$current_term->name.'
'.PHP_EOL; echo 'Current Taxonomy: '.$current_term->taxonomy.'
'.PHP_EOL;
Bitte springe nicht direkt zu diesem Link. Wenn Sie jedoch die gesamte Frage und die angenommene Antwortlösung gelesen haben, und Sie immer noch verwirrt sind. Ich habe etwas detailliertere Blogbeiträge geschrieben, die Ihnen helfen könnten, besser zu verstehen.