J'essaie de comprendre la fonction wp_nav_menu
et ses arguments sont acceptables, mais wordpress indique qu'il faut utiliser int
, string
et WP_Term
avec la clé menu
. J'ai besoin de savoir comment utiliser le WP_Term
avec elle parce que wordpress offre simplement la classe de base WP_Term
.Vous pouvez simplement expliquer le concept si vous le souhaitez. Pourquoi et quel est le résultat de l'utiliser?
Comme vous le savez déjà, la fonction wp_nav_menu()
prend un tableau $args
en tant qu'argument & menu
est l'une des clés de ce tableau $args
.
La clé menu
pour l'argument $args
est définie comme suit:
(int | string | WP_Term) Menu souhaité. Accepte (dans l'ordre) id, slug, name, objet de menu.
Maintenant, si vous regardez de près l’implémentation de la fonction wp_nav_menu()
, vous verrez que, quelle que soit la valeur que vous fournissez, qu’il s’agisse d’une variable int
id , un string
nom , un string
slug ou un object
WP_Term
, il récupérera toujours le WP_Term
object
pour le menu correspondant id | nom | slug avant de créer le menu.
Par exemple: si vous avez un menu avec id 3
, nom My Menu
et slug my-menu
; vous pouvez ajouter ce menu en utilisant l'un des codes suivants:
// with id: 3
wp_nav_menu( array(
'menu' => 3
) );
// with name: My Menu
wp_nav_menu( array(
'menu' => "My Menu"
) );
// with slug: my-menu
wp_nav_menu( array(
'menu' => "my-menu"
) );
Même si vous ne fournissez pas l'argument menu
, il essaiera d'obtenir l'objet WP_Term
à partir d'autres arguments tels que theme_location
.
Par exemple: supposons que l'emplacement du menu top
ait été enregistré à l'aide de la fonction register_nav_menus()
du fichier functions.php
de votre thème et que le menu nommé My Menu
a été attribué à l'emplacement top
à partir de votre Panneau d'administration WP . Dans ce cas, vous pouvez obtenir le même menu en utilisant:
wp_nav_menu( array(
'theme_location' => 'top'
) );
Dans chacun des cas ci-dessus, la fonction wp_nav_menu()
récupère l'objet WP_Term
avant de générer le menu. Il utilise la fonction wp_get_nav_menu_object()
pour le faire.
Donc, au lieu de l'argument theme_location
ou de l'argument menu
sous la forme int
id ou string
name | slug , vous pouvez directement fournir l'objet WP_Term correspondant.
L’un des moyens d’obtenir l’objet WP_Term
consiste à utiliser la méthode WP_Term::get_instance()
:
// get the WP_Term object using menu id 3
$menu_obj = WP_Term::get_instance( 3, 'nav_menu' );
Vous pouvez également obtenir l'objet WP_Term
avec le menu name | slug utilisant la fonction get_term_by()
:
// by menu slug
$menu_obj = get_term_by( 'slug', 'my-menu', 'nav_menu' );
// or, by menu name
$menu_obj = get_term_by( 'name', 'My Menu', 'nav_menu' );
Maintenant que vous avez l'objet WP_Term
$menu_obj
, vous pouvez l'utiliser pour générer le menu:
wp_nav_menu( array(
'menu' => $menu_obj
) );
Vous savez donc comment générer un menu en utilisant l’objet WP_Term
comme argument de la fonction wp_nav_menu()
. Maintenant la question est: pourquoi voudrez-vous l’utiliser? Hormis le fait que n’est qu’une autre option , vous voudrez peut-être utiliser parce que cela peut être une option légèrement plus rapide.
Par exemple, si vous souhaitez utiliser le même menu deux fois, une fois dans l'en-tête, puis dans le pied de page, dans ce cas, au lieu d'utiliser menu id | slug | name , vous pouvez créer un objet WP_Term
dans votre modèle pour le menu d'en-tête:
global $menu_obj;
$menu_obj = WP_Term::get_instance( 3, 'nav_menu' );
wp_nav_menu( array(
'menu' => $menu_obj,
'menu_id' => 'header_menu'
) );
puis utilisez simplement $menu_obj
dans le modèle de pied de page également:
// global declaration is needed to access the global variable from another template
global $menu_obj;
wp_nav_menu( array(
'menu' => $menu_obj,
'menu_id' => 'footer_menu'
) );
Si vous regardez dans l'implémentation de la fonction wp_nav_menu()
, vous verrez qu'en procédant ainsi, vous éviterez quelques appels de fonction supplémentaires dans le noyau de WordPress, de sorte que l'exécution totale sera légèrement plus rapide.
Cependant, rappelez-vous que l’utilisation de l’argument theme_location
ou d’autres options peut être plus pratique et plus efficace pour la maintenance. Donc, si vous devez ou non l'utiliser totalement dépend de votre propre scénario. Je viens d'expliquer que vous pouvez et comment, rien de plus.