我在一个网站上工作,这个网站的页面结构相当大,只有几个层次,有些部分有很多页面。
基本设置如下所示。。。
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
你明白了——想象一下还有更多的页面!
我的子菜单的正常解决方案正常运行良好(直接取自Codex),因为我在更小的网站上工作。这个网站的结果是一个非常长的菜单,非常大,非常有用。
我想做的只是在当前正在查看的页面下方直接显示级别。基本上是“在本节中…”菜单
无论我发现wp\\U list\\U页面片段的组合是什么,我都只能得到全部或全部。
此外,因为有些部分没有子级,所以当没有子级时,只需显示顶级链接。
希望这是有道理的——我整天都在为这件事发愁!非常感谢您的帮助!
编辑
好的,我在这里登广告。对不起,我是个傻瓜!
非常感谢“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;
这正是我想要的,直到我到达树的底部,它什么也不输出。
Chip再次给了我代码,让我向页面的同龄人展示,而不是寻找更多的孩子——然而,我缺乏适当的PHP技能,这意味着我很难将其添加到此代码中。
最合适的回答,由SO网友:Chip Bennett 整理而成
这应该可以工作,只需使用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
) );
?>
应该没有必要求助于定制的助行器类。
EDIT
要显示顶级链接,只需更改两个参数:
<?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
, 其中将包括当前页面的同级及其子级。
EDIT 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 );
如果您确实需要输出单独的列表,那么我们需要更复杂的代码。
SO网友:Maxim Krizhanovsky
您可以使用depth参数来控制要显示的深度级别,我创建了一个子菜单遍历器,它显示从当前页面的直接子菜单开始的菜单。代码:
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
) );