Champ de recherche WordPress dans une barre de menu spécifique

Publié par Jean-Michel le

J’ai ajouté un champ de recherche à mes barres de menus en utilisant ce code ;

function menu_search($items){
    $search = '<li class="menusearch">';
    $search .= '<form method="get" id="searchform" action="/">';
    $search .= '<input type="text" class="field" name="s" id="s" placeholder="Search" />';
    $search .= '<input type="submit" class="menusubmit" name="submit" id="searchsubmit" value="Search" />';
    $search .= '</form>';
    $search .= '</li>';

    return $items . $search;
}
add_filter('wp_nav_menu_items','menu_search');

Mais cela ajoute la barre à tous mes menus, puisque j’utilise plusieurs menus, c’est un problème. Comment puis-je faire en sorte que la barre de recherche n’apparaisse que dans ma barre de navigation principale ?

J’ai essayé d’utiliser le tutoriel trouvé ici;http://www.wpbeginner.com/wp-themes/how-to-add-custom-items-to-specific-wordpress-menus/ mais la barre de recherche ne s’affichera pas dans ma barre de menu plus du tout. Peut-être que j’utilise mal le nom ou l’emplacement du thème, c’est ce qui apparaît dans mon écran de menu « Par défaut (le menu principal) ».

Ceci est le reste de mon fichier de fonctions si nécessaire ;

<?php
ob_start();
if ( function_exists( 'add_image_size' ) ) { add_image_size( 'orbit-custom', 920, 300 ); }

/**
 * Add a search bar to the navigation menu.
 *
 * @since Twenty Twelve 1.0
 */

function menu_search($items){
    $search = '<li class="menusearch">';
    $search .= '<form method="get" id="searchform" action="/">';
    $search .= '<input type="text" class="field" name="s" id="s" placeholder="Search" />';
    $search .= '<input type="submit" class="menusubmit" name="submit" id="searchsubmit" value="Search" />';
    $search .= '</form>';
    $search .= '</li>';

    return $items . $search;
}
add_filter('wp_nav_menu_items','menu_search');

// This adds more than one menu location
add_action( 'init', 'register_multiple_menus' );
function register_multiple_menus() {
    register_nav_menus(
        array(
            'footer-nav-mid' =>  'Middle Footer Navigation',
            'footer-nav-left' =>  'Left Footer Navigation',
            'footer-nav-right' =>  'Right Footer Navigation'
        )
    );
}

if ( function_exists('register_sidebar') ) {
   register_sidebar(array(
       'name'=>'Downloads Button Homepage',
       'before_widget' => '<div id="%1$s" class="widget %2$s buttons">',
       'after_widget' => '</div>',
       'before_title' => '<h4 class="widgettitle">',
       'after_title' => '</h4>',
   ));
}

if ( function_exists('register_sidebar') ) {
   register_sidebar(array(
       'name'=>'Locator Button Homepage',
       'before_widget' => '<div id="%1$s" class="widget %2$s buttons">',
       'after_widget' => '</div>',
       'before_title' => '<h4 class="widgettitle">',
       'after_title' => '</h4>',
   ));
}

if ( function_exists('register_sidebar') ) {
   register_sidebar(array(
       'name'=>'Specials Button Homepage',
       'before_widget' => '<div id="%1$s" class="widget %2$s buttons">',
       'after_widget' => '</div>',
       'before_title' => '<h4 class="widgettitle">',
       'after_title' => '</h4>',
   ));
}

if ( function_exists('register_sidebar') ) {
   register_sidebar(array(
       'name'=>'Store Locator',
       'before_widget' => '<div id="%1$s" class="widget %2$s">',
       'after_widget' => '</div>',
       'before_title' => '<h4 class="widgettitle">',
       'after_title' => '</h4>',
   ));
}

if ( function_exists('register_sidebar') ) {
   register_sidebar(array(
       'name'=>'Email Me',
       'before_widget' => '<div id="%1$s" class="widget %2$s">',
       'after_widget' => '</div>',
       'before_title' => '<h4 class="widgettitle">',
       'after_title' => '</h4>',
   ));
}

if ( function_exists('register_sidebar') ) {
   register_sidebar(array(
       'name'=>'Download Left',
       'before_widget' => '<div id="%1$s" class="widget %2$s">',
       'after_widget' => '</div>',
       'before_title' => '<h4 class="widgettitle">',
       'after_title' => '</h4>',
   ));
}

