Das Problem
Was Sie Probleme beim Erfassen haben, ist "Wie mache ich X?" Dies ist keine 1-Schritt-Aktion, sondern ein mehrstufiger Prozess, der getrennt werden muss.
Das brauchen Sie nicht zu tun:
get all the posts that are a child of X ordered by meta
Sie müssen dies tun:
get all the posts that are a child of X
for each child, get all the posts that are a child
foreach child of that child get all the posts that are a child
...
hmmm we don't have any more children left
Take our list of posts and order them by meta
Die allgemeine Lösung
Um zu verstehen, wie man es unendlich macht, bis man das Ende erreicht, ohne es hart zu codieren, muss man rekursive Funktionen verstehen.
z.B
function make_zero( $amount ) {
$amount = $amount - 1;
if ( $amount > 1 ){
return make_zero( $amount );
}
return $amount;
}
Rekursion auf dieses Problem anwenden Für eine Lösung
Also ist dein Elternteil $parid
und dein Post-Meta hat einen Schlüssel von $metakey
.
Lasst es uns in eine Funktion umwandeln, um seine Kinder zu fassen.
$children = get_children_with_meta( $parid, $metakey );
Dann sortieren wir das Array $ children, die Schlüssel sind die Post-IDs und die Werte sind die Meta-Werte.
asort($children);
und lassen Sie uns die Funktion definieren als:
function get_children_with_meta( $parent_id, $metakey ) {
$q = new WP_Query( array( 'post_parent' => $parent_id, 'meta_key' => $metakey ));
if ( $q->have_posts() ) {
$children - array();
while ( $q->have_posts() ) {
$q->the_post();
$meta_value = get_post_meta(get_the_ID(), $metakey, true );
$children[get_the_ID() ] = $meta_value;
}
return $children;
} else {
// there are no children!!
return array();
}
}
Auf diese Weise erhalten Sie eine Reihe von Beitrags-IDs und Werten, die von der niedrigsten zur höchsten geordnet sind. Sie können andere PHP-Sortierfunktionen verwenden, um von der höchsten zur niedrigsten zu gelangen.
Was ist nun mit den Kindern der Kinder?
In der Mitte unserer Schleife müssen wir einen rekursiven Anruf tätigen und das untergeordnete Element anstelle der übergeordneten ID übergeben.
Also das:
$q->the_post();
$meta_value = get_post_meta(get_the_ID(), $metakey, true );
$children[get_the_ID() ] = $meta_value;
Wird dies:
$q->the_post();
$meta_value = get_post_meta(get_the_ID(), $metakey, true );
$children[get_the_ID() ] = $meta_value;
// now get the childrens children
$grandchildren = get_children_with_meta( get_the_ID(), $metakey );
// merge the grandchildren and the children into the same list
$children = array_merge( $children, $grandchildren );
Mit dieser Änderung ruft die Funktion jetzt die Kinder, die Kinder der Kinder, die Kinder der Kinder ..... etc. ab
Am Ende können Sie die Werte im Array abschneiden, um die folgenden IDs zu erhalten:
$post_ids = array_keys( $children );
$q = new WP_Query( array( 'post__in' => $post_ids );
// etc
Mit dieser Strategie können Sie den Metaschlüsselwert durch eine beliebige andere Metrik ersetzen oder rekursive Funktionen auf andere Weise verwenden.
Da der vollständige Code nur ein paar Sekunden Grundkenntnis und schnelles Einfügen von Texten erfordert, beleidige ich Ihre Intelligenz nicht mit einem Codeblock zum vollständigen Einfügen von Texten.
Vorteile
- Mit Modifikation funktioniert für jeden Beitragstyp und jede Datenform
- Kann geändert werden, um verschachtelte Markups zu generieren
- Einfacher Cache zur Beschleunigung, indem die zurückgegebenen Arrays in Transienten versetzt werden
- Kann mit Paging eingerichtet werden, indem Paging auf das Ende von WP_Query angewendet wird
Probleme, auf die Sie stoßen werden
- Sie können nicht wissen, wie viele Kinder es gibt, bis Sie sie gefunden haben, sodass die Leistungskosten nicht ansteigen
- Was Sie wollen, wird eine Menge von Abfragen erzeugen und ist aufgrund der möglichen Tiefen, die damit verbunden sind, von Natur aus kostspielig.
Meine Empfehlung
Ich würde Ihnen empfehlen, entweder Ihre Seitenhierarchie zu reduzieren oder stattdessen eine Taxonomie zu verwenden. Wenn Sie beispielsweise Posts bewerten, haben Sie eine Seitenbewertungstaxonomie mit den Begriffen 1,2,3,4 und 5 usw. Dadurch erhalten Sie eine sofort einsatzbereite Postauflistung.
Verwenden Sie alternativ die Navigationsmenüs und umgehen Sie dieses Problem vollständig