как отобразить часть дерева меню? - PullRequest
5 голосов
/ 24 апреля 2011

Я пытаюсь разобраться с 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: @ Джейсон МакКрири Я видел, что видел 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 ]

22 голосов
/ 10 октября 2011

Вы можете написать 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, содержащим идентификатор страницы, которую вы хотите отключить для детей:

wp_nav_menu( array( 
    'theme_location' => '<name of your menu>',
    'start_in' => $ID_of_page,
    'container' => false,
    'items_wrap' => '%3$s'
) );
2 голосов
/ 22 мая 2012

Я написал это, чтобы напечатать под-навигацию страниц, на которых вы можете быть.Если вы хотите распечатать суб-навигацию для каждой из страниц, вместо идентификатора получите родительский листТам было бы больше, чем это, но это начало.

$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 голос
/ 04 мая 2017

mac joost отвечает отлично, но я бы добавил, что если вы хотите, чтобы родительский элемент печатался, вам не следует сбрасывать родительский элемент, поэтому необходимо соответствующим образом изменить строку 18:

    if($item->object_id != (int)$args->start_in) { unset($sorted_menu_items[$key]); }
1 голос
/ 24 апреля 2011

Проверить wp_list_pages () . Это полезно для обеспечения дочерней навигации на боковой панели.

0 голосов
/ 24 мая 2011

Вы можете использовать Breadcrumb navxt плагин. Он делает именно то, что вы ищете, и это действительно здорово. Панировочный сухарь NavXT Pugin

0 голосов
/ 03 мая 2011

Я остановился, чтобы изучить, как выводить пользовательскую часть таксономии сайта worpress на стороне сервера. Я просто использую jquery, чтобы скопировать активную ветку таксономии из главного меню и вставить ее в нужный мне контейнер страницы.

0 голосов
/ 24 апреля 2011

Вы видели wp_list_pages?

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

посмотрите на атрибут child_of

...