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 une fois installé. J'ai donc besoin de savoir si je peux aussi 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 de la page de codex appropriée est le bienvenu. Merci!

mise à jour: le code essayé à partir d'ici Menu spécifique de ciblage avec wp_nav_menu_items

Enregistrement du 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 permettant d'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 permettant d'ajouter de nouveaux éléments dans le menu de navigation dans functions.php les annotations de fichier se produisent dans la page de menu du panneau d'administration, mais les éléments de menu actuels ont disparu du site!

    
posée Sisir 23.04.2011 - 18:24
la source

4 réponses

23

Le problème avec votre code est qu’il n’ajoute pas les liens au menu mais uniquement à la sortie du menu, d’où l’utilisation d’un filtre (add_filter) afin que vous ne fassiez que filtrer la sortie du menu même si vous ne 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 simplifier.

Pour créer un menu de page enfant / sous page / deuxième niveau (comme vous pouvez l'appeler), il vous suffit de définir le menu-item-parent-id dans 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 sa fait comme ça:

  • 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
réponse donnée Bainternet 24.04.2011 - 05:03
la source
7

Votre code d'origine est très proche de l'argent et je pense sérieusement que cette solution longue de @Bainternet (aucune infraction) est excessive, regardez plutôt 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 la vérification du menu correct par la fonction et qu'il vous manquait le deuxième argument de rappel nécessaire pour effectuer la vérification ( $ args ).

    
réponse donnée Foxinni 01.08.2012 - 12:43
la source
1

Il y a un bug dans Wordpress 3.4.2:

enlace

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 enlace pour obtenir un exemple de la classe Menu permettant la création de menus simples.

    
réponse donnée OzzyCzech 26.11.2012 - 15:29
la source
0

Pour information, l'utilisateur actuel doit disposer des droits pour ajouter des termes, mes éléments de menu ont été créés mais non ajoutés dans la table wp_terms_relationship avant d'ajouter un appel à wp_set_current_user (1);

    
réponse donnée Grégocentrique 02.08.2013 - 15:43
la source

Lire d'autres questions sur les étiquettes