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

Кстати! Про то, как кодить меню в WordPress, у меня на сайте есть видеоурок.

Возможно вы знаете, что каждое созданное меню в 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; // количество пунктов меню

Миша

В последние годы я долго не знал, что мне делать с сайтом misha.blog, ведь он практически не приносит никакого профита, но недавно я осознал, что моя миссия – способствовать распространению WordPress. Ведь WordPress – это лучший движок для разработки сайтов – как для тех, кто готов использовать заложенную структуру этой CMS, так и для тех, кто предпочитает headless решения.

Сам же я впервые познакомился с WordPress в 2009 году. Организатор WordCamp. Преподаватель в школах Epic Skills и LoftSchool.

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

Комментарии — 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 #

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

  • VRS 2 марта 2015 #

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

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

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

      • VRS 3 марта 2015 #

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

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

          не пробовал 🙂

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

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

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

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