2011-04-24 52 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]); }