web-dev-qa-db-fra.com

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

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!


update: code essayé à partir d'ici Menu de ciblage spécifique 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 pour l'ajout 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 l'ajout 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!

22
Sisir

Le problème avec votre code est qu’il n’ajoute pas réellement les liens au menu et 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 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 un menu de page/sous-page/deuxième niveau enfant (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,
    ));

aussi vous pouvez définir la position par code avec menu-item-position et je pense que cela se 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
23
Bainternet

Votre code d'origine est très proche de l'argent et je pense sérieusement que cette longue solution de @Bainternet (aucune infraction) est exagérée, 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 retourniez pas $ items après que la fonction ait vérifié le bon menu et qu'il vous manquait le deuxième argument de rappel nécessaire pour effectuer la vérification ( $ args ).

7
Foxinni

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 obtenir un exemple de la classe Menu permettant de créer un menu simple.

1
OzzyCzech

Pour information, l'utilisateur actuel doit avoir les droits pour ajouter des termes, mes menu_items ont été créés mais pas ajoutés à la table wp_terms_relationship avant que j'ajoute un appel à wp_set_current_user (1);

0
Grégocentrique