Ich zeige eine einfache Sitemap mit wp_list_pages () an.
$args = array(
'sort_column' => 'menu_order',
'title_li' => '',
'post_status' => 'publish'
);
wp_list_pages( $args );
Das Problem ist, dass standardmäßig auch die veröffentlichten untergeordneten Elemente von Entwurfsseiten angezeigt werden, z. B.:
Seite 1 (veröffentlicht) -> angezeigt
--- Seite 2 (Entwurf) -> nicht angezeigt
------ Seite 3 (veröffentlicht) -> angezeigt
Was ich erreichen möchte, ist:
Seite 1 (veröffentlicht) -> angezeigt
--- Seite 2 (Entwurf) -> nicht angezeigt
------ Seite 3 (veröffentlicht) -> nicht angezeigt
Ich vermute, ein benutzerdefinierter Walker würde den Trick machen, aber ich konnte nie wirklich verstehen, wie diese funktionieren.
Gibt es eine Möglichkeit, diese untergeordneten Seiten auszublenden, ohne sie alle auf Entwurf einstellen zu müssen?
Bearbeiten :
Versuchen wir zur Verdeutlichung einige Bilder. Sie haben also einen Baum mit der vollständigen Hierarchie Ihrer Seiten. Wir klettern auf den Baum. In dem Moment, in dem wir auf einen Entwurfszweig stoßen, schneiden wir ihn ab. Natürlich werden auch alle anderen weiter daran angebrachten Zweige verworfen (egal ob es sich um Entwürfe handelt oder nicht). Ich hoffe das erklärt es besser.
Hier ist ein Beispiel mit einer etwas tiefen Hierarchie:
Seite 1 (veröffentlicht) -> angezeigt
--- Seite 2 (Entwurf) -> nicht angezeigt <- Hier ausschneiden und alle weiteren Kinder ausschließen
------ Seite 3 (veröffentlicht) -> nicht angezeigt
--------- Seite 4 (veröffentlicht) -> nicht angezeigt
------------ Seite 5 (Entwurf) -> nicht angezeigt
--------------- Seite 6 (veröffentlicht) -> nicht angezeigt
quelle
exclude_tree
Parameter noch viel vereinfachen können , um die gesamten Entwurfszweige auszuschließen.exclude_tree
die in Ihrem Update vorgeschlagene Option funktioniert. Was wirklich lustig ist, wenn man bedenkt, wie viel Code zur Beantwortung dieser Frage erstellt wurde. Ich denke, dies sollte die akzeptierte Antwort sein.exclude_tree
tut, ist das, was @ialocin in seinem Code getan hat:get_page_children
innerhalb einer Schleife aufzurufen . Nun diese Funktion [ruft sich rekursiv auf]. ( Developer.wordpress.org/reference/functions/wp_parse_id_list ). Innerhalb einer for-Schleife von möglicherweise Hunderten von Posts. Ergebnis: Für diese Aufgabe sind 8 Zeilen erforderlich, aber es ist möglich, dass ein Dutzend von Hundert-Funktionen aufgerufen werden. Ich habe keinen Zweifel, dass dies der richtige WordPress-Weg ist, aber wie jemand in The Loop sagte: "Niemand macht Dinge auf dieMit freundlichen Grüßen, ich fand benutzerdefinierte Walker ärgerlich: Manchmal erfordert das Codieren einer ganzen Klasse, was mit einem einfachen Filter gemacht werden kann, und wahrscheinlich bin ich es, ich mag Logik hinter WordPress-Walkern nicht wirklich.
Dies ist der Grund , warum ich oft einen Trick , um Filterelemente verwenden , bevor sie ging . Es ist eine wirklich einfache Walker-Klasse:
Dies ist ein wiederverwendbarer Allzweck-Walker, mit dem Elemente gefiltert werden können, bevor sie an einen echten Walker übergeben werden, der im Konstruktor übergeben werden muss.
In Ihrem Fall sollten Sie Folgendes tun:
Jetzt können Sie einen Filterrückruf codieren, um Seiten mit einem
'filterable_walker_elements'
von derFilterableWalker
Klasse ausgelösten Hook zu filtern :quelle
Die Verwendung eines Brauchs
Walker
ist eigentlich gar nicht so schwer, es geht im Grunde so:Erstellen Sie eine Klasse .
Durch die Erweiterung eines anderen;
So was:
Dies gibt Ihnen die Möglichkeit, die Methoden oder Funktionen der erweiterten Basisklasse zu ändern / zu erweitern. Zusätzlich können / könnten Sie erweitern, indem Sie der erweiterten Klasse Methoden oder Variablen hinzufügen.
Kommen wir also zurück zu WordPress und
wp_list_pages()
. Die Klasse, die wir erweitern möchten, um sie zu verwendenwp_list_pages()
, dieWalker_Page
Klasse - Quelle - selbst, wurde durch Erweitern der KlasseWalker
- Quelle abgeleitet .Nach dem oben erläuterten Schema werden wir dasselbe tun:
Jetzt
Walker_Page
hat zwei Variablen -$tree_type
und$db_fields
- und vier Methoden -start_lvl()
,end_lvl()
,start_el()
undend_el()
. Die Variablen werden uns nicht betreffen, in Bezug auf die Methoden , die wir zumindest haben einen genaueren Blick auf ,start_el()
undend_el()
.Das erste, was zu sehen ist, ist, dass diese beiden Methoden den Parameter haben
$page
:Welches alle relevanten Daten enthält, die wir brauchen, wie das
post_parent
, und so ziemlich einWP_Post
/$post
/ "$page
" Objekt ist. Durch dieget_pages()
Rückgabe zurückgegebeninnerhalb der
wp_list_pages()
Funktion.Was wir überprüfen müssen, ist der Post-Status der aktuellen übergeordneten Seite. Dazu steht die Funktion
get_post_status()
zur Verfügung. Wie bestimmt können wir das dafür verfügbare $ page-Objekt verwenden.Jetzt können wir dies verwenden, um den Status der übergeordneten Seite der Stromseite zu überprüfen:
Implementieren wir es in unserer erweiterten Walker-Klasse:
Die neue Klasse kann folgendermaßen verwendet werden
wp_list_pages()
:Bearbeiten:
Fügen Sie dies aus Gründen der Vollständigkeit hinzu, damit dies für Bäume funktioniert, für alle Nachkommen, nicht nur für Kinder. Es ist jedoch nicht der optimale Weg , es wurden genug andere Vorschläge gemacht.
Da WordPress
get_ancestors()
undget_post_ancestors()
Funktionen nicht dazu gemacht sind, Entwürfe zu erhalten, habe ich eine Funktion erstellt, um jeden Vorfahren zu erhalten:Zusätzlich ist es notwendig, den Status dieser Vorfahren zu erhalten. Was mit der folgenden Funktion gemacht werden kann:
Dies kann verwendet werden, um die oben erläuterte Bedingung zu ersetzen:
quelle
get_post_status
das für jedes Element aufgerufene Element eine DB-Abfrage auslöst. Und eine DB-Abfrage für jede Seite ist keine gute Sache, wenn es viele Seiten gibt ...Diese Antwort bietet eine andere Möglichkeit, dies zu tun. Der Code ist ziemlich selbsterklärend, ich habe alles ziemlich wörtlich genannt, um es besser verständlich zu machen. Was ich getan habe, ist eine Funktion zu konstruieren, die die Entwurfsseiten und ihre Nachkommen bestimmt, die dann mit dem
exclude
Parameter von verwendet werden könnenwp_list_pages()
.Hilfsfunktion:
Verwendungszweck:
Wenn Sie eine PHP-Version kleiner als 5.3 verwenden, benötigen Sie eine Version ohne Schließungen. Um es klar zu sagen, in meinem Buch ist es ein Fehler, etwas unter 5.4 zu bearbeiten. Aber ich bin mir der WordPress-Anforderungen, PHP 5.2.4, sehr gut bewusst.
quelle