43

Thanks to some help on here, I've managed to add a custom search box to my main menu... by adding this to my theme's 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>";
}

However, I've now added another menu to put in the footer, but the search box gets added to this one too. How would I add the search box to the primary menu only?

My code for registering the menus is:

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

 ) );

..and the code to display the secondary menu is:

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

2 Answers 2

46

To only add the custom search box to the main menu you could pass the second parameter provided by the wp_nav_menu_items filter and check if the theme_location is the primary 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;
}
6
  • 3
    thanks, that's great... just a newbie question - what does the 10, 2 do in the code?
    – cannyboy
    Commented Sep 23, 2010 at 14:45
  • 5
    10 is priority (ten is default), 2 is number of arguments that function we are hooking to filter accepts.
    – Rarst
    Commented Sep 23, 2010 at 15:25
  • @ ampt, Yes, I tried that. It worked. almost. When I do login, my second menu links dissapear, how can I solve that?
    – user9182
    Commented Oct 4, 2011 at 23:59
  • 1
    Note that as of WP 3.8, the variable is $args->menu instead of $args->theme_location Commented Mar 26, 2014 at 21:00
  • @AlainJacometForte Actually, $args->menu returns the numeric ID of the menu, while $args->theme_location returns the string, so this answer is still correct the way it is. Nothing has changed if you are comparing the strings.
    – Marcus
    Commented May 25, 2014 at 15:37
8

An alternative method of doing this is adding the menu slug to the wp_nav_menu_items filter.

For example, let's say you have a menu named Header and you always want this menu (whether it's attached to a theme location or not) to display a search box. You can do so by adding the menu slug, in this case header, to the filter.

The new filter would be as follows:

add_filter( 'wp_nav_menu_header_items', 'search_box_function' );

Notice the header portion of the new filter. This tell WordPress what menu to add the function to.

This is just one different way to approach your current problem.

1
  • See the item from @oshi on this page, which is addressed to you.
    – halfer
    Commented Jan 2, 2013 at 1:39

Not the answer you're looking for? Browse other questions tagged or ask your own question.