Dovrai passare in rassegna quei post e quindi fare più query per ogni post, ripetendo fino a quando non trovi nessun post in una query.
per esempio
function get_posts_children($parent_id){
$children = array();
// grab the posts children
$posts = get_posts( array( 'numberposts' => -1, 'post_status' => 'publish', 'post_type' => 'microsite', 'post_parent' => $parent_id, 'suppress_filters' => false ));
// now grab the grand children
foreach( $posts as $child ){
// recursion!! hurrah
$gchildren = get_posts_children($child->ID);
// merge the grand children into the children array
if( !empty($gchildren) ) {
$children = array_merge($children, $gchildren);
}
}
// merge in the direct descendants we found earlier
$children = array_merge($children,$posts);
return $children;
}
// example of using above, lets call it and print out the results
$descendants = get_posts_children($post->ID);
echo '<pre>';
print_r($descendants);
echo '</pre>';
Sì, la funzione precedente si chiama da sola, è una funzione ricorsiva. Continuerà a chiamarsi finché non raggiungerà un punto in cui il post che sta guardando non ha figli, quindi tornerà senza chiamarsi e l'intero stack tornerà indietro costruendo la schiera di bambini. Faresti del bene per fare ulteriori ricerche in questo settore.
Nota che c'è un costo inerente a ciò che vuoi, indipendentemente dal fatto che tu usi o meno funzioni ricorsive, che è legato al numero di post che hai. 5 livelli di post saranno più costosi di 2 e non è un ridimensionamento lineare. È possibile che si desideri utilizzare i transitori per memorizzare nella cache l'output a seconda di come lo si fa.
Un altro modo per ridurre i costi è solo guardando l'albero dei pali un certo numero di livelli, ad esempio nipoti ma non pronipoti. Questo può essere fatto passando un parametro di profondità e decrementandolo ad ogni chiamata ricorsiva, assicurandosi di restituire un array vuoto all'inizio se la profondità è 0 o inferiore. Molti tutorial sulle funzioni ricorsive lo usano come esempio.