it-swarm.com.de

Benutzerdefinierter Beitragstyp mit verschachtelten Taxonomie- und Vorlagendateien

Ich habe einen benutzerdefinierten Beitragstyp "Portfolio" mit einer Überschreibung von portfolio. Die URL im Frontend lautet also: domain.com/portfolio.

Ich habe eine benutzerdefinierte Taxonomie von "Kategorien" mit einer Überschreibung von portfolio/category. Die URL im Frontend lautet also: domain.com/portfolio/category/<term-slug>/

Wenn ich domain.com/portfolio/ besuche, wird die Beitragstypvorlage einwandfrei angezeigt.

Wenn ich domain.com/portfolio/category/<term-slug>/ besuche, wird die Vorlage für Taxonomiebegriffe einwandfrei angezeigt.

Wenn ich jedoch domain.com/portfolio/category/ besuche, funktioniert die Taxonomie-Vorlage nicht. Ich erhalte einen 404-Fehler.

Ich habe sogar getestet, ob der Beitragstyp "post" und die Kerntaxonomie "category" lautet, wobei die Beitragsseite auf "/blog/" gesetzt ist.

Gleiche Sache...

  • domain.com/blog/ Zeigt die Beiträge gut an, die von der Vorlage home.php geliefert werden.
  • domain.com/blog/category/<term-slug>/ Zeigt nur gut an, aus category.php Vorlage geliefert.
  • domain.com/blog/category/ Zeigt den Fehler 404 an.

Eine alternative Route, die ich in der Vergangenheit eingeschlagen habe, besteht darin, eine "Seite" für diese 404-Fehler zu erstellen. So habe ich zum Beispiel /blog/ schon als "Seite" angelegt. Dann würde ich /blog/category/ als eine andere Seite erstellen, so dass ich keinen 404-Fehler erhalte, wenn der Benutzer zu domain.com/blog/category/ navigiert.

Ist das erwartetes Verhalten? Gibt es eine Problemlösung, um keine Seiten für diese "Taxonomie-Archive" erstellen zu müssen?

Wie kann ich eine verschachtelte Taxonomie-URL haben und die Vorlage taxonomy.php oder sogar archive.php verwenden?

1
Michael Ecklund

Taxonomiebedingungen an Beitragstyp-URLs anhängen

Ich glaube, ich habe online eine vorübergehende Lösung aus verschiedenen Quellen gefunden.

Ich würde es lieben, wenn jemand meine Antwort sozusagen "kugelsicherer" macht. Kurzfristig funktioniert diese Lösung jedoch.


Hängen Sie sich in die aktuellen Umschreibregeln ein.

add_action('rewrite_rules_array', 'mbe_rewrite_rules_array', 100);

Fügt unseren bestehenden Umschreiberegeln neue Umschreiberegeln hinzu.

function mbe_rewrite_rules_array($rules){
    $new_rules = mbe_get_new_rewrite_rules();
    return ($new_rules + $rules);
}

Fügen Sie einige neue Umschreiberegeln hinzu ... (In diesem Bereich sind meiner Meinung nach einige Verbesserungen erforderlich - ich bin nicht mit Umschreiberegeln vertraut.)

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 Umschreiberegel sieht WordPress domain.com/portfolio/category/ nicht mehr als 404, sondern als Post Type Archive.

Binden Sie sich in das Vorlagensystem ein, um taxonomy.php beim Anzeigen von domain.com/portfolio/category/ anzuzeigen.

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 jetzt zu domain.com/portfolio/category/ gehen, wird taxonomy.php aus Ihrem derzeit aktiven WordPress-Designverzeichnis geladen.

Also musste ich ein bisschen nachdenken. Während taxonomy.php geladen wird, wird nicht geprüft, ob Informationen zu einer Taxonomie oder zu einem Begriff in der Taxonomie angezeigt werden sollen. Ich habe beschlossen, eine neue Vorlagendatei mit dem Namen term.php zu erstellen, um Verwirrung zu vermeiden.

