Показывать только один уровень дочерних страниц, страницы списка wp горе
Я работаю над сайтом, который имеет довольно большую структуру страниц на несколько уровней в глубину - в некоторых разделах много страниц.
Базовая настройка примерно такая...
Parent Parent Parent -Child -Child --Grandchild --Grandchild --Grandchild ---GreatGrandchild -Child -Child --Grandchild --Grandchild --Grandchild ---GreatGrandchild -Child Parent -Child Parent Parent -Child -Child --Grandchild ---GreatGrandchild --Grandchild
Вы понимаете картину - просто представьте себе гораздо больше страниц!
Мое обычное решение подменю нормально работает (взято прямо из Кодекса), потому что я работаю на гораздо меньших сайтах. Этот сайт приводит к огромному длинному меню, которое слишком велико, чтобы быть полезный.
Что я хотел бы сделать, так это просто показать уровень непосредственно под просматриваемой в данный момент страницей. В основном, меню "В этом разделе...".
Независимо от того, какую комбинацию фрагментов wp_list_pages я нашел, я смог получить только все или ничего.
Кроме того, поскольку в некоторых разделах нет детей, необходимо просто показывать ссылки верхнего уровня, когда детей нет.
Надеюсь, это имеет смысл - я рвал мои волосы весь день торчат из-за этого! Любая помощь будет очень признательна!
РЕДАКТИРОВАТЬ
Хорошо, я объявлю об этом здесь. Извините за то, что я нуб!
Огромное спасибо @chip-bennet за то, что завел меня так далеко!
Теперь у меня есть этот код, который делает почти все, что мне нужно.
$output = wp_list_pages('echo=0&depth=1&title_li=Sections' );
if (is_page( )) {
$page = $post->ID;
if ($post->post_parent) {
$page = $post->post_parent;
}
$children=wp_list_pages( 'echo=0&child_of=' . $page . '&title_li=' );
if ($children) {
$output = wp_list_pages( array(
// Only pages that are children of the current page
'child_of' => $post->ID,
// Only show one level of hierarchy
'depth' => 1,
'title_li' => 'In this Section'
) );
}
}
echo $output;
Это работает именно так, как я хочу, пока я не достигну нижней части дерева, когда оно ничего не выведет.
Чип снова дал мне код, чтобы показать одноранговые страницы, а не ищу больше детей - однако мое отсутствие надлежащих навыков PHP означает, что у меня возникли проблемы с добавлением его в этот код.
4 answers
Это должно работать, используя не более чем доступные параметры массива аргументов для wp_list_pages()
: в частности, depth
и child_of
.
Для отображения одного уровня иерархии для страниц-потомков текущей страницы:
<?php
// Globalize the $post variable;
// probably already available in this context, but just in case...
global $post;
wp_list_pages( array(
// Only pages that are children of the current page
'child_of' => $post->ID,
// Only show one level of hierarchy
'depth' => 1
) );
?>
Не должно быть необходимости прибегать к пользовательскому классу ходунков.
РЕДАКТИРОВАТЬ
ЧТОБЫ также отобразить ссылки верхнего уровня, просто измените пару параметров:
<?php
// Globalize the $post variable;
// probably already available in this context, but just in case...
global $post;
wp_list_pages( array(
// Only pages that are children of the current page's parent
'child_of' => $post->post_parent,
// Only show two level of hierarchy
'depth' => 2
) );
?>
Обратите внимание на изменение 'child_of' => $post->ID
в 'child_of' => $post->post_parent
, который будет включать страницы родительской страницы текущей страницы, и изменение 'depth' => 1
на 'depth' => 2
, которое будет включать братьев и сестер текущей страницы и их детей.
РЕДАКТИРОВАТЬ 2
Хорошо, вот как я бы поступил с кодом, который вы только что добавили. Во-первых, я бы использовал правильный массив, а не строку массива. Затем я бы запросил контекст/дочерние страницы перед построением массива аргументов wp_list_pages()
, затем просто вызовите wp_list_pages()
один раз:
// Use parent page if exists, else use current page
$child_of_value = ( $post->post_parent ? $post->post_parent : $post->ID );
// Depth of 2 if parent page, else depth of 1
$depth_value = ( $post->post_parent ? 2 : 1 );
// Build argument array
$wp_list_pages_args = array(
'child_of' => $child_of_value,
'depth' => $depth_value,
'title_li' => 'Sections'
);
// Now, output the result
wp_list_pages( $wp_list_pages_args );
Нам понадобится более сложный код, если вам действительно нужно выводить отдельные списки.
Ну, вы можете использовать аргумент глубины, чтобы контролировать, сколько уровней глубины вы хотите показать, и я создал подменю walker, в котором отображается меню, начинающееся с прямых дочерних элементов текущей страницы. Код:
class My_Walker_Submenu extends Walker_Nav_Menu {
function display_element($element, &$children_elements, $max_depth, $depth = 0, $args, &$output) {
if (! $element)
return;
$itemId = null;
if ( $depth == 0) {
if (!isset($args[0]->child_of)){
return;
}
foreach ( $children_elements as $id => $children ) {
$data = get_post_meta ( $id, '_menu_item_object_id', true );
if ($data == $args [0]->child_of) {
$itemId = $id;
break;
}
}
if ($itemId == null) {
return;
}
unset($args [0]->child_of);
foreach ( $children_elements [$itemId] as $child ) {
parent::display_element ( $child, $children_elements, $max_depth, $depth + 1, $args, $output );
}
return;
}
return parent::display_element ( $element, $children_elements, $max_depth, $depth, $args, $output );
}
И использование (на самом деле я использую его на боковой панели):
echo wp_nav_menu( array(
'container' => '',
'theme_location' => 'header-menu',
'walker' => new My_Walker_Submenu(),
'child_of' => $page->ID,
'depth' => 2
) );
Это проблема, которая, как я вижу, возникает довольно часто. Я думаю, что решения WP_List_Pages, которые я вижу повсюду, немного старомодны теперь, когда в Wordpress есть правильный менеджер меню (Внешний вид -> Меню).
Я перепробовал множество решений, включая некоторые плагины/виджеты и ходунки, подобные приведенному выше. Я никогда не был очень доволен доступными решениями. Я создал свой собственный плагин, который обрабатывает эти второстепенные меню так, как я предпочитаю и привык. При отображении меню вы можете установить start_depth, чтобы сообщить меню игнорировать определенное количество "уровней" над вашей текущей страницей.
Поэтому для ваших нужд вы бы установили значение start_depth равным 1, и оно автоматически игнорировало бы элементы навигации верхнего уровня при отображении вашего меню.
Я называю плагин WP Nav Plus, потому что он основан на текущей мощности и параметрах wp_nav_menu, просто с дополнительным аргументом start_depth для отображения дочерних меню.
Для всех, кто заинтересован он доступен на моем веб-сайте: https://mattkeys.me/products/wp-nav-plus/