wp_get_nav_menu_object() — возвращает объект меню

Возможно вы знаете, что каждое созданное меню в WordPress является элементом таксономии nav_menu. Функция wp_get_nav_menu_object() — это ни что иное, как совокупность функций get_term() и get_term_by().

wp_get_nav_menu_object( $menu )
$menu
(строка) ID, ярлык или название меню.

В случае успеха функция возвращает объект меню, в случае неудачи — логическое false. Вот результат действия кода print_r( wp_get_nav_menu_object( 381 ) ); для моего меню в шапке:

stdClass Object
(
    [term_id] => 381
    [name] => Меню для шапки
    [slug] => %d0%bc%d0%b5%d0%bd%d1%8e-%d0%b4%d0%bb%d1%8f-%d1%88%d0%b0%d0%bf%d0%ba%d0%b8
    [term_group] => 0
    [term_order] => 0
    [term_icon] => 
    [term_taxonomy_id] => 387
    [taxonomy] => nav_menu
    [description] => 
    [parent] => 0
    [count] => 11
    [filter] => raw
)

Теперь перейдем к примерам.

Как узнать ID меню

На самом деле тут есть два способа.

Способ 1. Смотрим исходный код

Итак, переходим в админке во Внешний вид > Меню, выбираем нужное нам меню, ID которого требуется узнать, затем заходим в исходный код в браузере (в разных браузерах и ОС это делается по-разному, но скорее всего должно помочь нажатие правой кнопкой мыши где-нибудь в теле веб-страницы).

Открыли код? Теперь ищем невидимое поле с атрибутом name равным menu. Значение атрибута value данного поля и есть ID меню.

ID меню

Способ 3. Определяем ID меню по его имени

Тут уже мы будем использовать функцию wp_get_nav_menu_object(). Допустим, что имя меню у нас «Меню для шапки», тогда:

$menu_object = wp_get_nav_menu_object( 'Меню для шапки' ); 
$menu_id = $menu_object->term_id;

Как узнать ярлык меню

Если известен ID:

$menu_object = wp_get_nav_menu_object( 381 ); 
$menu_slug = $menu_object->slug; // ярлык

Если известно название меню:

$menu_object = wp_get_nav_menu_object( 'Меню для шапки' ); 
$menu_slug = $menu_object->slug;

Как узнать количество элементов в меню

Понятное дело, можно их подсчитать, но я имею ввиду другое. Как получить данное значение в коде, в виде переменной? Вот так:

$menu_object = wp_get_nav_menu_object( 'Меню для шапки' ); // можно указать также ID или ярлык
$menu_count = $menu_object->count; // количество пунктов меню

Миша

Впервые познакомился с WordPress в 2009 году. С 2014 года меня можно встретить на WordCamp по всему миру — официальной конфе по WordPress, иногда там выступаю, но с 2019 выступаю только на тех, которые сам организовываю. Также периодически школа Epic Skills и LoftSchool приглашают меня вести у них уроки/вебинары.

Если вам нужна помощь с вашим сайтом или может даже разработка с нуля — пишите мне.

Комментарии 18

  • Максим7 февраля 2015 #

    Здравствуйте Михаил у меня следующий вопрос Возможно ли как то скрыть один из пунктов меню. Типа если пользователь не залогинен он не видит какой то пункт меню? Или надо только с подменной меню полностью делать для зарегистрированных и не для зарегистрированных, а потом условия?

    • Миша7 февраля 2015 #

      Здравствуйте, вариантов несколько:

      1. wp_get_nav_menu_items(),
      2. использование волкера,
      3. банально через CSS.

      Условие проверки зарегистрированного пользователя подсказать?

  • Максим8 февраля 2015 #

    Да Михаил если можно подскажите, как это можно реализовать через wp_get_nav_menu_items(), ? Скажите Михаил, а вам возможно потом еще один вопрос задать если вы знакомы с api WooCommerce? Просто вы в моих глазах один из ни многих, кто помогает людям с вопросами. А на всяких гламурных форумах ведать "взападло" ответить мега супер челам. Либо просто молчат либо пишут, что то вроде да тут все просто сам не знаешь, что ли. Нет знаю, так просто вопрос задаю. Ну это так полимика. Да и на самом деле информации очень мало стоящей в интернете. Всяких блогов много подобных вашему, но там так один рерайт.
    А Вы я вижу, понимайте, что пишите .

    • Миша8 февраля 2015 #

      Спасибо! Если нравится мой блог, буду благодарен, если заюзаете кнопки соц сетей вверху 🙂

      В общем используйте последний пример тогда с поста про wp_get_nav_menu_items().

      Для того, чтобы проверить, зарегистрирован ли пользователь, используйте условие:

      global $user_ID;
      if( $user_ID ) {
       
      }
      • алексей17 ноября 2015 #

        если подскажете ответ на вопрос то не только заюзаю но и присоеденюсь с радостью

        Партнёрам
        <strong>Партнёрам</strong>

        можно ли так делать на странице и не будет ли поисковик считать что у меня на странице два заголовка х1

        Партнёрам
        Сотрудничать с нами – выгодно
        ну и что произойдёт если вот так сделать

        а то нигде не могу найти ответа

        • Миша18 ноября 2015 #

          SEO-профи я себя не считаю, но думаю, что в этом ничего такого.

    • Миша8 февраля 2015 #

      Через CSS кстати проще простого будет скрыть, если вам такой способ подойдёт могу подсказать уже сразу готовый код.

      • алексей18 ноября 2015 #

        так всё таки это два х1 и что тут делать?

  • Максим8 февраля 2015 #

    Если не сложно, то подскажите, а то у меня решение, через jquery только есть я делал, так

    <?php if( is_user_logged_in() ) {?> 
     
    <script type="text/javascript">
        jQuery(document).ready(function() {
            jQuery('.menu-item-id').hide();
     
        });
    </script>
     
    <?php }else{ ?>
    <script type="text/javascript">
        jQuery(document).ready(function() {
            jQuery('.menu-item-id').hide();
    		jQuery('.menu-item-id').show();
        });
    </script>
     
     <?php } ?>

    Скажите Михаил, а вам возможно потом еще один вопрос задать если вы знакомы с api WooCommerce?

    • Миша9 февраля 2015 #
      .menu-item-id{ display:none }
      body.logged-in .menu-item-id{ display:block } /* или inline, inline-block */

      C WooComerce как-то давно работал. Сейчас уже всё позабыл 🙂

  • Максим9 февраля 2015 #

    Спасибо вам Михаил !

  • VRS2 марта 2015 #

    Миш, а не подскажешь, как вытащить из БД строки таксономий меню?

    • Миша2 марта 2015 #

      nav_menu_item - это тип поста) Или я что-то не так понял?

      • VRS3 марта 2015 #

        т.е. если сделать экспорт в БД post_type = nav_menu_item и импортировать эти строки в другую БД, то на сайте появятся меню?

        • Миша3 марта 2015 #

          не пробовал 🙂

  • Александр24 января 2017 #

    Миш, я немного туплю. А как получить количество количество только родительских пунктов без учета субменю?

  • Илья2 ноября 2019 #

    Привет . Почитал - интересно! Вот такой вопрос: как узнать ID страницы на которую ссылается данный пункт меню ?

Оставить комментарий

Если вы хотите добавить код, не забудьте обернуть его в <pre lang="php"></pre>, в случае несоблюдения этого условия в 99% случаях ваш коммент будет удалён, а автор заблокирован. Печалька.