O problema
O que você está tendo problemas para entender é "Como eu faço o X?" Esta não é uma ação de uma etapa, é um processo de várias etapas e precisa ser dividido.
Você não precisa fazer isso:
get all the posts that are a child of X ordered by meta
Você precisa fazer isso:
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
A solução geral
Portanto, para entender como fazê-lo infinitamente até chegar ao fim, sem codificá-lo, você precisa entender as funções recursivas.
por exemplo
function make_zero( $amount ) {
$amount = $amount - 1;
if ( $amount > 1 ){
return make_zero( $amount );
}
return $amount;
}
Aplicando recursão a este problema para uma solução
Portanto, seu pai é $parid
e sua meta meta tem uma chave de $metakey
.
Vamos passar para uma função de agarrar seus filhos.
$children = get_children_with_meta( $parid, $metakey );
Em seguida, classificaremos o array $ children, as chaves serão os IDs das postagens e os valores serão os meta-valores.
asort($children);
e vamos definir a função 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();
}
}
Isso fornece uma variedade de IDs e valores de postagem, ordenados do menor para o maior. Você pode usar outras funções de classificação PHP para fazer isso do maior para o menor.
Agora, e os filhos das crianças?
No meio do nosso loop, precisamos fazer uma chamada recursiva, passando o filho em vez do ID pai.
Então, é isso:
$q->the_post();
$meta_value = get_post_meta(get_the_ID(), $metakey, true );
$children[get_the_ID() ] = $meta_value;
Torna-se isso:
$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 );
Com esta modificação, a função agora recupera os filhos, os filhos das crianças, os filhos das crianças ..... etc
No final, você pode aparar os valores na matriz para obter IDs como este:
$post_ids = array_keys( $children );
$q = new WP_Query( array( 'post__in' => $post_ids );
// etc
Usando essa estratégia, você pode substituir o valor da meta-chave por qualquer outra métrica ou usar funções recursivas de outras maneiras.
Como o código completo requer apenas alguns segundos de compreensão básica e uma colagem de cópia rápida, não insultarei sua inteligência com um bloco de código de colagem de cópia completa.
Vantagens
- Com a modificação funciona para qualquer tipo de post e forma de dados
- Pode ser modificado para gerar marcação aninhada
- Faça cache facilmente para acelerar, colocando as matrizes retornadas em transientes
- Pode ser configurado com paginação aplicando paginação no final WP_Query
Problemas que você encontrará
- Você não tem como saber quantas crianças existem até encontrá-las, para que os custos de desempenho não aumentem
- O que você deseja gerará muitas consultas e é inerentemente caro devido às possíveis profundidades envolvidas.
Minha recomendação
Eu recomendo que você aplique a hierarquia da página ou use uma taxonomia. Por exemplo, se você está classificando postagens, tenha uma taxonomia de classificação de página com os termos 1,2,3,4 e 5 etc. Isso fornecerá uma listagem de post pronta para uso.
Como alternativa, use os menus de navegação e ignore esse problema completamente