2011-04-24 93 views
5

我正在努力应对Wordpress 3.0。这是相当酷的事情,但我无法解决一个问题。例如,我有这样的菜单树。菜单树是从页面构建的。如何显示部分菜单树?

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

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

对于exammple如果人是“家”的页面上,在左边的一部分,他应该看到:

news 
    video 
    audio 

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

About author 
     Favourite colors 
      red 
      blue 
      green 

我找不到一个API来做到这一点。你可以请我吃什么,我可以在哪里找到它?

UPD: @Jason麦克里 我见过我见过wp_list_pages()和尝试。我din't得到我该如何使用它: 请参阅我的模板页面:

<?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()的输出是什么都没有。 我不知道为什么... :(

回答

-1

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

+1

好主意,但不好的方法。在大多数情况下,最好在服务器端提供所有可用的东西,而且只能在客户端进行。 – Shahar 2014-05-17 22:45:38

1

退房wp_list_pages(),它是有孩子的导航有用在边栏

+0

所以主要想法是我不想只列出页面。我想从指定的ID开始打印子导航。例如,我确实指定了名为“Blog”的页面的pageId,并且我确实获得了博客分支的子导航。 – Sergey 2011-04-24 17:16:13

+0

当在'wp_list_page()'中设置'child_of'时,该函数将返回一个帖子的孩子而不是父菜单的孩子。 – Shahar 2014-05-17 22:48:41

23

您可以编写一个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与包含页面的ID附加start_in参数,你想要孩子off:

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

感谢一堆,这是迄今为止最好的解决方案,因为它仍然使用导航菜单/定制沃克等布局我的子菜单。应该接受答案。 – tsdexter 2013-05-08 18:12:34

+1

很高兴看到有人通过使用'wp_nav_menu'来回答* menu *问题。对那些说'wp_list_pages'就像是同样的事情的人感到厌倦。 – mikevoermans 2014-07-15 19:00:38

+0

这是**天才!**我试图将我的WP主题策略移动到一个方向,在菜单中组织所有内容,并将其组合为层次结构帖子类型。我已经用menu_order做了一些很好的事情,并根据菜单位置发布了meta,但这是缺失的链接。布拉沃。 – 2017-02-17 20:49:22

1

我写了这个打印您可能在网页上的子导航。如果要打印每个页面的子导航,请获取页面父页面,而不是获取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>";` 
1

MAC的Joost的答案是伟大的,但我想补充一点,如果你想父要打印的项目,那么你不应该取消设置的父母,所以线18个需要做相应的调整:

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