【问题标题】:how to display part of a menu tree?如何显示菜单树的一部分?
【发布时间】:2011-08-11 20:51:56
【问题描述】:

我正在尝试处理 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。请问在哪里可以找到?

统一更新: @杰森麦克里里 我见过我见过 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() 函数的输出什么都没有。 我不知道为什么... :(

【问题讨论】:

    标签: wordpress menu children


    【解决方案1】:

    您可以编写一个 filter_hook 来完成此操作。

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

    # 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'
    ) );
    

    【讨论】:

    • 非常感谢,这是迄今为止最好的解决方案,因为它仍然使用导航菜单/自定义步行器等来布局我的子菜单。应该被接受的答案。
    • 很高兴看到有人按照应有的方式使用wp_nav_menu 回答menu 问题。厌倦了人们说wp_list_pages 就像是一回事。
    • 这是天才!我正在尝试将我的 WP 主题策略转向一个方向,即所有内容都在菜单中组织而不是组合和 i> 分层帖子类型。我已经用 menu_order 做了一些不错的事情,并根据菜单位置发布元数据,但这是缺少的链接。太棒了。
    【解决方案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>";`
    

    【讨论】:

      【解决方案3】:

      查看wp_list_pages()。这对于在侧边栏中提供子导航很有用。

      【讨论】:

      • 所以主要的想法是我不想要页面列表。我想从指定的 id 开始打印子导航。例如,我确实指定了名为“博客”的页面的 pageId,并且确实获得了博客分支的子导航。
      • wp_list_page() 中设置'child_of' 时,该函数将返回帖子的子项,而不是父菜单的子项。
      【解决方案4】:

      mac joost 的回答很好,但我要补充一点,如果您希望打印父项,则不应取消设置父项,因此需要相应调整第 18 行:

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

      【讨论】:

        【解决方案5】:

        你看过 wp_list_pages 吗?

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

        仔细查看 child_of 属性

        【讨论】:

          【解决方案6】:

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

          【讨论】:

            【解决方案7】:

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

            【讨论】:

            • 好主意,但方法不好。在大多数情况下,最好在服务器端提供您能提供的所有东西,而在客户端只提供您必须提供的东西。
            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2013-12-21
            • 1970-01-01
            • 1970-01-01
            • 2016-01-23
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多