Comment créer des éléments de menu personnalisés en dur
4 réponses
- votes
-
- 2011-04-24
Leproblème avec votre codeest qu'iln'ajoutepas réellement les liens vers lemenuet uniquement vers la sortie dumenu,d'où l'utilisation d'unfiltre (add_filter) donc vousfiltrez simplement la sortie dumenuen faitmême si vousne pas avoir demenu,votre lien sera affiché avec le code que vous utilisez. Maispour créer un lienet l'ajouter à unmenu,vouspouvez utiliser ce code:
$run_once = get_option('menu_check'); if (!$run_once){ //give your menu a name $name = 'theme default menu'; //create the menu $menu_id = wp_create_nav_menu($name); //then get the menu object by its name $menu = get_term_by( 'name', $name, 'nav_menu' ); //then add the actuall link/ menu item and you do this for each item you want to add wp_update_nav_menu_item($menu->term_id, 0, array( 'menu-item-title' => __('Home'), 'menu-item-classes' => 'home', 'menu-item-url' => home_url( '/' ), 'menu-item-status' => 'publish')); //then you set the wanted theme location $locations = get_theme_mod('nav_menu_locations'); $locations['main-menu'] = $menu->term_id; set_theme_mod( 'nav_menu_locations', $locations ); // then update the menu_check option to make sure this code only runs once update_option('menu_check', true); }
J'aitout commentépour simplifier les choses.
Pour créer unepageenfant/sous-page/menu de deuxièmeniveau (quelle que soit lamanière dont vouspouvez l'appeler),il vous suffit de définir le
menu-item-parent-id
dans lenouvel élémentparexemple ://create the top level menu item (home) $top_menu = wp_update_nav_menu_item($menu->term_id, 0, array( 'menu-item-title' => __('Home'), 'menu-item-classes' => 'home', 'menu-item-url' => home_url( '/' ), 'menu-item-status' => 'publish' 'menu-item-parent-id' => 0, )); //Sub menu item (first child) $first_child = wp_update_nav_menu_item($menu->term_id, 0, array( 'menu-item-title' => __('First_Child'), 'menu-item-classes' => 'home', 'menu-item-url' => home_url( '/' ), 'menu-item-status' => 'publish' 'menu-item-parent-id' => $top_menu, )); //Sub Sub menu item (first child) $Second_child = wp_update_nav_menu_item($menu->term_id, 0, array( 'menu-item-title' => __('Second_Child'), 'menu-item-classes' => 'home', 'menu-item-url' => home_url( '/' ), 'menu-item-status' => 'publish' 'menu-item-parent-id' => $first_child, ));
vouspouvez également définir lapositionpar code avec
menu-item-position
etje pense que c'estfait comme ça:- Premier élément - 'menu-item-position'=> 1
- Premier élément,premierenfant - 'menu-item-position'=> 1
- Premier élément deuxièmeenfant - 'menu-item-position'=> 1
- Premier élément deuxièmeenfantpremierenfant - 'menu-item-position'=> 1
- Deuxième élément - 'menu-item-position'=> 2
- 3e élément - 'menu-item-position'=> 3
- 4ème élément - 'menu-item-position'=> 4
The Problem with your code is that its not actually adding the links to the menu and only to the menu's output, hence the use of a filter (add_filter) so you are just filtering the output of the menu in fact even if you don't have a menu your link will be shown with the code you are using. But to create a link and add it to a menu you can use this code:
$run_once = get_option('menu_check'); if (!$run_once){ //give your menu a name $name = 'theme default menu'; //create the menu $menu_id = wp_create_nav_menu($name); //then get the menu object by its name $menu = get_term_by( 'name', $name, 'nav_menu' ); //then add the actuall link/ menu item and you do this for each item you want to add wp_update_nav_menu_item($menu->term_id, 0, array( 'menu-item-title' => __('Home'), 'menu-item-classes' => 'home', 'menu-item-url' => home_url( '/' ), 'menu-item-status' => 'publish')); //then you set the wanted theme location $locations = get_theme_mod('nav_menu_locations'); $locations['main-menu'] = $menu->term_id; set_theme_mod( 'nav_menu_locations', $locations ); // then update the menu_check option to make sure this code only runs once update_option('menu_check', true); }
I commented all over to make it simpler.
To create a child page/sub page/second level menu (how ever you may call it), you just need to set the
menu-item-parent-id
in the new item for example://create the top level menu item (home) $top_menu = wp_update_nav_menu_item($menu->term_id, 0, array( 'menu-item-title' => __('Home'), 'menu-item-classes' => 'home', 'menu-item-url' => home_url( '/' ), 'menu-item-status' => 'publish' 'menu-item-parent-id' => 0, )); //Sub menu item (first child) $first_child = wp_update_nav_menu_item($menu->term_id, 0, array( 'menu-item-title' => __('First_Child'), 'menu-item-classes' => 'home', 'menu-item-url' => home_url( '/' ), 'menu-item-status' => 'publish' 'menu-item-parent-id' => $top_menu, )); //Sub Sub menu item (first child) $Second_child = wp_update_nav_menu_item($menu->term_id, 0, array( 'menu-item-title' => __('Second_Child'), 'menu-item-classes' => 'home', 'menu-item-url' => home_url( '/' ), 'menu-item-status' => 'publish' 'menu-item-parent-id' => $first_child, ));
also you can set the position by code with
menu-item-position
and i think its done like this:- First item - 'menu-item-position' => 1
- First item first child - 'menu-item-position' => 1
- First item second child - 'menu-item-position' => 1
- First item second child first child - 'menu-item-position' => 1
- Second item - 'menu-item-position' => 2
- 3rd item - 'menu-item-position' => 3
- 4th item - 'menu-item-position' => 4
-
Ce sont lesfonctions queje cherchais :) codexne lesinclutpas: (Encore une question commentpuis-je ajouter un élémentenfant à l'élément d'accueil. Je vous leferai savoir dès quej'arriverai àmon PC. Merci!Those are the functions i was looking for :) codex does not included these :( One more question how can i add a item child to the Home item. I will let you know as soon as i get to my pc. Thanks!
- 0
- 2011-04-24
- Sisir
-
@Sisir:j'aimis àjour avec unexemple comment créer despagesenfants@Sisir: i updated with an example how to create child pages
- 0
- 2011-04-25
- Bainternet
-
@Bainternet: obtenu cetteerreur lors de lapremièreexécution du code `Erreurfatale: Impossible d'utiliser l'objet detype stdClass commetableau dans C: \ wamp \ www \ citystir \ wp-admin \menu.php sur la ligne 25`.Mais lemenuest crééet lorsque lapageest actualisée,toutfonctionnemais rienne s'affiche dans la section `Apparence -> Emplacement duthème dumenu`.Nous sommes vraimentproches :) Merci!@Bainternet: got this error when first run the code `Fatal error: Cannot use object of type stdClass as array in C:\wamp\www\citystir\wp-admin\menu.php on line 25`. But the menu is get created and when page refreshed everything works but nothing is showing in `Appearance -> Menu Theme Location` section. We are really close :) Thanks!
- 0
- 2011-04-28
- Sisir
-
@Bainternet: Je suppose que le code obtient uneerreur lorsqu'ilessaie d'exécuter le code `$ locations=get_theme_mod ('nav_menu_locations');` Donc,les codes avant cela (toute l'insertion demenuestterminée) sontexécutéset le code après cela(définir l'emplacement souhaité duthème)ne sontpasexécutés@Bainternet: My guess is the code is getting error when it trying to run the code `$locations = get_theme_mod('nav_menu_locations');` So, the codes before that (all the menu insertion is done) get executed and code after that (set the wanted theme location) don't get executed.
- 0
- 2011-04-28
- Sisir
-
@Sisir: le codefonctionnetrèsbien,quelest lenom de l'emplacement de votrethèmeet montrez-moi le codeexact que vous utilisez,je verrai sije peux vous aider.@Sisir: code is working just fine, what is your theme location name and show me the exact code you are using , i'll see if i can help.
- 0
- 2011-04-29
- Bainternet
-
@Bainternet: Ici http://pastebin.com/Px16q43a.Pâte utilisée.@Bainternet: Here http://pastebin.com/Px16q43a. Used pastebin.
- 0
- 2011-04-29
- Sisir
-
@Sisir: quelest lenom de l'emplacement de votremenu?@Sisir : what's your menu location name?
- 0
- 2011-04-29
- Bainternet
-
J'ai utilisé ce code dans lemenu denavigation `wp_nav_menu (array ('theme_location'=> 'main-menu'));` doncje suppose que lenom de l'emplacement duthèmeest `main-menu`,n'est-cepas?i used this code in nav menu ` wp_nav_menu( array( 'theme_location' => 'main-menu' ) );` so i guess the theme location name is `main-menu` right?
- 0
- 2011-04-30
- Sisir
-
ouimais vous deveztoujoursenregistrer cetemplacement dethèmeen utilisant `register_nav_menu ($ location,$ description);` avant d'essayer d'assigner unmenu à cetemplacement.yes but you still need to register this theme location using `register_nav_menu( $location, $description );` before you try to assign a menu to that location.
- 0
- 2011-04-30
- Bainternet
-
@Bainternet: Merci!lenom de l'emplacement duthèmeestmaintenant affiché.Mais l'erreur étaittoujours làjusqu'à ce queje lamette dans unefonction,puis quej'ajoute lafonction dansmapage d'options dethème.Maintenant,ilne fonctionnera que lorsque lebouton sera cliqué.Il semble que l'erreur soitpartie.Toutfonctionnebien maintenant.Mercipour votre aide.J'espère que vous arrivereztoujours àmes questions;)@Bainternet : Thanks! the theme location name is now showing. But the error was still there until i put it in a function then add the function in my theme option page. Now it will run only when button clicked. Seems that way the error is gone. Everything is working fine now. Thanks for all your help. I hope you always get to my questions ;)
- 0
- 2011-05-01
- Sisir
-
Content que vous l'ayez.Glad you got it.
- 0
- 2011-05-01
- Bainternet
-
@Bainternet: Salut,je devais vous déranger ànouveau :) Par lafonction `wp_update_nav_menu_item ()` les éléments demenu sont ajoutésen tant que lienpersonnalisé.Existe-t-il unmoyen d'ajouter des éléments demenu detype article oupage?C'estparce quemaintenant,lorsqueje mets àjourmonpermalien,les lienspersonnalisésne semettent pas àjour.Mais s'il s'agit d'éléments demenu detypepage,je mettrais àjour automatiquement.Je suppose queje suis assez clair.Merci!@Bainternet: Hi, i had to bother you again :) By function `wp_update_nav_menu_item()` the menu items are adding as custom link. Is there any way where i can add post, page type menu items? It is because now when i am updating my permalink the custom links does not updating. But if it is a page type menu items i would update automatically. I guess i am clear enough. Thanks!
- 0
- 2011-05-23
- Sisir
-
@Bainternet: Salut,l'attribut `menu-item-position` doit êtreincrémentiel de l'élément supérieur dumenu vers lebas,peuimporte s'il y a des sous-éléments ounon.J'aitrouvé ceciici: http://www.acousticwebdesign.net/wordpress/how-to-create-wordpress-3-navigation-menus-in-your-theme-or-plugin-code/.@Bainternet: Hi, the `menu-item-position` attribute has to be incremental from menu's top item to bottom, no matter if there are any subitems or not. I found this here: http://www.acousticwebdesign.net/wordpress/how-to-create-wordpress-3-navigation-menus-in-your-theme-or-plugin-code/.
- 0
- 2016-05-12
- Clawsy
-
- 2012-08-01
Votre code d'origineest trèsproche de l'argentet jepense sérieusement que cette longue solution de @Bainternet (sansinfraction)estexagérée,alorsjetez un œil à ceci à laplace:
function new_nav_menu_items($items, $args) { if( $args->theme_location == 'primary' ){ $homelink = '<li class="home"><a href="' . home_url( '/' ) . '">' . __('Home') . '</a></li>'; $items = $homelink . $items; } return $items; } add_filter( 'wp_nav_menu_items', 'new_nav_menu_items', 10, 2 );
Votre seulproblème était que vousne renvoyiezpas $items après que lafonction ait vérifié lebonmenuet que vousmanquiez le deuxième argument de rappelnécessairepoureffectuer la vérification ( $args ).
Your original code is very close to the money and I seriously think the this long solution by @Bainternet (no offence) is overkill, so have a look at this instead:
function new_nav_menu_items($items, $args) { if( $args->theme_location == 'primary' ){ $homelink = '<li class="home"><a href="' . home_url( '/' ) . '">' . __('Home') . '</a></li>'; $items = $homelink . $items; } return $items; } add_filter( 'wp_nav_menu_items', 'new_nav_menu_items', 10, 2 );
Your only problem was that you were not returning $items after the function checked for the correct menu, and you were missing the second callback argument that was needed to make the check ($args).
-
Comment définiriez-vous l'emplacement de l'élément demenuen utilisant cetteméthode?How would you set the location of the menu item using this method?
- 0
- 2014-11-04
- Michael N
-
- 2012-11-26
Il y a unbogue dans Wordpress 3.4.2:
Vous devez créer leterme relationmanuellement:
$menu = wp_get_nav_menu_object('top menu'); $id = wp_update_nav_menu_item($menu->term_id, 0, $data); if ($menu->term_id && (!is_object_in_term($id, 'nav_menu', (int)$menu->term_id))) { wp_set_post_terms($id, array((int)$this->id), 'nav_menu'); }
Voir https://gist.github.com/4148529 pour unexemple de la classe Menupourcréation demenu simple.
There's a bug in Wordpress 3.4.2:
You need to create the term relation manually:
$menu = wp_get_nav_menu_object('top menu'); $id = wp_update_nav_menu_item($menu->term_id, 0, $data); if ($menu->term_id && (!is_object_in_term($id, 'nav_menu', (int)$menu->term_id))) { wp_set_post_terms($id, array((int)$this->id), 'nav_menu'); }
See https://gist.github.com/4148529 for an example of the Menu class for simple menu creation.
-
- 2013-08-02
Pourinformation,l'utilisateur actuel doit avoir le droit d'ajouter destermes,mes éléments demenu ont été créésmaispas ajoutés dans latable wp_terms_relationship avant d'ajouter un appel à wp_set_current_user (1);
For information, current user has to got rights to add terms, my menu_items were created but not added in the table wp_terms_relationship before I add a call to wp_set_current_user(1);
Est-ilpossible de coderen dur les éléments demenupersonnalisés lors de l'installation dupremierthème? Je crée unthème qui créera automatiquement despages communes unefoisinstallé. J'ai doncbesoin de savoir sije peux également les ajouter aumenupersonnalisé de Wordpresspour que le clientn'aitpasbesoin de les ajoutermanuellement?
En d'autrestermes: commentinsérer/créer un élément demenupersonnaliséparprogrammation?
Faites-moi savoir si quelque chosen'estpas clair. Leguide de lapage codex appropriéeest lebienvenu. Merci!
mise àjour: aessayé le code àpartir d'ici Menu spécifique au ciblage avec wp_nav_menu_items
Inscription aumenu:
Utilisation dumodèle:
Code d'ajout denouveaux éléments:
lors de l'ajout du codepour ajouter denouveaux éléments dans lemenu denavigation dans lefichier
functions.php
,rienne sepasse dans lapage demenu dupanneau d'administrationmais les éléments demenu actuels ont disparu dans le site!