Как получить ближайшие вложенные страницы?
Нашел пример как получить все вложенные страницы, но не понимаю как получить ближайшие вложенные страницы.
<?php $id = 123; $config = array( 'post_parent' => $id , 'post_type' => 'page', 'numberposts' => -1, 'post_status' => 'publish' ); $child = get_children($config); if ($child) { foreach ($child as $page) { echo $page->ID; } } else { echo 'Нет дочерних страниц.'; } ?> |
<?php $id = 123; $config = array( 'post_parent' => $id , 'post_type' => 'page', 'numberposts' => -1, 'post_status' => 'publish' ); $child = get_children($config); if ($child) { foreach ($child as $page) { echo $page->ID; } } else { echo 'Нет дочерних страниц.'; } ?>
Дополнительно:
'numberposts' => -1 рекурсивно получает все дочерние страницы указанного родителя, если его не указывать, то вернуться лишь те дочерние страницы, у которых parent_id == id родителя:
<?php $id = 1; $config = [ 'parent' => $id, 'post_type' => 'page', // 'numberposts' => -1, 'post_status' => 'publish', ]; $child = get_pages($config); if($child) { foreach($child as $page) { echo $page->ID; } } else { echo 'У этой страницы нет дочерних страниц.'; } |
<?php $id = 1; $config = [ 'parent' => $id, 'post_type' => 'page', // 'numberposts' => -1, 'post_status' => 'publish', ]; $child = get_pages($config); if($child) { foreach($child as $page) { echo $page->ID; } } else { echo 'У этой страницы нет дочерних страниц.'; }
Ответы:
$config = array(
'post_parent' => $id ,
'post_type' => 'page',
'numberposts' => -1,
'post_status' => 'publish'
);
Вместо 'numberposts' => -1 поствьте к-во записей сколько хотите получить. numberposts(число) - сколько дочерних записей надо получать. -1 — все. По умолчанию стоит -1, тобиш все, что у вас и есть. Вместо -1 поставьте 5 или 10, без минуса. Вот так 'numberposts' => 5, или 'numberposts' => 10,. Что значит получить 5 или 10 стр.
Опишите проблему, и специалист поможет с настройкой, исправлением ошибки или доработкой сайта. Подберём понятный план работ без лишней переписки.
Пока нет других ответов. Будьте первым, кто поможет автору.
Ответить на вопрос

Если нужны только ближайшие дочерние страницы, то есть страницы, у которых
post_parentравен ID текущей страницы, используйтеget_pages()илиWP_Queryбез рекурсивного обхода. В вашем примереpost_parentкак раз выбирает прямых детей.Через
get_pages():$parent_id = 123; $children = get_pages([ 'parent' => $parent_id, 'post_type' => 'page', 'post_status' => 'publish', 'sort_column' => 'menu_order,post_title', 'sort_order' => 'ASC', ]); if ($children) { foreach ($children as $page) { echo '<a href="' . esc_url(get_permalink($page->ID)) . '">'; echo esc_html(get_the_title($page->ID)); echo '</a>'; } }
Через
WP_Query:$q = new WP_Query([ 'post_type' => 'page', 'post_status' => 'publish', 'post_parent' => $parent_id, 'posts_per_page' => -1, 'orderby' => 'menu_order title', 'order' => 'ASC', ]);
Ключевой момент:
post_parentвыбирает именно ближайший уровень. А функции, которые получают “всех потомков”, используют рекурсию илиget_page_children().Если нужно получать дочерние страницы текущей страницы, вместо
123используйтеget_the_ID(). Если код запускается вне цикла, передайте ID явно.В вашем первом примере
numberposts => -1не делает выборку рекурсивной само по себе. Оно просто говорит “вернуть все найденные элементы без ограничения количества”. Рекурсивность появляется, когда используются функции, которые специально обходят всё дерево потомков. Поэтому для ближайших вложенных страниц оставляйтеpost_parentилиparentравным ID родителя.Если потом понадобится вывести дерево в несколько уровней, тогда используйте
wp_list_pages(),get_pages()с последующей группировкой поpost_parentили рекурсивную функцию. Но для задачи “показать только ближайших детей” рекурсия не нужна и даже вредна: она выведет лишние уровни, которые должны оставаться внутри дочерних разделов.