Проверьте, пусто ли меню?
У меня есть набор меню, соответствующий пользовательскому полю на странице. Т. Е. у меня есть 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, чтобы знать, каким он должен быть.
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';
}