Проверьте, пусто ли меню?


У меня есть набор меню, соответствующий пользовательскому полю на странице. Т. Е. у меня есть menu1, menu2 и menu3 на трех страницах в пользовательском поле => Имя меню. Под functions.php У меня есть:

/* Add Menu Locations */
add_action( 'init', 'register_my_menus' );
function register_my_menus() {
    register_nav_menus(
        array(
            'one-menu' => __('menu1'),
            'two-menu' => __('menu2'),
            'three-menu' => __('menu3'),
            'footerBlocka' => __('Footer Block 1'),
            'footerBlockb' => __('Footer Block 2'),
            'footerBlockc' => __('Footer Block 3'),
            'footerBlockd' => __('Footer Block 5')
        )
    );
}

Затем в шаблоне моей страницы у меня есть:

<?php
    /* Division */
    wp_nav_menu(array(
        'menu' => get_post_meta( $post->ID, 'MenuName', true),
        'depth' => 2,
        'container' => false,
        'menu_class' => 'nav navbar-nav'
    ));
?>

Это работает просто отлично, пока а) меню существует и б) меню на самом деле содержит пункты меню. Если меню существует, но в нем нет пунктов меню, оно странным образом отображает список всех пунктов меню из всех меню на сайте. Если меню не существует, оно просто показывает следующее меню, указанное в functions.php .

Поэтому я думаю, что в моем шаблоне страницы мне нужно проверить наличие меню и, если оно существует, распечатать меню. Я видел пару других примеров, но все, что я смог найти, - это наличие области темы или меню. Поскольку я использую 'menu' => get_post_meta( $post->ID, 'MenuName', true), для динамического вызова меню, я не знаю, как проверить это динамическое меню, прежде чем пытаться распечатать меню.

Итак, как мне проверить меню, которое вызывается из 'menu' => get_post_meta( $post->ID, 'MenuName', true),, и если оно существует и имеет пункты меню, затем распечатайте его, если нет, ничего не печатайте?

РЕДАКТИРОВАТЬ: Я попробовал следующее:

<?php
    /* Division */
    wp_nav_menu(array(
        'menu' => get_post_meta( $post->ID, 'MenuName', true),
        'depth' => 2,
        'fallback_cb' => false,
        'container' => false,
        'menu_class' => 'nav navbar-nav'
    ));
?>

Это новое дополнение по-прежнему будет отображать следующее меню в строке из functions.php функция. Поэтому, если menu3 не существует, он печатает меню нижнего колонтитула. Я думаю, что моя цель - проверить идентификатор страницы для настраиваемого поля MenuName, если оно существует, затем проверить, существует ли меню и есть ли ссылки, если верно, затем распечатать меню, иначе ничего не делайте. Что-то вроде:

$menu = get_post_meta($post->ID, 'MenuName');
if($menu){
  if([wp_nav_menu == $menu AND has links]){
      wp_nav_menu(array(...));
  }
}

Это и есть псевдокод, я думаю, будет необходим, но я недостаточно знаю о крючках WordPress, чтобы знать, каким он должен быть.

Author: o_O, 2015-11-05

1 answers

wp_nav_menu имеет аргумент fallback_cb, который является функцией, вызываемой, если меню не существует. По умолчанию установлено значение wp_page_menu, поэтому вы видите список страниц, если меню не существует. Если вы явно установите для этого значение false, то ничего не будет выведено, если меню не существует.

РЕДАКТИРОВАТЬ-

Учитывая имя меню, вы можете загрузить объект меню с помощью wp_get_nav_menu_object. Это сообщит вам, существует ли он, каков его идентификатор (для передачи в качестве аргумента menu) и сколько пунктов меню он имеет.

$menu_name = get_post_meta( $post->ID, 'MenuName', true );
$menu = wp_get_nav_menu_object( $menu_name );
if( is_object( $menu ) ){
    echo 'This menu exists!';
    echo 'This menu has ' . $menu->count . ' menu items.';
    echo 'This menu ID is ' . $menu->term_id . '.';
} else {
    echo 'A menu with that name doesn\'t exist';
}
 4
Author: Milo, 2015-11-05 20:21:00