Как использовать термин WP с аргументом (меню) в меню wp nav?


Я пытаюсь понять функцию wp_nav_menu, и я согласен с ее аргументами, но wordpress утверждает, что нужно использовать int , string и WP_Term с ключом menu. Мне нужно знать, как использовать WP_Term с ним, потому что wordpress просто предлагает базовый класс WP_Term.Вы можете просто объяснить концепцию, если хотите. Почему и каков результат его использования?

Author: Mohamed Omar, 2017-02-05

1 answers

Предыстория

Как вы уже знаете, wp_nav_menu() функция принимает массив $args в качестве аргумента & menu является одним из ключей к этому массиву $args.

Ключ menu для аргумента $args определяется как:

(int|строка|wp_term) Нужное меню. Принимает (совпадающий по порядку) идентификатор, слаг, имя, объект меню.

Теперь, если вы глубоко изучите реализацию функции wp_nav_menu(), вы увидите, что независимо от того, какое значение вы предоставляете, является ли это int идентификатор, a string имя, a string слизняк или object WP_Term, он всегда будет извлекать WP_Term object для соответствующего меню идентификатор | имя | слаг перед созданием меню.

Например: если у вас есть меню с идентификатором 3, имя My Menu и слизняк my-menu; вы можете добавить это меню, используя любой из следующих КОДОВ:

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

Даже если вы не предоставите menu аргумент, он попытается получить WP_Term объект из других аргументов, таких как theme_location.

Например: допустим, расположение меню top было зарегистрировано с помощью register_nav_menus() функция в файле functions.php вашей темы и меню с именем My Menu было указано в расположении top из вашей панели администратора WP . В этом случае вы можете получить то же меню, используя:

    wp_nav_menu( array(
        'theme_location' => 'top'
    ) );

В каждом из вышеперечисленных случаев функция wp_nav_menu() извлекает WP_Term объект перед созданием меню. Он использует wp_get_nav_menu_object() функция для этого.

Реализация

Поэтому вместо аргумента theme_location или аргумента menu как int идентификатор или string имя | slug, вы можете напрямую предоставить соответствующий объект WP_Term.

Один из способов получить объект WP_Term - это использовать WP_Term::get_instance() метод:

    // get the WP_Term object using menu id 3
    $menu_obj = WP_Term::get_instance( 3, 'nav_menu' );

Вы также можете получить объект WP_Term с именем меню | слизняк с использованием 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' );

Теперь, когда у вас есть WP_Term объект $menu_obj, вы можете использовать это для создания меню:

    wp_nav_menu( array(
        'menu'           => $menu_obj
    ) );

Пример использования:

Итак, вы знаете, как создать меню с помощью WP_Term объект в качестве аргумента функции wp_nav_menu(). Теперь возникает вопрос: почему вы захотите его использовать? Помимо того факта, что это просто еще один вариант, вы можете захотеть его использовать, потому что это может быть немного более быстрый вариант.

Например, если вы хотите использовать одно и то же меню дважды, один раз в верхнем колонтитуле, а затем в нижнем колонтитуле, в этом случае вместо использования идентификатора меню | слизняк | имя, вы можете создать объект WP_Term в своем шаблоне для меню заголовка:

    global $menu_obj;
    $menu_obj = WP_Term::get_instance( 3, 'nav_menu' );

    wp_nav_menu( array(
        'menu'           => $menu_obj,
        'menu_id'        => 'header_menu'
    ) );

А затем просто используйте $menu_obj также в шаблоне нижнего колонтитула:

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

Если вы посмотрите на реализацию функции wp_nav_menu(), вы увидите, что, делая это таким образом, вы избежите нескольких дополнительных вызовов функций в ядре WordPress, таким образом, общее выполнение будет немного быстрее.

Однако, пожалуйста, помните, что использование аргумента theme_location или других опций может быть более удобным и лучшим для обслуживания. Так что стоит ли вам его использовать или нет, полностью зависит от вашего собственного конкретного сценария. Я просто объяснил, что вы можете и как, не более того.

 2
Author: Fayaz, 2017-02-05 16:28:27