Grâce aux fonctions de l’API, je souhaite définir un nouveau menu de navigation , le sélectionner dans le thème actuel, puis insérer quelques pages en tant qu’éléments de menu. Cela doit être fait par exemple sur une activation de thème.
Grâce à un processus (moyennement pénible) de reverse engineering des insertions et des mises à jour de la base de données après avoir configuré manuellement le menu de navigation et les éléments, j'ai regroupé les étapes suivantes, où 'footer-nav' est l'identifiant du slug du menu de navigation I ' m créant:
if (!term_exists('footer-nav', 'nav_menu')) {
$menu = wp_insert_term('Footer nav', 'nav_menu', array('slug' => 'footer-nav'));
// Select this menu in the current theme
update_option('theme_mods_'.get_current_theme(), array("nav_menu_locations" => array("primary" => $menu['term_id'])));
// Insert new page
$page = wp_insert_post(array('post_title' => 'Blog',
'post_content' => '',
'post_status' => 'publish',
'post_type' => 'page'));
// Insert new nav_menu_item
$nav_item = wp_insert_post(array('post_title' => 'News',
'post_content' => '',
'post_status' => 'publish',
'post_type' => 'nav_menu_item'));
add_post_meta($nav_item, '_menu_item_type', 'post_type');
add_post_meta($nav_item, '_menu_item_menu_item_parent', '0');
add_post_meta($nav_item, '_menu_item_object_id', $page);
add_post_meta($nav_item, '_menu_item_object', 'page');
add_post_meta($nav_item, '_menu_item_target', '');
add_post_meta($nav_item, '_menu_item_classes', 'a:1:{i:0;s:0:"";}');
add_post_meta($nav_item, '_menu_item_xfn', '');
add_post_meta($nav_item, '_menu_item_url', '');
wp_set_object_terms($nav_item, 'footer-nav', 'nav_menu');
}
Cela semble fonctionner, mais:
- est-ce une manière robuste et élégante de le faire?
- Me manque-t-il quelque chose de tout à fait évident qui ferait tout cela dans une seule ligne de code?
la source
En complément de la réponse de ZaMoose, voici comment créer un élément de menu "Type de page " (et non un élément " Personnalisé "):
En supposant que vous ne connaissiez que le slug de la page, par exemple.
la source
J'ai quelques problèmes avec la réponse acceptée - cela ne le rend pas faux, mais je posterai mon propre code ci-dessous qui, à mon avis, pourrait donner de meilleurs résultats pour certaines personnes puisque j'avais la même question mais que je voulais faire la même chose. chose avec moins de code.
Premièrement, le code ci-dessus crée des éléments de navigation de type "URL", ce qui convient à certaines personnes, mais je souhaite créer un lien vers PAGES, pas avec des URL, car il s'agit d'une fonctionnalité importante des navigations WordPress. type d'élément de navigation.
De plus, seul un tableau plat d'enfants est traité par le code envoyé. J'ai créé une fonction permettant de déclarer récursivement les nouveaux éléments de navigation, de stocker leurs métadonnées renvoyées (principalement leur identifiant après leur création dans la boucle) et un paramètre permettant d'accepter des enfants.
Il suffit d’éditer
$nav_items_to_add
et le reste est traité de manière récursive. Il y a 3 clés requises dans chaque tableau. Tout d’abord, la clé de tableau est le slug, donc'shop' => array( ... )
ce que vous voulez pour une page contenant le slugshop
.['title']
est la façon dont l'élément de navigation sera étiqueté sur le front-end.path
est le chemin d'accès à la page dans la hiérarchie de la page WordPress, il est donc identique au slug si la page est un parent de niveau supérieur et si elleshop
était un enfant dehome
ce dernier'path' => 'home/shop'
.La dernière clé facultative est celle
['parent']
où vous pouvez déclarer une autre clé du tableau en tant que parent de la clé actuelle. Il est important de noter que les éléments sont ajoutés de manière récursive. Le parent doit donc exister avant de tenter de créer un enfant. Cela signifie que la déclaration doit avoir lieu pour l'élément de navigation parent avant ses enfants.la source
Pour ajouter un élément de menu par programme. vous pouvez accrocher pour
wp_nav_menu_items
filtrer. placez le code ci-dessous dans le thème functions.php pour ajouter un élément de menu de connexion / déconnexion dans le menu principal. "Primaire" est le nom / id du menu enregistré.la source