8768 sujets

Développement web côté serveur, CMS

Modérateur
Bonjour,

Le menu principal du projet dont je m'occupe est constitué de dix menus générés en utilisant la rubrique "Apparence » Menu" de l'admin.
Dans mon fichier functions.php j'ai donc ceci :

register_nav_menus( array(
    'menu-1' => __('Menu « 1 »'),
    'menu-2' => __('Menu « 2 »'),
    'menu-3' => __('Menu « 3 »'),
    'menu-4' => __('Menu « 4 »'),
    'menu-5' => __('Menu « 5 »'),
    'menu-6' => __('Menu « 6 »'),
    'menu-7' => __('Menu « 7 »'),
    'menu-8' => __('Menu « 8 »'),
    'menu-9' => __('Menu « 9 »'),
    'menu-10' => __('Menu « 10 »')
) );

Chaque menu correspond à 1 élément principal de mon menu général (avec des sous-éléments qui s'affichent en-dessous).
Menu 1 | Menu 2 | Menu 3 |...

Je ne rentre pas plus dans les détails, cela n'a pas énormément d'importance pour ce que je recherche.
Je souhaiterais pouvoir récupérer l'id (menu-1, menu-2,..) du menu qui a été utilisé pour arriver sur une des pages. Par exemple, je clique dans le menu "menu-3" sur un des sous-éléments et je veux pourvoir récupérer sur la page qui s'affiche "menu-3" (côté serveur, pas en JavaScript).
Je ne sais pas si j'ai été clair, mais merci d'avance pour votre coup de pouce Smiley smile
Modifié par jojaba (20 Jul 2016 - 14:20)
Bonjour Jojaba,
Être obligé de créer autant de menus dans le seul but de maîtriser l'affichage du html des sous-menus... à mon avis il y a un souci.
Il existe au moins deux solutions pour maîtriser le html de sortie tout en gardant le systême natif de gestion de la hiérarchie par glisser-déplacer. Le plus connu des deux - que je n'utilise pas encore - s'appelle le memu walker.

Moi j'utilise ça :
https://github.com/Scriptura/ScripturaTheme/blob/master/Functions/MainNav.php
Modifié par Olivier C (19 Jul 2016 - 08:52)
Modérateur
Merci Olivier pour ton avis.
J'ai opté pour ce système de menu pour différentes raisons, pas seulement pour l'affichage HTML, de plus, reprendre tout cela (chaque menu est composé de plusieurs dizaines d'éléments,principalement des pages) pour en refaire un seul menu va me prendre beaucoup de temps... Maintenant, si on ne toruve aucun autre moyen, va peut-être falloir tout de même penser à reprendre à zéro...
Si je comprends bien ton message, cela sera difficile, pour ne pas dire impossible, de retrouver l'id du menu dans lequel se trouve le "$current_item".
Effectivement, à part stocker le résultat d'une action sur le sous-menu dans une variable pour ensuite la passer en get ou post... je ne vois pas trop.
Modérateur
J'ai essayé de me documenter sur menu_walker qui me semble être une solution intéressante (je ne connaissais pas du tout cet argument de la fonction wp_nav_menu()). Quelques ressources :
¤ Dans le codex : https://codex.wordpress.org/Class_Reference/Walker (voir l'exemple en fin d'article pour ce qui concerne l'utilisation avec un menu).
¤ Les walkers WordPress (article par Willy Bahuaud, mis à jour régulièrement apparemment) : https://wabeo.fr/construire-walker-wordpress/
Ça m'a l'air très puissant effectivement. J'avoue que la programmation objet, c'est pas mon fort, mais les explications sont tout à fait compréhensibles (de plus on conseille de partir de code déjà existant qu'il suffit de modifier) et cela me paraît être une fonctionnalité vraiment très pratique (modifier l'affichage du menu selon ses besoins).
Mais comme dit auparavant, si je pouvais garder la structure actuelle et trouver un moyen simple pour récupérer l'id du menu contenant l'élément courant ce serait chouette...
Il existe des "hook" pour intervenir sur le menu, Willy en parle ici : https://wabeo.fr/hook-nav-menus/
Ce serait peut-être une solution pour définir une variable globale indiquant l'id du menu dans lequel se trouve l'élément courant... Je vais creuser ça et revenir ici pour faire mon rapport Smiley cligne
Edit : Je pense que l'exempe suivant avec le filtre wp_nav_menu_objects devrait être une bonne source d'inspiration : https://wabeo.fr/hook-nav-menus/#nafficher-le-sous-menu-que-pour-lelement-courant
Modifié par jojaba (20 Jul 2016 - 06:40)
Modérateur
Voilà ce que j'ai pu mettre en place avec succès :

/* get the menu containing the current item */
add_filter( 'wp_nav_menu_objects', 'get_menu_loc_with_current_item', 10, 2 );
function get_menu_loc_with_current_item( $sorted_menu_items, $args ) { 
    if($sorted_menu_items[1]->current_item_ancestor == 1)
        $_POST['menu_with_current_item'] = $args->theme_location;
    return $sorted_menu_items;
}

On récupère donc l'id du menu dans lequel se trouve l'élément courant dans $_POST['menu_with_current_item']. Dans mon cas, je ne vérifie que le premier élément de chaque menu ($sorted_menu_items[1]), puisque c'est lui qui sera "ancêtre" de l'élément courant.
Comme indiqué précédemment, inspiré de l'exemple suivant : https://wabeo.fr/hook-nav-menus/#nafficher-le-sous-menu-que-pour-lelement-courant
Modifié par jojaba (20 Jul 2016 - 14:19)