Il problema
Quello che stai riscontrando problemi nella comprensione è "Come posso fare X?" Questa non è un'azione in 1 passaggio, è un processo a più fasi e deve essere suddiviso.
Non è necessario farlo:
get all the posts that are a child of X ordered by meta
Devi fare questo:
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 soluzione generale
Quindi, per capire come farlo all'infinito fino a raggiungere la fine, senza codificarlo, è necessario comprendere le funzioni ricorsive.
per esempio
function make_zero( $amount ) {
$amount = $amount - 1;
if ( $amount > 1 ){
return make_zero( $amount );
}
return $amount;
}
Applicazione della ricorsione a questo problema per una soluzione
Quindi lo è il tuo genitore $parid
e il tuo meta post ha una chiave di $metakey
.
Passiamo a una funzione per afferrare i suoi figli.
$children = get_children_with_meta( $parid, $metakey );
Quindi ordineremo l'array $ children, le chiavi saranno gli ID dei post e i valori saranno i meta-valori.
asort($children);
e definiamo la funzione come:
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();
}
}
Questo ti dà una serie di ID post e valori, ordinati dal più basso al più alto. Puoi usare altre funzioni di ordinamento PHP per farlo dal più alto al più basso.
Ora che dire dei bambini?
Nel mezzo del nostro ciclo, dobbiamo effettuare una chiamata ricorsiva, passando il figlio anziché l'ID genitore.
Così questo:
$q->the_post();
$meta_value = get_post_meta(get_the_ID(), $metakey, true );
$children[get_the_ID() ] = $meta_value;
Diventa questo:
$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 questa modifica la funzione ora recupera i bambini, i bambini dei bambini, i bambini dei bambini ..... ecc
Alla fine è possibile tagliare i valori sull'array per ottenere ID come questo:
$post_ids = array_keys( $children );
$q = new WP_Query( array( 'post__in' => $post_ids );
// etc
Utilizzando questa strategia è possibile sostituire il valore della meta chiave con qualsiasi altra metrica o utilizzare le funzioni ricorsive in altri modi.
Dal momento che il codice completo richiede solo pochi secondi di comprensione di base e una copia rapida incolla, non insulterò la tua intelligenza con un blocco completo di codice copia incolla.
vantaggi
- Con la modifica funziona per qualsiasi tipo di post e forma di dati
- Può essere modificato per generare markup nidificato
- Facilmente cache per accelerare mettendo gli array restituiti in transitori
- Può essere impostato con il paging applicando il paging alla fine WP_Query
Problemi che incontrerai
- Non hai modo di sapere quanti bambini ci sono fino a quando non li hai trovati, quindi i costi delle prestazioni non aumentano
- Ciò che desideri genererà molte query ed è intrinsecamente costoso a causa delle potenziali profondità coinvolte.
La mia raccomandazione
Ti consiglierei di appiattire la gerarchia di pagine o utilizzare invece una tassonomia. Ad esempio, se stai valutando post, hai una tassonomia di Page Rating con i termini 1,2,3,4 e 5 ecc. Questo ti fornirà un elenco di post pronto all'uso.
In alternativa, utilizzare i menu di navigazione e aggirare completamente questo problema