Если вы посмотрите на реализацию 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
реализацию функции, где вы можете найти следующие строки кода:
$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' );
'walker' => new Walker_Nav_Menu()
в аргументах моего конкретного меню переопределить его снова, чтобы стать обходчиком WordPress по умолчанию только для одного меню, но, к сожалению, это не работает.Расширяя ответ @ Евгения, если вы хотите ограничить это определенным меню, просто проверьте идентификатор термина меню:
источник
Это альтернатива нацеливанию на меню,
term_id
и я подумал, что он может быть полезен кому-то как способ изменения нескольких меню без необходимости искать их идентификаторы.Добавив
print_r($args)
в фильтр, я заметил, что$args['menu']
это строка для меню в предопределенных местах тем иWP_Term_Object
для пользовательского виджета меню на боковой панели.Я использовал это для нацеливания меню на slug и добавления класса в их контейнер. Целый ряд меню может быть выбран путем включения общей строки в их слагах. Примечание. Положение меню происходит от ключа массива
register_nav_menus()
.Для отдельного меню вам просто нужно проверить это
$args['menu']->{slug} == 'your-slug'
вместо бита strpos () выше.источник
Вы можете добавить пользовательский ходок в навигационное меню, созданное в виджете, используя
widget_nav_menu_args
фильтр, добавленный в WordPress4.2.0
. Он принимает четыре аргумента (см.wp-includes/widgets/class-wp-nav-menu-widget.php
). Но чтобы добавить только пользовательский обходчик, вам просто нужно использовать первый аргумент, так же, как вы используетеwp_nav_menu_args
фильтр.источник