У меня есть меню, определенное в WP Admin, которое выглядит так:
Я хочу иметь возможность отображать все дочерние ссылки на боковой панели, когда я нахожусь на родительской странице. Например, если пользователь находится на моей странице «О нас», я хочу, чтобы на боковой панели отображался список из 4 ссылок, выделенных зеленым цветом.
Я посмотрел документацию для wp_nav_menu (), и в ней нет встроенного способа указать конкретный узел данного меню, который будет использоваться в качестве отправной точки при создании ссылок.
Я создал решение для аналогичной ситуации, которое основывалось на отношениях, созданных родителем страницы, но я ищу решение, которое использует систему меню специально. Любая помощь будет оценена.
Ответы:
Это все еще было в моей голове, поэтому я пересмотрел его и собрал это решение, которое не слишком зависит от контекста:
использование
источник
Walker_Nav_Menu
классе. Как и все меню слишком много для комментариев - задать новый вопрос об этом?wp_filter_object_list
строку наwp_filter_object_list( $items, array( 'object_id' => $args->submenu ), 'and', 'ID' );
@goldenapples: Ваш класс Уокера не работает. Но идея действительно хорошая. Я создал ходок на основе вашей идеи:
Теперь вы можете использовать:
Вывод представляет собой список, содержащий текущий корневой элемент и его дочерние элементы (а не их дочерние элементы). Def: Root element: = Элемент меню верхнего уровня, который соответствует текущей странице или является родительским для текущей страницы или родительским для родительского элемента ...
Это не совсем отвечает на первоначальный вопрос, но почти, так как все еще есть элемент верхнего уровня. Это хорошо для меня, потому что я хочу элемент верхнего уровня в качестве заголовка боковой панели. Если вы хотите избавиться от этого, вам, возможно, придется переопределить display_element или использовать HTML-парсер.
источник
Привет @jessegavin :
Меню Nav хранятся в комбинации пользовательских типов записей и пользовательских таксономий. Каждое меню сохраняется как термин (например, «О меню» , найденный в
wp_terms
) пользовательской таксономии (то естьnav_menu
, найденный вwp_term_taxonomy
.)Каждый пункт меню Nav хранится в виде поста
post_type=='nav_menu_item'
(т. Е. «О фирме» , вwp_posts
котором он находится), а его атрибуты хранятся в виде мета (вwp_postmeta
) поста сmeta_key
префиксом_menu_item_*
где_menu_item_menu_item_parent
- идентификатор родительского поста пункта меню Nav вашего элемента меню.Отношение между меню и пунктами меню хранится в том месте,
wp_term_relationships
где оноobject_id
относится к$post->ID
пункту меню Nav и$term_relationships->term_taxonomy_id
относится к меню, определенному совместно вwp_term_taxonomy
иwp_terms
.Я уверен , что это можно было бы подключить как
'wp_update_nav_menu'
и'wp_update_nav_menu_item'
создать фактическое меню вwp_terms
и параллельный набор отношений вwp_term_taxonomy
иwp_term_relationships
где каждом Nav Пункте меню , который имеет суб-Nav пункты меню также становится его собственная Nav меню.Вы также хотели бы подключить
'wp_get_nav_menus'
(который я предложил добавить в WP 3.0 на основе некоторой аналогичной работы, которую я выполнял несколько месяцев назад), чтобы гарантировать, что ваши сгенерированные навигационные меню не будут отображаться для манипуляций пользователем в администраторе, в противном случае они Вы бы очень быстро потеряли синхронизацию, и тогда у вас был бы кошмар с данными.Звучит как забавный и полезный проект, но это немного больше кода и тестирования, чем я могу себе позволить решить сейчас, отчасти потому, что все, что синхронизирует данные, имеет тенденцию быть PITA, когда дело доходит до устранения всех ошибок (и потому что платящие клиенты настаивают на том, чтобы я что-то сделал. :) Но, вооружившись приведенной выше информацией, я довольно мотивированный разработчик плагинов для WordPress, если захочу.
Конечно, теперь вы понимаете, что если вы делаете код, вы обязаны опубликовать его здесь, чтобы мы могли извлечь выгоду из вашей щедрости! :-)
источник
wp_nav_menu()
вам нужно будет клонировать меню, потому чтоwp_nav_menu()
оно тесно связано со структурой меню . Другой вариант - скопироватьwp_nav_menu()
код и внести изменения, необходимые для отображения в качестве подменю.Это расширение Walker, которое должно делать то, что вы ищете:
Основываясь на коде mfields, на который я ссылался в своем комментарии ранее. Все, что он делает, - это проверяет при ходьбе меню, чтобы увидеть, является ли текущий элемент (1) текущим элементом меню или (2) предком текущего элемента меню, и расширяет поддерево под ним, только если выполняется одно из этих условий , Надеюсь, что это работает для вас.
Чтобы использовать его, просто добавьте аргумент «ходок» при вызове меню, то есть:
источник
$top_level_elements
и добавьте свой собственный тест перед вызовом$this->display_element
.depth
параметр в вызовwp_nav_menu
, если ваша тема каким-то образом переопределяет значение по умолчанию 0 (показать все уровни)?Обновление: я превратил это в плагин. Скачать здесь .
Мне нужно было решить это самому, и в итоге я написал фильтр по результатам поиска в меню. Это позволяет использовать
wp_nav_menu
как обычно, но выбрать подраздел меню в зависимости от заголовка родительского элемента. Добавьтеsubmenu
параметр в меню следующим образом:Вы даже можете пройти несколько уровней, вставив косую черту:
Или, если вы предпочитаете с массивом:
Он использует слаг-версию названия, которая должна позволять прощать такие вещи, как заглавные буквы и знаки препинания.
источник
$loc = split( "/", $loc );
в плагине на$loc = preg_split( "~/~", $loc );
Я собрал следующий класс для себя. Он найдет верхний родительский элемент навигации текущей страницы или вы можете назначить ему целевой верхний идентификатор навигации в конструкторе ходунка.
Навигация по телефону:
источник
@ davidn @hakre Привет, у меня ужасное решение без HTML-парсера или переопределения display_element.
источник
Вывод меню навигации включает в себя множество классов для текущего элемента, предка текущего элемента и т. Д. В некоторых ситуациях я смог сделать то, что вы хотите сделать, разрешив вывод всего дерева навигации, а затем с помощью css сократить его до только дети текущей страницы и т. д.
источник
Я сделал модифицированный ходок, который должен помочь! Не идеально - он оставляет несколько пустых элементов, но делает свое дело. Модификация - это в основном те биты $ current_branch. Надеюсь, это поможет кому-то!
}
источник
Проверьте код в моем плагине или используйте его для своих целей;)
Этот плагин добавляет улучшенный виджет «Меню навигации». Он предлагает множество опций, которые можно настроить для настройки вывода пользовательского меню через виджет.
Особенности включают в себя:
элементы выбранного элемента (опция для включения родительского элемента).
http://wordpress.org/extend/plugins/advanced-menu-widget/
источник