Вам нужно будет зациклить эти сообщения, а затем делать больше запросов для каждого сообщения, повторяя до тех пор, пока вы не найдете ни одного сообщения в запросе.
например
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>';
Да, вышеупомянутая функция вызывает себя, это рекурсивная функция. Он будет продолжать вызывать себя до тех пор, пока не достигнет точки, в которой у просматриваемой записи не будет дочерних элементов, затем он вернется без вызова самого себя, и весь стек будет пузыриться обратно, создавая массив дочерних элементов. Вы были бы полезны для дальнейших исследований в этой области.
Обратите внимание, что то, что вы хотите, связано с тем, что вы хотите, независимо от того, используете ли вы рекурсивные функции или нет, это зависит от того, сколько уровней постов у вас есть. 5 уровней сообщений будут стоить больше, чем 2, и это не линейное масштабирование. Вы можете использовать переходные процессы для кэширования вашего вывода в зависимости от того, как вы это делаете.
Еще один способ снизить стоимость - это просто смотреть вниз по дереву постов на определенное количество уровней, например, внуков, но не правнуков. Это можно сделать, передав параметр глубины и уменьшая его при каждом рекурсивном вызове, обязательно возвращая пустой массив в начале, если глубина равна 0 или ниже. Многие учебники по рекурсивным функциям используют это в качестве примера.
Просто используйте
get_page_children()
. Он работает для каждого типа поста (не только для страниц) и в основном то, что @TomJNowell показал в другом вопросе, но уже реализовано ядром.Выше образец как в Кодексе. Вот почему вы можете просто взять глобальный объект запроса (или любой другой объект запроса) для использования в качестве базы поиска.
источник
Используйте следующий шорткод для отображения всех детей и внуков в иерархическом представлении. Использование: [my_children_list] или [my_children_list page_id = 123]
источник