Binden Sie sich in das Vorlagensystem ein, um term.php beim Anzeigen von domain.com/portfolio/category/<term-slug> anzuzeigen.

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 jetzt zu domain.com/portfolio/category/<term-slug> gehen, wird term.php aus Ihrem derzeit aktiven WordPress-Designverzeichnis geladen.


Fazit

  1. Beim Anzeigen von domain.com/portfolio/ - Standard-Archivvorlagen werden wie gewohnt geladen. (archive.php, archive-posttype.php, etc) aus Ihrem aktuell aktiven WordPress-Theme.
  2. Beim Anzeigen von domain.com/portfolio/category/ - Die taxonomy.php-Vorlagendatei wird aus Ihrem derzeit aktiven WordPress-Design geladen.
  3. Beim Anzeigen von domain.com/portfolio/category/<term-slug> - Die term.php-Vorlagendatei wird aus Ihrem derzeit aktiven WordPress-Design geladen.

Sie können leicht testen, ob dies funktioniert. Sie benötigen lediglich drei Dateien in Ihrem derzeit aktiven WordPress-Designverzeichnis. (archive.php oder archive-posttype.php, taxonomy.php und term.php)

Gib dies in archive.php oder archive-posttype.php ein

$current_post_type = get_query_var('post_type');

echo '<p><strong>Current View:</strong> Post Type</p>'.PHP_EOL;
echo '<p><strong>Current Post Type:</strong> <code>'.$current_post_type.'</code></p>'.PHP_EOL;

Gib das in taxonomy.php ein

$current_post_type = get_query_var('post_type');
$current_taxonomy = get_query_var('taxonomy');

echo '<p><strong>Current View:</strong> Taxonomy</p>'.PHP_EOL;
echo '<p><strong>Current Post Type:</strong> <code>'.$current_post_type.'</code></p>'.PHP_EOL;
echo '<p><strong>Current View:</strong> <code>'.$current_taxonomy.'</code></p>'.PHP_EOL;

Gib das in term.php ein

$current_term = get_queried_object();

echo '<p><strong>Current View:</strong> Term</p>'.PHP_EOL;
echo '<p><strong>Current Term Name:</strong> <code>'.$current_term->name.'</code></p>'.PHP_EOL;
echo '<p><strong>Current Taxonomy:</strong> <code>'.$current_term->taxonomy.'</code></p>'.PHP_EOL;

Bitte springen Sie nicht direkt zu diesem Link. Wenn Sie jedoch die gesamte Frage gelesen und die Antwortlösung akzeptiert haben, sind Sie immer noch verwirrt. Ich habe einen Blogpost etwas ausführlicher geschrieben, der Ihnen vielleicht hilft, es besser zu verstehen.

1
Michael Ecklund

Das wird erwartet und wie Template Hierarchy funktioniert. Ich weiß, dass vor ein paar Jahren ein Trackticket zu diesem Thema erstellt wurde, ob ein Index für Archive im Kern eingeführt werden soll oder nicht. (EDIT: Das Ticket gefunden, hier nachschauen: Ticket Nr. 13816 Es sollten integrierte Indexseiten für Taxonomien vorhanden sein) Diese Idee wurde verworfen und wird im Kern nie aufleuchten . Es wird also immer diese Lücke für eine Archivindexseite in der Vorlagenhierarchie geben

Sie können jedoch mithilfe von Seitenvorlagen eine Indexseite für alle Ihre separaten Archive erstellen. Erstellen Sie beispielsweise eine neue Seite, fügen Sie alles hinzu, was Sie dieser Seite hinzufügen möchten, und weisen Sie ihr eine Menge category zu. Wenn Sie jetzt domain.com/blog/category/ besuchen, wird die von Ihnen erstellte Inhalts-/Indexseite angezeigt.

Abgesehen davon gibt es keine andere Lösung, die ich kenne.

3
Pieter Goosen