web-dev-qa-db-fra.com

Débogage - essayer d'ajouter un champ de recherche aux menus

J'ai déjà posé une question similaire à stackoverflow ( https://stackoverflow.com/questions/22492292/add-filter-in-word-how-do-i-know-if-it -is-run ), mais c'était peut-être le mauvais endroit?

Comme vous pouvez le voir, j'essaie d'ajouter un champ de recherche de la manière recommandée par moi:

add_filter('wp_nav_menu_items','menu_search');
function menu_search($items){
  $search = '<li class="search">';
  $search .= '<form method="get" id="searchform" action="/">';
  $search .= '<input type="text" class="field" name="s" id="s" placeholder="Search" />';
  $search .= '</form>';
  $search .= '</li>';
  return $items . $search;
}

Cependant, je ne vois aucune trace de la boîte de recherche dans le menu. En fait, il semble que le code ajouté à add_filter ne soit même pas exécuté.

Il y a quelques choses que je ne sais pas ici. Je fais cela dans un nouveau thème, basé sur le thème de soulignement (voir http://underscores.me/ ) car j'avais besoin d'un poids très léger thème. Je commence à me demander si le code de filtrage est exécuté dans le thème du soulignement. Quel est le meilleur moyen de vérifier cela? (Je ne connais pas du tout le débogage php. Je viens d'ajouter la barre de débogage, etc.) Et ai-je oublié quelque chose dans le thème du soulignement ici? Je veux dire devrais-je avoir ajouté quelque chose pour qu'il puisse exécuter le filtrage?

1
Leo

wp_nav_menu_items ne sont pas mentionnés dans le codex, il n’ya donc pas de description concrète de son utilisation.

wp_nav_menu_items peut être trouvé sur la ligne 347 dans

wp-includes/nav-menu-template.php

$items = apply_filters( 'wp_nav_menu_items', $items, $args );

dans wp_nav_menu.

Dans le codex , il est indiqué ce qui suit:

Affiche un menu de navigation créé dans le panneau Apparence → Menus.

Cela signifie donc que wp_nav_menu_items n'est déclenché que lorsqu'un menu de navigation créé dans le panneau "menus" est présent, et non dans le menu de navigation par défaut. C'est un défaut de conception à mon avis. wp_nav_menu_items devrait également être inclus dans le menu par défaut. C'est également un aspect qui n'est mentionné dans aucun des tutoriels que j'ai testés.

J'ai testé un autre filtre, wp_list_pages, qui semble fonctionner comme prévu.

Il y a aussi un problème avec votre code. Lorsque je l'ajoute à la barre de navigation par défaut, toutes les recherches que je fais m'envoient à ma base de données. En fait encore. Je ne pouvais pas obtenir de bons exemples pour travailler. J'ai finalement trouvé ce code dans un plugin appelé dans le champ de recherche sur le menu de navigation .

<?php
add_filter('wp_nav_menu_items','add_search_box', 10, 2);
function add_search_box($items, $args) {

        ob_start();
        get_search_form();
        $searchform = ob_get_contents();
        ob_end_clean();

        $items .= '<li>' . $searchform . '</li>';

    return $items;
    }
?>

Pour que ce code fonctionne sur la barre de navigation par défaut, ajoutez simplement la ligne suivante au code add_filter('wp_list_pages','add_search_box', 10, 2); afin que votre code de fin soit:

<?php
add_filter('wp_list_pages','add_search_box', 10, 2);
add_filter('wp_nav_menu_items','add_search_box', 10, 2);
function add_search_box($items, $args) {

        ob_start();
        get_search_form();
        $searchform = ob_get_contents();
        ob_end_clean();

        $items .= '<li>' . $searchform . '</li>';

    return $items;
}    
?> 

J'espère que cette aide

1
Pieter Goosen

Vous pouvez aussi utiliser ceci

add_filter( 'wp_nav_menu_items','add_search_box', 10, 2 );
function add_search_box( $items, $args ) {
    $items .= '<li>' . get_search_form( false ) . '</li>';
    return $items;
}
0
umesh

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 recherche un emplacement souhaité. En particulier, cet exemple recherche 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 retourne ce que vous avez dans les citations "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 get_search_form () WP.

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

get_search_form(false)

Cela est dû à l'argument suivant de la fonction get_search_form ():

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

Cela permettra de réaliser avec succès le formulaire de recherche souhaité dans un menu particulier.

0
rockmandew