只显示一个级别的子页面,wp_list_ages

时间:2011-10-24 作者:a_kc

我在一个网站上工作,这个网站的页面结构相当大,只有几个层次,有些部分有很多页面。

基本设置如下所示。。。

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技能,这意味着我很难将其添加到此代码中。

4 个回复
最合适的回答,由SO网友:Chip Bennett 整理而成

这应该可以工作,只需使用wp_list_pages(): 明确地depthchild_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
) );

SO网友:Matt Keys

这是一个我经常碰到的问题。我认为,由于Wordpress有了一个合适的菜单管理器(外观->菜单),我看到的WP\\u List\\u页面解决方案有点老派了。

我尝试了许多解决方案,包括一些插件/小部件和Walker,如上面的一个。我从未对可用的解决方案感到非常满意。我创建了自己的插件,以我喜欢和习惯的方式处理这些二级菜单。显示菜单时,可以设置start\\u depth,以通知菜单忽略当前页面上方的特定数量的“级别”。

因此,根据您的需要,您可以将start\\u depth设置为1,并在显示菜单时自动忽略顶级导航项。

我之所以称这个插件为WP Nav Plus,是因为它建立在WP\\u Nav\\u menu的当前功能和选项的基础上,只需添加start\\u depth参数来显示子菜单。

对于任何感兴趣的人,请访问我的网站:https://mattkeys.me/products/wp-nav-plus/

SO网友:Simon

我创建了一个使用wp\\u list\\u pages()实现的函数。调整参数,就可以全部设置好了。

Gist

结束