问题描述
我知道如何将 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 );
}
最佳解决方案
如果您查看 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' );
次佳解决方案
扩展 @ Eugene 的答案,如果你想限制一个特定的菜单,只需检查菜单的术语 ID:
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');
参考文献
注:本文内容整合自 Google/Baidu/Bing 辅助翻译的英文资料结果。如果您对结果不满意,可以加入我们改善翻译效果:薇晓朵技术论坛。