如何显示菜单树的一部分?

时间:2011-04-24 13:54:36

标签: wordpress menu children

我正在尝试处理Wordpress 3.0。这是相当酷的事情,但我无法继续解决一个问题。例如,我有这样的菜单树。菜单树由页面构成。

Home
   news
   video
   audio
Blog
   About author
   Favourite colors
      red
      blue
      green
My car
   wheels
   tires

理念是: 主菜单由根元素组成:家庭,博客,我的车 在左侧,我想显示当前活动根元素的子元素。

例如,如果有人在“主页”页面,则在左侧部分他应该看到:

  news
  video
  audio

如果用户在“博客”页面上,他应该看到:

About author
       Favourite colors
          red
          blue
          green

我找不到这样做的API。请问我能在哪里找到它?

UPD: @Jason McCreary 我见过我见过wp_list_pages()并试过了。我不知道如何使用它: 请参阅我的模板页面:

    <?php
/*
 Template Name: page_news

 * @package WordPress
 * @subpackage Twenty_Ten
 * @since Twenty Ten 1.0
 */

get_header(); ?>
<h1>page_news</h1>
<h1>Children menu:</h1>
<?php wp_list_pages('echo=0&child_of=8&title_li='); ?>
<div id="container">
        <div id="content" role="main">

        <?php
        /** Get category id by name*/
        //$catId = get_category_by_slug('news')->term_id;
        query_posts('category_name=news');
        get_template_part( 'loop', 'page' );
        ?>

        </div><!-- #content -->
</div><!-- #container -->

<?php get_sidebar(); ?>
<?php get_footer(); ?>

请参阅以下代码行:

<?php wp_list_pages('echo=0&child_of=8&title_li='); ?>

我确实有id = 8的页面(我在URL中看到它)。 id = 8的页面有几个孩子。 我想打印它们,但它们没有打印。函数 wp_list_pages()的输出是什么都没有。 我不知道为什么...... :(

7 个答案:

答案 0 :(得分:22)

您可以编写filter_hook来完成此任务。

我的方法:使用我的自定义钩子为start_in创建一个额外的wp_nav_menu参数:

# in functions.php add hook & hook function
add_filter("wp_nav_menu_objects",'my_wp_nav_menu_objects_start_in',10,2);

# filter_hook function to react on start_in argument
function my_wp_nav_menu_objects_start_in( $sorted_menu_items, $args ) {
    if(isset($args->start_in)) {
        $menu_item_parents = array();
        foreach( $sorted_menu_items as $key => $item ) {
            // init menu_item_parents
            if( $item->object_id == (int)$args->start_in ) $menu_item_parents[] = $item->ID;

            if( in_array($item->menu_item_parent, $menu_item_parents) ) {
                // part of sub-tree: keep!
                $menu_item_parents[] = $item->ID;
            } else {
                // not part of sub-tree: away with it!
                unset($sorted_menu_items[$key]);
            }
        }
        return $sorted_menu_items;
    } else {
        return $sorted_menu_items;
    }
}

接下来,在您的模板中,您只需使用附加wp_nav_menu参数调用start_in,该参数包含您希望孩子关闭的页面ID:

wp_nav_menu( array( 
    'theme_location' => '<name of your menu>',
    'start_in' => $ID_of_page,
    'container' => false,
    'items_wrap' => '%3$s'
) );

答案 1 :(得分:2)

我写这篇文章是为了打印您可能在的页面的子导航。如果要打印每个页面的子导航,请获取父页面而不是获取ID。会有更多的参与,但这是一个开始。

$menu = wp_get_nav_menu_items( 'Primary Menu' );
$post_ID = get_the_ID();
echo "<ul id='sub-nav'>";
foreach ($menu as $item) {
    if ($post_ID == $item->object_id) { $menu_parent = $item->ID; }
    if (isset($menu_parent) && $item->menu_item_parent == $menu_parent) {
         echo "<li><a href='" . $item->url . "'>". $item->title . "</a></li>";
     }
 }
echo "</ul>";`

答案 2 :(得分:1)

结帐wp_list_pages()。它对于在侧栏中提供子导航非常有用。

答案 3 :(得分:1)

mac joost的答案很棒,但我想补充一点,如果您想要打印父项,那么您不应该取消设置父项,因此需要相应地调整第18行:

    if($item->object_id != (int)$args->start_in) { unset($sorted_menu_items[$key]); }

答案 4 :(得分:0)

你见过wp_list_pages吗?

http://codex.wordpress.org/Function_Reference/wp_list_pages

仔细查看child_of属性

答案 5 :(得分:0)

您可以使用Breadcrumb navxt插件。它完全符合您的要求而且非常棒。 Breadcrumb NavXT Pugin

答案 6 :(得分:-2)

我已停止探索如何在服务器端输出worpress网站分类的自定义部分。我只是使用jquery从主菜单中复制活动分类法分支并将其粘贴到我需要的页面容器中。