Wie kann ich die Archiv- {post_type} .php Theme-Vorlage verwenden?

Ich habe einen benutzerdefinierten Beitragstyp 'has_archive' => true mit 'has_archive' => true . Ich habe eine archive-staff_member.php Vorlage, mit /* Template Name: Staff */

Im Backoffice habe ich, um es dem Navigationsmenü hinzuzufügen, eine Seite erstellt und die Vorlage Mitarbeiter zugewiesen und sie dann dem Hauptmenü hinzugefügt.

Bis hier, alles in Ordnung. Das Problem ist, dass wp_query falsch ist, wenn ich zur Personal-Seite navigiere, auch wenn archive-staff_member.php korrekt geladen ist. Mit anderen Worten, is_post_type_archive() und is_post_type_archive('staff_member') geben false zurück.

Also, was ist das Problem hier?

Für den Moment verwende ich nur eine benutzerdefinierte Abfrage, aber es wäre besser automatisiertes Archiv, wie von offiziellen Dokumenten angegeben.

Und übrigens: Es wäre besser, wenn es eine Möglichkeit gäbe, das Archiv von der Menüseite aus hinzuzufügen, anstatt eine “dumme” Personalseite zu erstellen.

Solutions Collecting From Web of "Wie kann ich die Archiv- {post_type} .php Theme-Vorlage verwenden?"

Benutzerdefinierte Post-Typ-Archivseite benötigt keine “dumme” Seite. In der Tat könnte es den Schuldigen geben. Du solltest das versuchen:

  1. Entfernen /* Template Name: Staff */ aus archive-staff_member.php (nicht benötigt)
  2. Entfernen Sie die “dumme” Seite (falls erstellt). Es könnte einen Permalink-Konflikt geben.
  3. Gehe zu Admin> Einstellungen> Permalinks und speichere es erneut (es wird die Rewrite-Regeln neu generieren)
  4. Geben Sie nun URL ein … yoursite.com/staff_member/ (hängt von der Einstellung in Ihrem register_post_type(...) )

Sie sollten nur “Mitarbeiter” -Posten sehen. Wenn ja, dann ist wp_query korrekt und is_post_type_archive() gibt true zurück. Wenn es auch korrekte Archivvorlage verwendet, sind Sie fertig 🙂 Wenn nicht (vielleicht 404 Fehler?), Dann gibt es einige Fehlkonfigurationen.

Und wenn Sie die URL yoursite.com/staff_member/ haben, können Sie sie als “Benutzerdefinierter Link” zum yoursite.com/staff_member/ hinzufügen. Keine “dumme” Seitenerstellung erforderlich.

Ja, die function is_post_type_archive funktioniert nur in der Datei archive.php Wenn Sie ein Element im Navigationsmenü mit Ihrem staff_member verknüpfen möchten, fügen Sie anstelle einer Seite, deren Vorlage Ihre Datei tempate ist, einen benutzerdefinierten Linkmenüeintrag hinzu. Die URL dieses Elements wird angezeigt, wenn Sie dies vorwegnehmen:

 get_post_type_archive_link('staff_member') 

Um die performance von staff_member anzupassen, verwenden Sie is_post_type_archive (‘staff_member’) in der Datei archives.php des Themes.

Erstellen archive-{post_type}.php einfach ein archive-{post_type}.php wenn Sie einen benutzerdefinierten Beitragstyp erstellen und diese function flush_rewrite_rules(); : flush_rewrite_rules();

Erstellen Sie eine Seite mit Ihrem benutzerdefinierten Post-Typ. Es heißt eine Archivseite.

Ok, eine Antwort an alle. Zuerst, danke für deine Hilfe.

Wie auch immer, keine Ihrer Lösungen befasst sich wirklich mit meinem Problem. Ich mag keine benutzerdefinierten Links in Nav-Menüs überhaupt . Und das ist, weil sie nicht dynamisch sind, können Sie sie nicht dynamisch erstellen. Wenn Sie also die Site verschieben und die URL ändern (zum Beispiel von der Bereitstellung zur Produktion), müssen Sie daran denken, die Links manuell zu ändern . Auch der Kunde, der oft kein Programmierer ist oder zu sehr an Computer / Internet / URLs gewöhnt ist, wird nicht in der Lage sein, es selbst richtig zu verwalten.

EDIT: Ich habe eine Lösung für das obige Problem gefunden, so dass Mareks Antwort zumindest für mich als zuverlässig angesehen werden kann: Wir können die von nav_menu generierten URLs filtern, so dass sie immer die echte Site-URL verwenden:

 function normalize_url($atts){ if( !parse_url($atts['href'], PHP_URL_SCHEME) && $atts['href'] != '#'){ $atts['href'] = site_url() . $atts['href']; } return $atts; } add_filter('nav_menu_link_attributes', 'normalize_url'); //Marek's way will cause wp_nav_menu not to correctly //output parent/child classes, so here's an example of //how to solve this issue too: function fix_nav_classes($classes, $item){ //say I've got some custom links: the 'Projects' parent and a child that //points to '/selected_project/' and I want always these classes for both //parents and child items if(is_post_type_archive('project') || get_post_type() == 'project'){ if($item->post_title == 'Projects') $classes[] = 'current-menu-parent'; if($item->url == '/selected_project/') $classes[] = 'current-menu-item'; } return $classes; } add_filter( 'nav_menu_css_class', 'fix_nav_classes', 10, 2 ); 

ALTE ANTWORT> gut als Alternative:

Das Problem hier ist, dass WordPress die “Seiten” -Natur zuerst betrachtet: Wenn Sie eine benutzerdefinierte Post-Typ-Vorlage (nach Regeln) einer Seite zuweisen, wird das nicht funktionieren. Ich denke, es ist wahrscheinlich eine Permalink-Sache -> Seite hat einen anderen Permalink als das Archiv. Ich denke, ich könnte nur den Permalink der Seite ODER die Rewrite-Regel auf register_post_type ändern, so dass die 2 die gleichen sind, aber das ist auch keine gute Übung.

So, für jetzt, nur dumme Seite und eine “klassische” benutzerdefinierte Abfrage. Für diejenigen, die brauchen, nur das:

 global $wp_query; $query_array = array( 'posts_per_page' => 15, 'post_type' => 'staff_member', 'post_status' => 'publish', 'orderby' => 'menu_order', 'order' => 'ASC' ); $member = $wp_query->query($query_array); 

Ich benutze normalerweise diese Art von Code .. Wenn man wirklich alle wp Zucker braucht, kann er auch die Hauptabfrage ersetzen:

 global $wp_query; $original = $wp_query; // save for restore $wp_query = new WP_Query(); $wp_query->query(array( 'posts_per_page' => 15, 'post_type' => 'staff_member', 'post_status' => 'publish', 'orderby' => 'menu_order', 'order' => 'ASC' ); // here goes processing code and sugars // if(have_posts()): while(have_posts()): the_post(); etc etc.. the_content() etc.. // restore the original $wp_query = $original; 

Einen schönen Tag noch!