Ajouter par programme un menu de navigation et des éléments de menu
4 réponses
- votes
-
- 2012-03-07
Je vous comprendspeut-êtremal,maispourquoine pas utiliser
wp_create_nav_menu()
?Parexemple,voici ce queje faispour créer unmenu BuddyPresspersonnalisé lorsqueje détecte BP comme actif:
$menuname = $lblg_themename . ' BuddyPress Menu'; $bpmenulocation = 'lblgbpmenu'; // Does the menu exist already? $menu_exists = wp_get_nav_menu_object( $menuname ); // If it doesn't exist, let's create it. if( !$menu_exists){ $menu_id = wp_create_nav_menu($menuname); // Set up default BuddyPress links and add them to the menu. wp_update_nav_menu_item($menu_id, 0, array( 'menu-item-title' => __('Home'), 'menu-item-classes' => 'home', 'menu-item-url' => home_url( '/' ), 'menu-item-status' => 'publish')); wp_update_nav_menu_item($menu_id, 0, array( 'menu-item-title' => __('Activity'), 'menu-item-classes' => 'activity', 'menu-item-url' => home_url( '/activity/' ), 'menu-item-status' => 'publish')); wp_update_nav_menu_item($menu_id, 0, array( 'menu-item-title' => __('Members'), 'menu-item-classes' => 'members', 'menu-item-url' => home_url( '/members/' ), 'menu-item-status' => 'publish')); wp_update_nav_menu_item($menu_id, 0, array( 'menu-item-title' => __('Groups'), 'menu-item-classes' => 'groups', 'menu-item-url' => home_url( '/groups/' ), 'menu-item-status' => 'publish')); wp_update_nav_menu_item($menu_id, 0, array( 'menu-item-title' => __('Forums'), 'menu-item-classes' => 'forums', 'menu-item-url' => home_url( '/forums/' ), 'menu-item-status' => 'publish')); // Grab the theme locations and assign our newly-created menu // to the BuddyPress menu location. if( !has_nav_menu( $bpmenulocation ) ){ $locations = get_theme_mod('nav_menu_locations'); $locations[$bpmenulocation] = $menu_id; set_theme_mod( 'nav_menu_locations', $locations ); }
I might be misunderstanding you, but why not use
wp_create_nav_menu()
?E.g., this is what I do to create a custom BuddyPress menu when I detect BP as active:
$menuname = $lblg_themename . ' BuddyPress Menu'; $bpmenulocation = 'lblgbpmenu'; // Does the menu exist already? $menu_exists = wp_get_nav_menu_object( $menuname ); // If it doesn't exist, let's create it. if( !$menu_exists){ $menu_id = wp_create_nav_menu($menuname); // Set up default BuddyPress links and add them to the menu. wp_update_nav_menu_item($menu_id, 0, array( 'menu-item-title' => __('Home'), 'menu-item-classes' => 'home', 'menu-item-url' => home_url( '/' ), 'menu-item-status' => 'publish')); wp_update_nav_menu_item($menu_id, 0, array( 'menu-item-title' => __('Activity'), 'menu-item-classes' => 'activity', 'menu-item-url' => home_url( '/activity/' ), 'menu-item-status' => 'publish')); wp_update_nav_menu_item($menu_id, 0, array( 'menu-item-title' => __('Members'), 'menu-item-classes' => 'members', 'menu-item-url' => home_url( '/members/' ), 'menu-item-status' => 'publish')); wp_update_nav_menu_item($menu_id, 0, array( 'menu-item-title' => __('Groups'), 'menu-item-classes' => 'groups', 'menu-item-url' => home_url( '/groups/' ), 'menu-item-status' => 'publish')); wp_update_nav_menu_item($menu_id, 0, array( 'menu-item-title' => __('Forums'), 'menu-item-classes' => 'forums', 'menu-item-url' => home_url( '/forums/' ), 'menu-item-status' => 'publish')); // Grab the theme locations and assign our newly-created menu // to the BuddyPress menu location. if( !has_nav_menu( $bpmenulocation ) ){ $locations = get_theme_mod('nav_menu_locations'); $locations[$bpmenulocation] = $menu_id; set_theme_mod( 'nav_menu_locations', $locations ); }
-
Jene connaissaispas cettefonction.Oui,je suppose que cela rendra le code ci-dessusbeaucoupplus court.Je suppose queje devrais aller au-delà du Codexet plonger dans le code réel,carje trouve que lesfonctions de l'API sont souvent,comme dans ce cas,tropbas.Merci!I didn't know about this function. Yes, I guess it will make the above code much shorter. I guess I should move beyond the Codex and dive into the actual code, as I find that the API functions are often, like in this case, too low-level. Thanks!
- 0
- 2012-03-07
- julien_c
-
@julien_c si celaest résolu,marquez-le commetelpourpermettre à ceux qui vous suivront deprofiter de votreexpérienceici.@julien_c if this is solved, mark it as such to allow those who come after you to benefit from your experience here.
- 0
- 2012-03-07
- mor7ifer
-
Je veuxjuste letester dans la vraie vie doncje suis sûr qu'ilfait ce queje veux.Jeme souviendrai de lemarquer comme résolu dès quej'aiterminé!I just want to actually test it in real life so I'm sure it does what I want. I'll remember to mark it as solved as soon as I'm done!
- 0
- 2012-03-07
- julien_c
-
Si vous voyez desfonctions utiles comme celles-ci quine sontpas dans le codex,c'est unebonneidée de les ajouter (yay wiki)=pIf you see useful functions like these that aren't in the codex, it's a good idea to add them (yay wiki) =p
- 3
- 2012-03-09
- Tom J Nowell
-
Désolé,ilm'afallu si longtempspour vérifier que celafonctionnait dansmon cas.Réponse acceptée!Deplus,vous définissez des éléments demenu * lienspersonnalisés *,j'ai ajouté une réponse ci-dessouspour définir * les liens depage * (qui serontplus robustes aux changements d'URL,parexemple).Sorry it took me such a long time to check that it worked in my case. Answer accepted! Also, you're defining *custom links* menu items, I've added an answer below to define *page links* (which will be more robust to URL changes, for example).
- 0
- 2012-05-15
- julien_c
-
Commentpouvez-vous créer des sous-pagesen utilisant cette approche?How can you create subpages using this approach?
- 0
- 2013-12-28
- Joren
-
http://hookr.io/3.9.1/actions/do_action/wp_create_nav_menu/http://hookr.io/3.9.1/actions/do_action/wp_create_nav_menu/
- 0
- 2015-03-28
- Adam
-
- 2012-05-15
En complément de la réponse de ZaMoose,voici comment créer un élément demenu detype " Page " (pas un élément " Personnalisé "):
wp_update_nav_menu_item($menu_id, 0, array('menu-item-title' => 'About', 'menu-item-object' => 'page', 'menu-item-object-id' => get_page_by_path('about')->ID, 'menu-item-type' => 'post_type', 'menu-item-status' => 'publish'));
En supposant que vousne connaissiez que le slug depage,parexemple.
As a complement to ZaMoose's anwser, here's how you would create a "Page-type" menu item (not a "Custom" one):
wp_update_nav_menu_item($menu_id, 0, array('menu-item-title' => 'About', 'menu-item-object' => 'page', 'menu-item-object-id' => get_page_by_path('about')->ID, 'menu-item-type' => 'post_type', 'menu-item-status' => 'publish'));
Assuming you only know the page slug, for instance.
-
- 2013-05-01
J'ai quelquesproblèmes avec la réponse acceptée - celane faitpas demal,maisje publieraimonpropre code ci-dessous qui,àmon avis,pourrait avoir unmeilleur résultatpour certainespersonnespuisquej'avais lamême questionmais queje voulaisfaites lamême chose avecmoins de code.
Premièrement,le code ci-dessus crée des éléments denavigation detype "URL",ce quiestbien pour certainespersonnesmaisje veux créer un lien vers des PAGES,pas des URL car c'est unefonctionnalitéimportante desnavigations WordPresset les clients déplacentinévitablement les choses,doncje utilisez letype d'élément denavigation URL.
Deplus,seul untableauplat d'enfantsestgérépar le code affiché. J'ai créé unefonctionpour déclarer récursivement lesnouveaux éléments denavigation,stocker leursmétadonnées retournées (principalement leur ID après avoir été créé dans laboucle)et unparamètrepour accepter lesenfants.
Modifiez simplement
$nav_items_to_add
et le resteestgéré demanière récursive. Il y a 3 clés requises dans chaquetableau. Tout d'abord,la clé dutableauest le slug,donc'shop' => array( ... )
est ce que vous voulezpour unepage avec le slugshop
.['title']
est lafaçon dont l'élément denavigation sera étiqueté sur lefront-end.path
est le chemin d'accès à lapage dans la hiérarchie despages WordPress,ilest doncidentique au slug si lapageest unparent depremierniveau,et sishop
était unenfant dehome
alors ce serait'path' => 'home/shop'
.La dernière cléfacultative dutableauest
['parent']
où vouspouvez déclarer une autre clé dutableau commeparent de la clé actuelle. Ilestimportant denoter que les éléments sont ajoutés demanière récursive,de sorte que leparent doitexister avant d'essayer de créer unenfant. Cela signifie que la déclaration doit avoir lieupour l'élément denavigationparent avant sesenfants.$locations = get_nav_menu_locations(); if (isset($locations['primary_navigation'])) { $menu_id = $locations['primary_navigation']; $new_menu_obj = array(); $nav_items_to_add = array( 'shop' => array( 'title' => 'Shop', 'path' => 'shop', ), 'shop_l2' => array( 'title' => 'Shop', 'path' => 'shop', 'parent' => 'shop', ), 'cart' => array( 'title' => 'Cart', 'path' => 'shop/cart', 'parent' => 'shop', ), 'checkout' => array( 'title' => 'Checkout', 'path' => 'shop/checkout', 'parent' => 'shop', ), 'my-account' => array( 'title' => 'My Account', 'path' => 'shop/my-account', 'parent' => 'shop', ), 'lost-password' => array( 'title' => 'Lost Password', 'path' => 'shop/my-account/lost-password', 'parent' => 'my-account', ), 'edit-address' => array( 'title' => 'Edit My Address', 'path' => 'shop/my-account/edit-address', 'parent' => 'my-account', ), ); foreach ( $nav_items_to_add as $slug => $nav_item ) { $new_menu_obj[$slug] = array(); if ( array_key_exists( 'parent', $nav_item ) ) $new_menu_obj[$slug]['parent'] = $nav_item['parent']; $new_menu_obj[$slug]['id'] = wp_update_nav_menu_item($menu_id, 0, array( 'menu-item-title' => $nav_item['title'], 'menu-item-object' => 'page', 'menu-item-parent-id' => $new_menu_obj[ $nav_item['parent'] ]['id'], 'menu-item-object-id' => get_page_by_path( $nav_item['path'] )->ID, 'menu-item-type' => 'post_type', 'menu-item-status' => 'publish') ); } }
I have a few issues with the accepted answer - that doesn't make it wrong, but I'll post my own code below which I feel might have a better result for some people since I had the same question but wanted to do the same thing with less code.
First, the above code creates "URL" type navigation items, which is fine for some people but I want to link to PAGES, not URLs because this is an important feature of WordPress navigations and clients inevitable move things around so I never use the URL nav item type.
Also, only a flat array of children is handled by the posted code. I've created a function for recursively declaring the new nav items, storing their returned metadata (mainly ID after being created in the loop), and a parameter for accepting children.
Just edit
$nav_items_to_add
and the rest is handled recursively. There are 3 required keys in each array. First, the array key is the slug, so'shop' => array( ... )
is what you want for a page with the slugshop
.['title']
is the way the nav item will be labeled on the front end.path
is the path to the page within the WordPress page hierarchy, so this is identical to the slug if the page is a top-level parent, and ifshop
were a child ofhome
then it would be'path' => 'home/shop'
.The last optional array key is
['parent']
where you can declare another key in the array as the parent of the current one. It's important to note that the items are added recursively, so the parent has to exist before you try to create a child. This means the declaration should happen for the parent nav item before it's children.$locations = get_nav_menu_locations(); if (isset($locations['primary_navigation'])) { $menu_id = $locations['primary_navigation']; $new_menu_obj = array(); $nav_items_to_add = array( 'shop' => array( 'title' => 'Shop', 'path' => 'shop', ), 'shop_l2' => array( 'title' => 'Shop', 'path' => 'shop', 'parent' => 'shop', ), 'cart' => array( 'title' => 'Cart', 'path' => 'shop/cart', 'parent' => 'shop', ), 'checkout' => array( 'title' => 'Checkout', 'path' => 'shop/checkout', 'parent' => 'shop', ), 'my-account' => array( 'title' => 'My Account', 'path' => 'shop/my-account', 'parent' => 'shop', ), 'lost-password' => array( 'title' => 'Lost Password', 'path' => 'shop/my-account/lost-password', 'parent' => 'my-account', ), 'edit-address' => array( 'title' => 'Edit My Address', 'path' => 'shop/my-account/edit-address', 'parent' => 'my-account', ), ); foreach ( $nav_items_to_add as $slug => $nav_item ) { $new_menu_obj[$slug] = array(); if ( array_key_exists( 'parent', $nav_item ) ) $new_menu_obj[$slug]['parent'] = $nav_item['parent']; $new_menu_obj[$slug]['id'] = wp_update_nav_menu_item($menu_id, 0, array( 'menu-item-title' => $nav_item['title'], 'menu-item-object' => 'page', 'menu-item-parent-id' => $new_menu_obj[ $nav_item['parent'] ]['id'], 'menu-item-object-id' => get_page_by_path( $nav_item['path'] )->ID, 'menu-item-type' => 'post_type', 'menu-item-status' => 'publish') ); } }
-
C'est une solutiontrèsintelligente.Merci d'avoir ajouté ceci.Exactement ce dontj'avaisbesoin.That is a very smart solution. Thanks for adding this. Exactly what I needed.
- 1
- 2020-06-02
- Juergen
-
- 2016-03-08
Pour ajouter un élément demenuparprogramme. vouspouvez accrocher aufiltre
wp_nav_menu_items
.placez ci-dessous le code dans votrethèmefunctions.phppour ajouter un élément demenu de connexion/déconnexion dans lemenuprincipal. «Primaire»est lenom/identifiant dumenuenregistré./** * Add login logout menu item in the main menu. * =========================================== */ add_filter( 'wp_nav_menu_items', 'lunchbox_add_loginout_link', 10, 2 ); function lunchbox_add_loginout_link( $items, $args ) { /** * If menu primary menu is set & user is logged in. */ if ( is_user_logged_in() && $args->theme_location == 'primary' ) { $items .= '<li><a href="'. wp_logout_url() .'">Log Out</a></li>'; } /** * Else display login menu item. */ elseif ( !is_user_logged_in() && $args->theme_location == 'primary' ) { $items .= '<li><a href="'. site_url('wp-login.php') .'">Log In</a></li>'; } return $items; }
To add a menu item Programmatically. you can hook to
wp_nav_menu_items
filter. place below code in your theme functions.php to add login/logout menu item in the main menu. 'Primary' is the name/id of the menu registered./** * Add login logout menu item in the main menu. * =========================================== */ add_filter( 'wp_nav_menu_items', 'lunchbox_add_loginout_link', 10, 2 ); function lunchbox_add_loginout_link( $items, $args ) { /** * If menu primary menu is set & user is logged in. */ if ( is_user_logged_in() && $args->theme_location == 'primary' ) { $items .= '<li><a href="'. wp_logout_url() .'">Log Out</a></li>'; } /** * Else display login menu item. */ elseif ( !is_user_logged_in() && $args->theme_location == 'primary' ) { $items .= '<li><a href="'. site_url('wp-login.php') .'">Log In</a></li>'; } return $items; }
Grâce auxfonctions de l'API,je souhaite définir unnouveau menu denavigation ,le sélectionner dans lethème actuel,puisen insérer quelques Pages comme éléments demenu. Cela doit êtrefaitparexemple lors d'une activation dethème.
Grâce à unprocessus (modérément douloureux) de rétro-ingénierie de labase de donnéesinsèreet met àjour après avoir configurémanuellement lemenuet les éléments denavigation,j'ai reconstitué les étapes suivantes,où ``footer-nav ''est l'ID slug de lanavigationmenu queje crée:
Cela semblefonctionner,mais: