Customizing Only a Specific Menu using the “wp_nav_menu_items” Hook?
Question
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' ) );
Solution
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;
}
OTHER TIPS
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.