El problema
Lo que estás teniendo problemas para entender es "¿Cómo hago X?" Esto no es una acción de 1 paso, es un proceso de varios pasos y debe ser separado.
No necesitas hacer esto:
get all the posts that are a child of X ordered by meta
Necesitas hacer esto:
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 solución general
Entonces, para entender cómo hacerlo infinitamente hasta que llegues al final, sin codificarlo, necesitas entender las funciones recursivas.
por ejemplo
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 meta tiene una clave de $metakey
.
Permite pasarlo a una función para capturar a sus hijos.
$children = get_children_with_meta( $parid, $metakey );
Luego, ordenaremos la matriz $ children, las claves serán las ID de publicación y los valores serán los valores meta.
asort($children);
y permite definir 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 da una serie de ID y valores de publicación, ordenados de menor a mayor. Puedes usar otras funciones de clasificación de PHP para hacerlo de mayor a menor.
Ahora, ¿qué pasa con los niños de los niños?
En el medio de nuestro bucle, necesitamos hacer una llamada recursiva, pasando el hijo en lugar de la identificación del padre.
Entonces 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 a los niños, a los niños de los niños, a los niños de los niños de los niños ..... etc.
Al final, puedes recortar los valores de la matriz para obtener ID de esta manera:
$post_ids = array_keys( $children );
$q = new WP_Query( array( 'post__in' => $post_ids );
// etc
Usando esta estrategia, puede reemplazar el valor de la clave de metaclave con cualquier otra métrica, o usar funciones recursivas de otras maneras.
Dado que el código completo requiere solo unos pocos segundos de comprensión básica y una copia de pegado rápida, no voy a insultar tu inteligencia con un bloque de código de pegado de copia completo.
Ventajas
- Con trabajos de modificación para cualquier tipo de publicación y forma de datos
- Se puede modificar para generar un marcado anidado
- Caché fácilmente para acelerar al poner los arreglos devueltos en transitorios
- Se puede configurar con la paginación aplicando la paginación al final WP_Query
Problemas que encontrarás
- No tiene forma de saber cuántos hijos hay hasta que los haya encontrado, por lo que los costos de rendimiento no se escalan
- Lo que desea generará muchas consultas y es inherentemente costoso debido a las profundidades potenciales involucradas.
Mi recomendación
Recomendaría que alise la jerarquía de su página o use una taxonomía en su lugar. P.ej. si está calificando publicaciones, tenga una taxonomía de Clasificación de página con los términos 1,2,3,4 y 5, etc. Esto le proporcionará una lista de publicaciones fuera de la caja.
Alternativamente, use los menús de navegación y evite este problema por completo