如何在wordpress中创建包含父母,孩子和兄弟姐妹的页面列表,但仅限于某些情况?

时间:2012-08-17 14:59:34

标签: php wordpress

我正在尝试创建一个侧栏导航菜单,该菜单会根据站点中的当前位置进行更改。

这是整个导航的样子:

  • 主页
  • 关于我们
    • 等级1a
    • 等级1b
    • 等级1c
  • 程序
    • 等级1d
      • Level 2a
      • 等级2b
    • 等级1e
      • 等级2c
      • 等级2d
    • 等级1f
  • 联系我们

目前我正在使用自定义导航菜单为主页创建菜单,以便他们可以通过管理面板中的菜单链接编辑自定义菜单。他们不希望在联系页面上显示侧边栏导航菜单。

在关于我们页面时,他们希望侧边栏导航看起来像这样:

  • 等级1a
  • 等级1b
  • 等级1c

在“程序”页面上,他们希望它看起来像这样:

  • 等级1d
  • 等级1e
  • 等级1f

在第1级页面上,他们希望它看起来像这样:

  • 等级1d
    • Level 2a
    • 等级2b
  • 等级1e
  • 等级1f

确保仅为当前父级显示子页面。

当在Level 2a页面上时,他们希望它看起来像在1d级页面上一样:

  • 等级1d
    • 等级2a
    • 等级2b
  • 等级1e
  • 等级1f

另外需要注意的是,我需要能够以与其他项目不同的方式设置当前页面列表项的样式,因此需要添加某种类型的当前页面项目类每次都列出项目。

到目前为止,我还没有能够在1d级别打印当前父级的子级。 wp_list_pages允许您设置深度,但不限制它仅限于当前父级。它也为所有兄弟姐妹打印孩子(即,如果在1d级别,它打印所有2级孩子在他们各自的父母下面,而不是仅在目前活跃的父母下面的2级孩子)。

我该怎么做?

    <?php $current_section = "";
        if(is_front_page()):
             $current_section = "home";
             $nav_args = array(
                 'theme_location' => $current_section,
                  'container' => 'nav',
                  'container_class' => 'side-nav'
             );
             wp_nav_menu( $nav_args );
        else:

        endif;?>

这就是我现在所拥有的。我删除了else块中的所有代码,因为它无论如何都没有工作。

2 个答案:

答案 0 :(得分:0)

尝试使用以下代码仅显示当前父级及其子菜单

<?php
  if($post->post_parent) {
  $children = wp_list_pages("title_li=&child_of=".$post->post_parent."&echo=0");
  $titlenamer = get_the_title($post->post_parent);
  }

  else {
  $children = wp_list_pages("title_li=&child_of=".$post->ID."&echo=0");
  $titlenamer = get_the_title($post->ID);
  }
  if ($children) { ?>

  <h2> <?php echo $titlenamer; ?> </h2>
  <ul>
  <?php echo $children; ?>
  </ul>

<?php } ?>

This section of codex explain this

  

另外需要注意的是,我需要能够设计样式   current-page list-item与其他项目不同,所以   需要添加某种current-page-item类   每次都列出项目。

每次都不需要写一个特殊的课程。 WordPress会自动添加一个类.current-menu-item。您只需要从CSS自定义该类。

希望这能解决你的一些问题.. :)

答案 1 :(得分:0)

这是我提出的代码:

    <?php
            $children = wp_list_pages('depth=1&title_li=&child_of='.$post->ID.'&echo=0');
            $current_page = wp_list_pages('title_li=&include='.$post->ID.'&echo=0');
            $grandparent=0;
            if($post->post_parent):
                $parent = wp_list_pages('title_li=&include='.$post->post_parent.'&echo=0');
                $siblings = wp_list_pages('depth=1&title_li=&child_of='.$post->post_parent.'&exclude='.$post->ID.'&echo=0');
                $parent_children = wp_list_pages('depth=1&title_li=&child_of='.$post->post_parent.'&echo=0');
                $parent_post = get_post($post->post_parent);
                $grandparent = $parent_post->post_parent;
                $parent_siblings = wp_list_pages('depth=1&title_li=&child_of='.$grandparent.'&echo=0&exclude='.$post->post_parent);
            endif;
            if(!$post->post_parent && $children):?>
                <ul class="menu">
                    <?php echo $children;?>
                </ul>
            <?php elseif($post->post_parent && $children):?>
                <ul class="menu">
                    <?php echo $current_page;?>
                    <ul class="menu">
                        <?php echo $children;?>
                    </ul>
                    <?php echo $siblings;?>
                </ul>
            <?php elseif($grandparent && $post->post_parent && !$children):?>
                <ul class="menu">
                    <?php echo $parent;?>
                    <ul class="menu">
                    <?php echo $parent_children;?>
                    </ul>
                    <?php echo $parent_siblings;?>
                </ul>
            <?php elseif(!$grandparent && $post->post_parent && !$children):?>
                <ul class="menu">
                    <?php echo $parent_children;?>
                </ul>
            <?php endif;?>

这不是最优雅的解决方案,但至少它符合我的要求。唯一可以改善其实际功能的是保持菜单项的顺序,同时仍然允许子菜单。此代码使用子菜单删除菜单项并将其移至顶部。我无法想出任何其他方法来做到这一点。