使用“ wp_nav_menu_items”挂钩仅自定义特定菜单?


36

感谢这里的一些帮助,我设法将自定义搜索框添加到主菜单中...通过将其添加到主题的functions.php中

add_filter('wp_nav_menu_items','search_box_function');
  function search_box_function ($nav){
  return $nav."<li class='menu-header-search'><form action='http://example.com/' id='searchform' method='get'><input type='text' name='s' id='s' placeholder='Search'></form></li>";
}

但是,我现在在页脚中添加了另一个菜单,但是搜索框也添加到了该菜单中。如何将搜索框仅添加到主菜单?

我注册菜单的代码是:

register_nav_menus( array(
  'primary' => __( 'Primary Navigation', 'twentyten' ),
  'secondary'=>__('Secondary Menu', 'twentyten' ),

 ) );

..显示二级菜单的代码是:

wp_nav_menu( array( 'container_class' => 'menu-header', 'theme_location' => 'secondary' ) ); 

Answers:


41

要将自定义搜索框仅添加到主菜单,可以传递wp_nav_menu_items过滤器提供的第二个参数,并检查theme_location是否为主要位置

add_filter('wp_nav_menu_items','search_box_function', 10, 2);
function search_box_function( $nav, $args ) {
    if( $args->theme_location == 'primary' )
        return $nav."<li class='menu-header-search'><form action='http://example.com/' id='searchform' method='get'><input type='text' name='s' id='s' placeholder='Search'></form></li>";

    return $nav;
}

3
谢谢,太好了……只是一个新手问题- 10, 2代码中的功能是什么?
cannyboy 2010年

4
10是优先级(默认为十),2是我们要过滤的函数接受的参数数量。
罗斯特(Rarst)2010年

@ ampt,是的,我尝试过。有效。几乎。登录后,第二个菜单链接消失了,我该如何解决?

1
请注意,自WP 3.8起,变量为$ args-> menu而不是$ args-> theme_location
Alain Jacomet Forte

@AlainJacometForte实际上,$ args-> menu返回菜单的数字ID,而$ args-> theme_location返回字符串,因此此答案仍然是正确的。如果要比较字符串,则没有任何变化。
Marcus

8

一种替代方法是将菜单项添加到wp_nav_menu_items过滤器。

例如,假设您有一个名为Header的菜单,并且始终希望此菜单(无论是否附加到主题位置)都显示搜索框。您可以通过将菜单项(在这种情况下header)添加到过滤器中来实现。

新的过滤器如下所示:

add_filter('wp_nav_menu_header_items','search_box_function');
( 'wp_nav_menu_header_items', 'search_box_function' );

注意header新过滤器的一部分。这告诉WordPress将功能添加到哪个菜单。

这只是解决当前问题的一种不同方法。


请参阅此页面上来自@oshi的项目,该项目已发给您。
2013年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.