web-dev-qa-db-fra.com

Certains filtres de menu de navigation ne font rien

J'ai donc essayé d'écrire un plugin et je dois utiliser le filtre 'nav_menu_link_attributes'. J'ai essayé d'ajouter le filtre, mais il n'a pas répondu - du tout. C'est-à-dire que je l'ai fait mourir à mi-processus une fois le filtre appelé.

 ... 
 # dans la définition de classe 
 
 fonction publique __construct () {
 add_filter ('wp_nav_menu_objects', array ($ this, ' filter_menuitem ')); 
} 
 
 fonction publique filter_menuitem ($ attrs) {
 die (' SUCCESS !!! '); 
} 
 
 ... 

J'ai consulté la source de nav-menu-template.php pour voir quels filtres ont été appelés, pour quoi et quand. J'ai donc essayé d'utiliser les filtres suivants, l'un après l'autre, dans l'ordre dans lequel ils apparaissent dans le source. certains travaillaient, d'autres ne répondaient pas du tout:

 function wp_nav_menu () {
 wp_nav_menu_args Répondu 
 pre_wp_nav_menu Répondu 
 wp_nav_menu_container_allowedtags N'a pas répondu - pas une surprise [.____. a répondu 
 wp_nav_menu_items N'a pas répondu - aurait certainement dû répondre 
 wp_nav_menu N'a pas répondu - aurait certainement dû répondre 
} 

La seule solution qui aurait eu du sens était que le 'pre_wp_nav_menu' puisse être utilisé pour générer un menu personnalisé, en ignorant la méthode WP default qui appelle les filtres suivants. Mais j'ai essayé d'utiliser 3 thèmes différents, et je ne m'attendais pas à ce que ce soit le cas souvent, voire jamais.

Est-ce que je manque quelque chose? Est-ce un bug de WordPress? La génération de menus personnalisés est-elle vraiment si commune?

Détails:
WordPress 4.4.2
Thèmes testés: Thèmes élégants Divi 2.4.6.1, vingt treize, vingt quinze
Plugins: Seulement les miens, aucun n’utilise le filtre 'pre_wp_nav_menu'

RÉPONSE:
Donc, sur @ la réponse de Pieter Goosen , j’ai cherché dans la source de la fonction wp_nav_menu et trouvé le filtre 'wp_page_menu' qui est appelé dans le code HTML complet (no les nouvelles lignes, y compris les wrappers) une fois composé. Pour le contexte de ce que je fais c'est suffisant, et après l'avoir accroché et testé, j'ai trouvé que ça marche!

J'ai aussi constaté que le filtre 'wp_list_pages' fonctionnait également. Au lieu du code HTML complet avec toutes les balises, il ne répertorie que les balises <li> séparées par des nouvelles lignes. Aucun emballage n'est inclus, pas même la balise <ul>. Je suis cependant sceptique quant à ce qui pourrait utiliser cette fonction. Il ne peut pas être invoqué uniquement pour le menu. Ainsi, pour plus de sécurité, il serait peut-être préférable de vous en tenir au filtre 'wp_page_menu'.

3
Codesmith

Cela concerne l'argument fallback_cb dans wp_nav_menu(). La plupart des menus de navigation ne définissent pas ce paramètre, la valeur par défaut est donc wp_page_menu.

Si vous regardez le code source de wp_nav_menu() , sans fallback_cb set ( par défaut wp_page_menu), vous verra les lignes suivantes de code s'exécute

if ( ( !$menu || is_wp_error($menu) || ( isset($menu_items) && empty($menu_items) && !$args->theme_location ) )
    && isset( $args->fallback_cb ) && $args->fallback_cb && is_callable( $args->fallback_cb ) )
        return call_user_func( $args->fallback_cb, (array) $args );

Ce code est abandonné et charge wp_page_menu() . Ce code s'exécute après le filtre pre_wp_nav_menu, c'est pourquoi vous voyez que ce filtre est exécuté. Tous les filtres après que quelques lignes ne seront pas exécutées car wp_nav_menu() a maintenant chargé wp_page_menu().

Si vous testez maintenant les filtres dans wp_page_menu(), vous verrez qu'ils se déclenchent comme prévu.

Vous pouvez consulter ma réponse ici pour voir comment j'ai utilisé cela pour déterminer quel filtre utiliser

3
Pieter Goosen