El problema
Lo que tiene problemas para comprender es "¿Cómo hago X?" Esta no es una acción de 1 paso, es un proceso de varios pasos y debe separarse.
No necesitas hacer esto:
get all the posts that are a child of X ordered by meta
Usted necesita hacer ésto:
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 solucion general
Entonces, para entender cómo hacerlo infinitamente hasta llegar al final, sin codificarlo, debe comprender las funciones recursivas.
p.ej
function make_zero( $amount ) {
$amount = $amount - 1;
if ( $amount > 1 ){
return make_zero( $amount );
}
return $amount;
}
Aplicando la recursión a este problema para una solución
Entonces tu padre es $parid
, y tu meta de publicación tiene una clave de $metakey
.
Pasemos a una función para agarrar a sus hijos.
$children = get_children_with_meta( $parid, $metakey );
Luego clasificaremos la matriz $ children, las claves serán las ID de publicación y los valores serán los metavalores.
asort($children);
y definamos la función como:
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();
}
}
Esto le brinda una variedad de ID y valores de publicaciones, ordenados de menor a mayor. Puede usar otras funciones de clasificación de PHP para hacerlo de mayor a menor.
¿Qué pasa con los niños de los niños?
En el medio de nuestro bucle, necesitamos hacer una llamada recursiva, pasando el niño en lugar del ID de padre.
Así que esto:
$q->the_post();
$meta_value = get_post_meta(get_the_ID(), $metakey, true );
$children[get_the_ID() ] = $meta_value;
Se convierte en esto:
$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 );
Con esta modificación, la función ahora recupera los hijos, los hijos de los niños, los hijos de los niños ..... etc.
Al final, puede recortar los valores en la matriz para obtener ID como este:
$post_ids = array_keys( $children );
$q = new WP_Query( array( 'post__in' => $post_ids );
// etc
Con esta estrategia, puede reemplazar el valor de la metaclave con cualquier otra métrica, o usar funciones recursivas de otras maneras.
Dado que el código completo requiere solo unos segundos de comprensión básica y una copia rápida de pegar, no insultaré su inteligencia con un bloque de código completo.
Ventajas
- Con la modificación funciona para cualquier tipo de publicación y forma de datos
- Se puede modificar para generar marcado anidado
- Caché fácilmente para acelerar al poner las matrices devueltas en transitorios
- Se puede configurar con paginación aplicando paginación al final WP_Query
Problemas que encontrarás
- No tiene forma de saber cuántos niños hay hasta que los haya encontrado, por lo que los costos de rendimiento no aumentan
- Lo que desea generará muchas consultas y es inherentemente costoso debido a las profundidades potenciales involucradas.
Mi recomendación
Te recomendaría que aplanes la jerarquía de tu página o que uses una taxonomía. Por ejemplo, si está calificando publicaciones, tenga una taxonomía de calificación de página con los términos 1,2,3,4 y 5, etc. Esto le proporcionará una lista de publicaciones lista para usar.
Alternativamente, use los menús de navegación y evite este problema por completo