Comment coder en dur les éléments de menu personnalisés

22

Existe-t-il un moyen de coder en dur les éléments de menu personnalisés lors de l'installation du premier thème? Je crée un thème qui créera automatiquement des pages communes lors de l'installation. J'ai donc besoin de savoir si je peux également les ajouter au menu personnalisé de Wordpress afin que le client n'ait pas besoin de les ajouter manuellement?

En d'autres termes: comment insérer / créer un élément de menu personnalisé par programme?

Faites-moi savoir si quelque chose n'est pas clair. Le guide vers la page appropriée du codex est le bienvenu. Merci!


mise à jour: code essayé d'ici Cibler un menu spécifique avec wp_nav_menu_items

Inscription au menu:

function register_my_menus() {
  register_nav_menus(
    array('main-menu' => __( 'Main Menu' ) )
  );
}

add_action( 'init', 'register_my_menus' );

Utilisation du modèle:

<?php wp_nav_menu( array( 'theme_location' => 'main-menu' ) ); ?>

Code pour ajouter de nouveaux éléments:

function new_nav_menu_items($items) {
    if( $args->theme_location == 'main-menu' ){
    $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 );

lors de l'ajout du code pour ajouter de nouveaux éléments dans le menu de navigation dans le functions.phpfichier, rien ne se passe dans la page de menu du panneau d'administration, mais les éléments de menu actuels ont disparu dans le site!

Sisir
la source

Réponses:

23

Le problème avec votre code est qu'il n'ajoute pas réellement les liens au menu et seulement à la sortie du menu, d'où l'utilisation d'un filtre (add_filter) donc vous filtrez juste la sortie du menu en fait même si vous ne le faites pas avoir un menu votre lien sera affiché avec le code que vous utilisez. Mais pour créer un lien et l'ajouter à un menu, vous pouvez 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'ai commenté partout pour le rendre plus simple.

Pour créer une page enfant / sous-page / menu de deuxième niveau (comme vous pouvez l'appeler), il vous suffit de définir le menu-item-parent-iddans le nouvel élément, par exemple:

//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,
    ));

vous pouvez également définir la position par code avec menu-item-position et je pense que c'est fait comme ceci:

  • Premier élément - 'menu-item-position' => 1
    • Premier élément premier enfant - 'menu-item-position' => 1
    • Premier élément deuxième enfant - 'menu-item-position' => 1
      • Premier élément deuxième enfant premier enfant - 'menu-item-position' => 1
  • Deuxième élément - 'menu-item-position' => 2
  • 3ème élément - 'menu-item-position' => 3
  • 4ème élément - 'menu-item-position' => 4
Bainternet
la source
Ce sont les fonctions que je cherchais :) codex ne les incluait pas :( Encore une question comment puis-je ajouter un élément enfant à l'élément Accueil. Je vous le ferai savoir dès que
j'arriverai
@Sisir: j'ai mis à jour avec un exemple comment créer des pages enfants
Bainternet
@Bainternet: obtenu cette erreur lors de la première exécution du code Fatal error: Cannot use object of type stdClass as array in C:\wamp\www\citystir\wp-admin\menu.php on line 25. Mais le menu est créé et lorsque la page est actualisée, tout fonctionne, mais rien ne s'affiche dans la Appearance -> Menu Theme Locationsection. Nous sommes vraiment proches :) Merci!
Sisir
@Bainternet: Je suppose que le code obtient une erreur lorsqu'il essaie d'exécuter le code $locations = get_theme_mod('nav_menu_locations');Donc, les codes avant cela (toute l'insertion du menu est effectuée) sont exécutés et le code après cela (définissez l'emplacement du thème souhaité) ne sont pas exécutés .
Sisir
@Sisir: le code fonctionne très bien, quel est le nom de l'emplacement de votre thème et montrez-moi le code exact que vous utilisez, je vais voir si je peux vous aider.
Bainternet
8

Votre code d'origine est très proche de l'argent et je pense sérieusement que la longue solution de @Bainternet (sans infraction) est exagérée, alors jetez un œil à ceci:

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 seul problème était que vous ne renvoyiez pas $ items après que la fonction a recherché le menu correct et que vous manquiez le deuxième argument de rappel qui était nécessaire pour effectuer la vérification ( $ args ).

Foxinni
la source
Comment définiriez-vous l'emplacement de l'élément de menu en utilisant cette méthode?
Michael N
1

Il y a un bug dans Wordpress 3.4.2:

https://github.com/WordPress/WordPress/commit/ae96b842f9f55ecfb22da705a4902b9d25580259#wp-includes/nav-menu.php

Vous devez créer le terme relation manuellement:

$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 un exemple de la classe Menu pour une création de menu simple.

OzzyCzech
la source
0

Pour information, l'utilisateur actuel doit avoir le droit d'ajouter des termes, mes éléments menu_items ont été créés mais pas ajoutés dans la table wp_terms_relationship avant d'ajouter un appel à wp_set_current_user (1);

Grégocentrique
la source