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; // количество пунктов меню

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    Если не сложно, то подскажите, а то у меня решение, через 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 в 08:02 #
      .menu-item-id{ display:none }
      body.logged-in .menu-item-id{ display:block } /* или inline, inline-block */

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

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

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

  • VRS2 марта 2015 в 21:03 #

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

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

phpjsHTMLCSSSQLПросто код
  Для того, чтобы оставить комментарий, пожалуйста, зарегистрируйтесь или авторизуйтесь на сайте.
Получайте новости блога по email или следите за мной в социальных сетях.
  • Владимир: и на третьей строке не хватает скобки ) закрывающей if :)

  • Миша: Добрый вечер! Рекомендую получить ID пользователя через функцию get_current_user_id().

  • Дмитрий: Миша, подскажите пожалуйста, я использую такой редирект, но он не срабатывает: add_action( 'template_redirect', funct...

  • Миша: Ну как не определена - это аргумент функции. Или я просто вас не до конца понимаю.

  • Артем: Ага, понял. Вот только почему $args? Она же нигде не определена, по логике должна быть переменная $true_field_params или...