Как получить ближайшие вложенные страницы?

Ссылка скопирована
PHP
1 ответ

Нашел пример как получить все вложенные страницы, но не понимаю как получить ближайшие вложенные страницы.

<?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 стр.

Нужно решить такую задачу?

Опишите проблему, и специалист поможет с настройкой, исправлением ошибки или доработкой сайта. Подберём понятный план работ без лишней переписки.

Заказать помощь
Лучший ответ
1
Антон С. Ответ

Если нужны только ближайшие дочерние страницы, то есть страницы, у которых 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>';
    }
}

$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',
]);

$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 или рекурсивную функцию. Но для задачи “показать только ближайших детей” рекурсия не нужна и даже вредна: она выведет лишние уровни, которые должны оставаться внутри дочерних разделов.

Другие ответы (0)

Пока нет других ответов. Будьте первым, кто поможет автору.

Ответить на вопрос

комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *

Вам также может быть интересно