Le problème
Ce que vous rencontrez des problèmes à saisir est "Comment faire X?" Ce n'est pas une action en une étape, c'est un processus en plusieurs étapes, et il doit être séparé.
Vous n'avez pas besoin de faire ceci:
get all the posts that are a child of X ordered by meta
Vous devez faire ceci:
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
La solution générale
Donc, pour comprendre comment le faire à l'infini jusqu'à la fin, sans le coder en dur, vous devez comprendre les fonctions récursives.
par exemple
function make_zero( $amount ) {
$amount = $amount - 1;
if ( $amount > 1 ){
return make_zero( $amount );
}
return $amount;
}
Application de la récursivité à ce problème pour une solution
Donc, votre parent est $parid
, et votre méta-message a une clé de $metakey
.
Permet de le passer dans une fonction pour saisir ses enfants.
$children = get_children_with_meta( $parid, $metakey );
Ensuite, nous trierons le tableau $ children, les clés seront les ID de publication et les valeurs seront les méta-valeurs.
asort($children);
et permet de définir la fonction comme:
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();
}
}
Cela vous donne un tableau d'ID et de valeurs de publication, classés du plus bas au plus élevé. Vous pouvez utiliser d'autres fonctions de tri PHP pour le faire du plus élevé au plus bas.
Qu'en est-il maintenant des enfants pour enfants?
Au milieu de notre boucle, nous devons effectuer un appel récursif, en passant l'enfant plutôt que l'ID parent.
Donc ça:
$q->the_post();
$meta_value = get_post_meta(get_the_ID(), $metakey, true );
$children[get_the_ID() ] = $meta_value;
Devient ceci:
$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 );
Avec cette modification, la fonction récupère maintenant les enfants, les enfants enfants, les enfants enfants enfants ..... etc
À la fin, vous pouvez couper les valeurs du tableau pour obtenir des ID comme celui-ci:
$post_ids = array_keys( $children );
$q = new WP_Query( array( 'post__in' => $post_ids );
// etc
En utilisant cette stratégie, vous pouvez remplacer la valeur de la méta-clé par toute autre métrique ou utiliser les fonctions récursives de différentes manières.
Étant donné que le code complet ne nécessite que quelques secondes de compréhension de base et un copier-coller rapide, je ne vais pas insulter votre intelligence avec un bloc de code copier-coller complet.
Les avantages
- Avec modification fonctionne pour tout type de publication et forme de données
- Peut être modifié pour générer un balisage imbriqué
- Cachez facilement pour accélérer en mettant les tableaux retournés en transitoires
- Peut être configuré avec la pagination en appliquant la pagination à la fin WP_Query
Problèmes que vous rencontrerez
- Vous n'avez aucun moyen de savoir combien il y a d'enfants jusqu'à ce que vous les ayez trouvés, donc les coûts de performance n'augmentent pas
- Ce que vous voulez va générer beaucoup de requêtes et est intrinsèquement coûteux en raison des profondeurs potentielles impliquées.
Ma recommandation
Je vous recommande soit d'aplatir votre hiérarchie de pages, soit d'utiliser une taxonomie à la place. Par exemple, si vous évaluez des publications, ayez une taxonomie de classification des pages avec les termes 1, 2, 3, 4 et 5, etc. Cela vous fournira une liste de publications prête à l'emploi.
Vous pouvez également utiliser les menus de navigation et contourner complètement ce problème