Intereting Posts
Показать сообщение от бэкэнд Загрузите изображение с веб-страницы в папку загрузок по умолчанию Как сделать должности не классифицированными Изменение параметров ссылок при наведении указателя на заголовок сообщения отправка различного уведомления по электронной почте при регистрации на основе роли пользователя Где поставить случайные функции? Предварительно заполнить WordPress wp_media modal с выбором изображения Верхняя панель администратора не отображается на лицевой стороне Предупреждения об обновлении WordPress Как я могу отслеживать активных пользователей моего плагина? и почему WordPress.Org не предлагает это? Является ли хорошей практикой отключить wpautop для премиальных тем? Возможность редактирования для подписчика Как получить сообщения из двух категорий с WP_Query? Почтовые запросы по широте и долготе Как разрешить зарегистрированным пользователям анонимно отправлять

Добавьте пользовательский ходок в меню, созданное в виде виджета

Я знаю, как добавить Walker в пользовательское меню, созданное темой (меню с именем primary в этом примере), но как настроить таргетинг на меню, созданное в виджетах с помощью стандартного виджета меню WordPress по умолчанию?

 if ( has_nav_menu( 'primary' ) ) { $args = array( 'menu' => 'main-menu', 'menu_id' => 'main-menu', 'theme_location' => 'primary', 'depth' => 0, 'container' => false, 'menu_class' => 'nav', 'walker' => new Myprefix_Walker_Nav_Menu(), 'echo' => 0 ); $nav = wp_nav_menu( $args ); } 

Solutions Collecting From Web of "Добавьте пользовательский ходок в меню, созданное в виде виджета"

Если вы посмотрите на реализацию класса WP_Nav_Menu_Widget вы увидите следующий код:

 function widget($args, $instance) { // Get menu $nav_menu = ! empty( $instance['nav_menu'] ) ? wp_get_nav_menu_object( $instance['nav_menu'] ) : false; if ( !$nav_menu ) return; $instance['title'] = apply_filters( 'widget_title', empty( $instance['title'] ) ? '' : $instance['title'], $instance, $this->id_base ); echo $args['before_widget']; if ( !empty($instance['title']) ) echo $args['before_title'] . $instance['title'] . $args['after_title']; wp_nav_menu( array( 'fallback_cb' => '', 'menu' => $nav_menu ) ); echo $args['after_widget']; } 

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

 $defaults = array( 'menu' => '', 'container' => 'div', 'container_class' => '', 'container_id' => '', 'menu_class' => 'menu', 'menu_id' => '', 'echo' => true, 'fallback_cb' => 'wp_page_menu', 'before' => '', 'after' => '', 'link_before' => '', 'link_after' => '', 'items_wrap' => '<ul id="%1$s" class="%2$s">%3$s</ul>', 'depth' => 0, 'walker' => '', 'theme_location' => '' ); $args = wp_parse_args( $args, $defaults ); $args = apply_filters( 'wp_nav_menu_args', $args ); $args = (object) $args; 

Здесь вы можете увидеть, что все аргументы, переданные функции wp_nav_menu могут быть заменены. Так что вам нужно создать свой собственный обработчик крючка, который добавит ваш ходок в меню навигации. Это может быть просто:

 function myplugin_custom_walker( $args ) { return array_merge( $args, array( 'walker' => new My_Custom_Walker(), // another setting go here ... ) ); } add_filter( 'wp_nav_menu_args', 'myplugin_custom_walker' ); 

Развернув ответ на @ Eugene, если вы хотите ограничить это конкретным меню, просто проверьте идентификатор термина:

 function custom_nav_args($args){ $menu = $args['menu']; if($menu->term_id === 17) /* replace term_id with menu id, or use $menu->name to do it by menu name*/ { $args['walker'] = new My_Custom_Walker(); } return $args; } add_filter('wp_nav_menu_args', 'custom_nav_args'); 

Это альтернатива таргетингу на меню term_id и я подумал, что это может быть term_id для кого-то, как способ изменения нескольких меню без необходимости искать их идентификаторы.

Добавив print_r($args) в фильтр, я заметил, что $args['menu'] – это строка для меню в предопределенных местах темы и WP_Term_Object для пользовательского виджета меню на боковой панели.

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

 function my_menu_thingy( $args ) { if( is_object($args['menu']) && strpos($args['menu']->{slug},'my-common-string') !== false ) { $args['walker'] = new My_Custom_Walker(); } return $args; } add_filter( 'wp_nav_menu_args', 'my_menu_thingy' ); 

Для одного меню вам просто нужно проверить, что $args['menu']->{slug} == 'your-slug' вместо бит strpos () выше.