web-dev-qa-db-fra.com

Comment utiliser WP_Term avec l'argument (menu) dans le wp_nav_menu?

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?

1
Mohamed Omar

Contexte

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 objectWP_Term, il récupérera toujours le WP_Termobject 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.

La mise en oeuvre

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

Cas d'utilisation:

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.

2
Fayaz