Автоматическое добавление дочерних страниц в навигационное меню

27 мая 2013 г., 08:17:06
Просмотры: 13.9K
Голосов: 5

Я создал пользовательское меню в WordPress, которое содержит ссылки на записи и страницы. Добавляю его в шапку с помощью этого кода:

<?php 

wp_nav_menu(
    array(
        'theme_location' => 'primary', 
        'depth'          => 0, 
        'menu_class'     => 'nav-menu',
    ) 
);

?>

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

Я пробовал использовать depth => 0, но это не сработало. Есть ли способ отображать дочерние страницы без необходимости добавлять их в пользовательское меню вручную?

4
Комментарии

Единственный известный мне способ - когда ваше пользовательское меню пустое, WordPress автоматически заполнит его всеми существующими страницами. Как только вы начнёте добавлять страницы вручную, автоматическое заполнение прекратится.

Alexandre Lavoie Alexandre Lavoie
27 мая 2013 г. 08:22:24

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

hakre hakre
27 мая 2013 г. 09:40:29

Спасибо за перенос, Toscho - я не знал, что этот форум существует.

Desmond Desmond
28 мая 2013 г. 03:59:20

код для меню с подменю из страниц и дочерних страниц. Это МОЖЕТ помочь вам программно построить меню из дочерних страниц и их подстраниц.

Core Core
28 мая 2013 г. 09:37:49
Все ответы на вопрос 1
6
14

вот как:

/**
* auto_child_page_menu
* 
* класс для автоматического добавления дочерних страниц в меню верхнего уровня
* @author Ohad Raz <admin@bainternet.info>
*/
class auto_child_page_menu
{
    /**
     * конструктор класса
     * @author Ohad Raz <admin@bainternet.info>
     * @param   array $args 
     * @return  void
     */
    function __construct($args = array()){
        add_filter('wp_nav_menu_objects',array($this,'on_the_fly'));
    }
    /**
     * магическая функция, добавляющая дочерние страницы
     * @author Ohad Raz <admin@bainternet.info>
     * @param  array $items 
     * @return array 
     */
    function on_the_fly($items) {
        global $post;
        $tmp = array();
        foreach ($items as $key => $i) {
            $tmp[] = $i;
            //если не страница, пропускаем
            if ($i->object != 'page'){
                continue;
            }
            $page = get_post($i->object_id);
            //если не родительская страница, пропускаем
            if (!isset($page->post_parent) || $page->post_parent != 0) {
                continue;
            }
            $children = get_pages( array('child_of' => $i->object_id) );
            foreach ((array)$children as $c) {
                //устанавливаем родительское меню
                $c->menu_item_parent      = $i->ID;
                $c->object_id             = $c->ID;
                $c->object                = 'page';
                $c->type                  = 'post_type';
                $c->type_label            = 'Страница';
                $c->url                   = get_permalink( $c->ID);
                $c->title                 = $c->post_title;
                $c->target                = '';
                $c->attr_title            = '';
                $c->description           = '';
                $c->classes               = array('','menu-item','menu-item-type-post_type','menu-item-object-page');
                $c->xfn                   = '';
                $c->current               = ($post->ID == $c->ID)? true: false;
                $c->current_item_ancestor = ($post->ID == $c->post_parent)? true: false; //вероятно не совсем правильно
                $c->current_item_parent   = ($post->ID == $c->post_parent)? true: false;
                $tmp[] = $c;
            }
        }
        return $tmp;
    }
}
new auto_child_page_menu();
27 мая 2013 г. 12:05:41
Комментарии

Это работает отлично, большое спасибо за вашу помощь, Bainternet! Очень признателен.

Desmond Desmond
29 мая 2013 г. 14:13:04

Извините за вопрос, но как мне это использовать? Вставить в functions.php и вызывать из места, где должно быть меню?

1GR3 1GR3
29 мая 2014 г. 19:14:16

Я согласен с @1GR3, как нам это использовать?

Spedwards Spedwards
1 мар. 2015 г. 07:16:37

Да, просто добавьте это в файл functions.php и нажмите сохранить!

David Shaw David Shaw
23 янв. 2018 г. 17:10:30

Хорошая попытка, но это НЕ РАБОТАЕТ! Это добавляет ВСЕ дочерние страницы под родительским элементом верхнего уровня, как если бы они были дочерними элементами 1-го уровня. Дочерние страницы 2-го и 3-го уровня также добавляются под родительским элементом верхнего уровня. Полностью испортило мою навигацию.

Joe Bloggs Joe Bloggs
12 мая 2019 г. 04:33:30

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

Я добавил еще одно условие для добавления класса к родительскому элементу списка, например: if (count($children)>0) $i->classes[] = 'menu-item-has-children';

Shad Gagnon Shad Gagnon
15 апр. 2022 г. 01:00:33
Показать остальные 1 комментариев