Benutzerdefinierter Beitragstyp mit geschachtelten Taxonomie- und Vorlagendateien

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?

Solutions Collecting From Web of "Benutzerdefinierter Beitragstyp mit geschachtelten Taxonomie- und Vorlagendateien"

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.

Anhängen von Taxonomie-Bedingungen an Post-Typ-URLs

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 .


Fazit

  1. Bei der Anzeige von domain.com/portfolio/ – Standard- domain.com/portfolio/ werden wie gewohnt geladen. ( archive.php , archive-posttype.php , usw.) von Ihrem gerade aktiven WordPress Theme.
  2. Wenn Sie domain.com/portfolio/category/ die taxonomy.php Vorlagendatei von Ihrem derzeit aktiven WordPress-Theme geladen.
  3. Wenn Sie 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.