if ( function_exists('register_sidebar') ) {
   register_sidebar(array(
       'name'=>'Download Mid',
       'before_widget' => '<div id="%1$s" class="widget %2$s">',
       'after_widget' => '</div>',
       'before_title' => '<h4 class="widgettitle">',
       'after_title' => '</h4>',
   ));
}

if ( function_exists('register_sidebar') ) {
   register_sidebar(array(
       'name'=>'Download Right',
       'before_widget' => '<div id="%1$s" class="widget %2$s">',
       'after_widget' => '</div>',
       'before_title' => '<h4 class="widgettitle">',
       'after_title' => '</h4>',
   ));
}

if (
    !isset( $_POST['custom_meta_box_nonce'] )
    || !wp_verify_nonce( $_POST['custom_meta_box_nonce'], basename(__FILE__) )
)


 ?>

Solution n°1 trouvée

Vous pouvez passer le 2ème paramètre ( $args ) au filtre wp_nav_menu_items, pour vérifier si la valeur theme_location est la bonne.

function menu_search($items, $args){
    if( $args->theme_location == 'YOUR THEME LOCATION VALUE' ){
    $search = '<li class="menusearch">';
    $search .= '<form method="get" id="searchform" action="/">';
    $search .= '<input type="text" class="field" name="s" id="s" placeholder="Search" />';
    $search .= '<input type="submit" class="menusubmit" name="submit" id="searchsubmit" value="Search" />';
    $search .= '</form>';
    $search .= '</li>';
}
    return $items . $search;
}
add_filter('wp_nav_menu_items','menu_search', 10, 2);

J’espère que cela aide!

Solution n°2 trouvée

Lorsque vous utilisez add_filter, vous devez indiquer à WordPress de fournir la fonction de rappel avec la variable $args. Bref, essayez ceci :

function menu_search($items, $args){
    if( $args->theme_location == 'footer-nav-mid')  {
        $search = '<li class="menusearch">';
        $search .= '<form method="get" id="searchform" action="/">';
        $search .= '<input type="text" class="field" name="s" id="s" placeholder="Search" />';
        $search .= '<input type="submit" class="menusubmit" name="submit" id="searchsubmit" value="Search" />';
        $search .= '</form>';
        $search .= '</li>';
    }
    return $items;
}
add_filter('wp_nav_menu_items','menu_search', 10, 2); // <-- the 10 is the default priority, the 2 is the number of variables to pass to the callback function.

Remplacez  » footer-nav-mid  » par le slug de l’emplacement de votre menu. Ceci est défini lorsque vous enregistrez votre menu en utilisant register_nav_menu():

register_nav_menu('footer-nav-mid', 'Middle Footer Navigation');

J’espère que cela t’aides!

Solution n°3 trouvée

C’est une solution beaucoup plus simple – ajoutez ce qui suit à votre fichier functions.php :

add_filter('wp_nav_menu_items','add_search_box_to_menu', 10, 2);
function add_search_box_to_menu( $items, $args ) {
    if( $args->theme_location == 'primary' )
        return $items."<li class='menu-header-search'>".get_search_form(false)."</li>";
    return $items;
}

Dans cette fonction, vous verrez que l’instruction IF vérifie l’emplacement souhaité – plus précisément, cet exemple vérifie le menu principal :

if( $args->theme_location == 'primary' )

Vous pouvez également utiliser quelque chose comme ceci pour déterminer quel menu :

$args->menu->slug == ‘the_menu_slug’

S’il y a un menu principal, il renvoie tout ce que vous avez entre les guillemets « return $items »:

return $items."<li class='menu-header-search'>".get_search_form(false)."</li>";

Dans ce cas, j’ai créé un élément de liste et concaténé la fonction WP get_search_form() .

Plus important encore, pour que cela soit affiché dans votre menu en tant qu’élément de liste, vous devez définir get_search_form() sur false :

get_search_form(false)

C’est à cause de l’argument suivant dans la fonction get_search_form() :

$echo (bool) (Facultatif) Par défaut, echo et ne renvoie pas le formulaire. Valeur par défaut : vrai

  • Source (https://developer.wordpress.org/reference/functions/get_search_form/)

Cela permettra d’atteindre avec succès le formulaire de recherche souhaité dans n’importe quel menu particulier.

Catégories : Wordpress

Jean-Michel

Jean-Michel est en charge de la partie blog du site. Il met en place la stratégie de contenu et répond aux questions fréquentes sur Wordpress.

0 commentaire

Laisser un commentaire

Avatar placeholder

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *