将自定义漫游添加到在小部件中创建的菜单

时间:2012-06-01 作者:amy

我知道如何将助行器添加到由主题创建的自定义菜单(菜单名为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 );

}

4 个回复
最合适的回答,由SO网友:Eugene Manuilov 整理而成

如果您查看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\' );

SO网友:Yaron

扩展@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\');

SO网友:Jon

这是针对菜单的另一种选择term_id 我认为它可能对某些人有用,可以作为一种修改多个菜单的方式,而不必查找他们的ID。

通过添加print_r($args) 对于过滤器,我注意到$args[\'menu\'] 是预定义主题位置中菜单的字符串,以及WP_Term_Object 用于侧栏中的自定义菜单小部件。

我使用它通过slug将菜单作为目标,并向其容器中添加一个类。许多菜单可以通过在其段塞中包含一个公共字符串作为目标。注意:菜单slug来自数组键inregister_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()位。

SO网友:celleness

您可以使用widget_nav_menu_args wordpress中添加的过滤器4.2.0. 它接受四个参数(请参见wp-includes/widgets/class-wp-nav-menu-widget.php). 但要仅添加自定义walker,只需使用第一个参数,与使用wp_nav_menu_args 滤器

    add_filter(\'wp_nav_menu_args\', \'my_args\'); //for menus
    add_filter(\'widget_nav_menu_args\', \'my_args\'); //for menus in widgets
    function my_args($args) { //$args is only argument needed to add custom walker
       return array_merge( $args, array(
          \'walker\' => new My_Custom_Walker(),
       ) );
    }

结束

相关推荐

changing wp-admin/widgets.php

我们希望在管理面板中设计小部件页面时有所不同,主要是为了帮助站点管理员了解每个小部件在站点中的显示位置:为此,我们需要更改小部件所使用的HTML。php呈现(仅仅更改css是不够的)。我们如何在不触及核心的情况下做到这一点?