Как проверить существование меню в WordPress?
В настоящее время я получаю навигационное меню на основе заголовка родительской страницы, а если у страницы нет родителя, то по её собственному заголовку.
global $post;
$page_title;
if ($post->post_parent) {
$page_title = get_the_title($post->post_parent);
} else {
$page_title = get_the_title($post);
}
$sidebar_title = 'Sidebar - '.$page_title;
wp_nav_menu(array( 'menu' => $sidebar_title));
Вместо того чтобы сначала проверять наличие родителя, я хочу сначала проверить, есть ли у страницы собственное уникальное меню. Вот что я написал, но это не работает:
global $post;
$page_title = get_the_title($post);
$sidebar_title = 'Sidebar - '.$page_title;
if ( !wp_nav_menu(array( 'menu' => $sidebar_title, 'echo' => false )) ) {
$page_title = get_the_title($post->post_parent);
$sidebar_title = 'Sidebar - '.$page_title;
}
wp_nav_menu(array( 'menu' => $sidebar_title ));
Коротко: Как проверить существование меню в WordPress?

Предполагая, что у вас правильно реализованы пользовательские меню навигации:
Регистрация расположений меню в теме:
register_nav_menus( array( 'parent_page' => "Родительская страница", 'page_a' => "Страница A", 'page_b' => "Страница B", //и так далее ) );
Правильный вызов
wp_nav_menu()
:wp_nav_menu( array( 'theme_location' => 'page_a' );
...тогда вы можете использовать условный тег has_nav_menu()
для проверки, назначено ли меню для данного расположения в теме:
if ( has_nav_menu( 'page_a' ) ) {
// выполнить какие-то действия
}
В вашем конкретном случае можно сделать так:
if ( has_nav_menu( 'page_a' ) ) {
wp_nav_menu( array( 'theme_location' => 'page_a' ) );
} else {
wp_nav_menu( array( 'theme_location' => 'parent_page' ) );
}

Спасибо за ваш ответ. Это первый сайт, который я разработал на WordPress, и я не знал о необходимости регистрировать навигационные меню. Я ознакомился с материалами, которые вы предложили. Тем не менее, мне удалось решить свою проблему без их регистрации. Думаю, это сработает для моих целей, так как моему клиенту не понадобится возможность управлять расположением меню.
Если вы считаете, что это может вызвать проблемы в будущем, пожалуйста, дайте мне знать.

"моему клиенту не понадобится возможность управлять расположением меню" — тогда зачем вообще нужны навигационные меню? (Серьёзно.) Почему бы просто не использовать wp_list_pages()
или wp_page_menu()
? Потому что если пользователь не определяет меню, то буквально нет никакой причины использовать wp_nav_menu()
.

Также: меня смущает заголовок вашего вопроса: как определить, существует ли меню?. Если пользователь не создаёт меню, как они вообще могут существовать? Я подозреваю, что есть что-то более глубокое, чего вы на самом деле пытаетесь достичь — и думаю, что, вероятно, есть более простой способ, чем тот, которым вы сейчас идёте. :)

Хотя мой клиент не будет управлять расположением меню, у него всё равно будет возможность добавлять новые пункты в эти меню, если он захочет.

На сайте есть несколько страниц, и у каждой родительской страницы есть уникальное навигационное меню. У некоторых дочерних страниц также есть уникальные меню, но не у всех. Для тех дочерних страниц, у которых нет уникального меню, я хочу, чтобы они использовали меню своей родительской страницы. Таким образом, я проверяю, существует ли уникальное меню, чтобы отобразить его, а если у страницы нет своего меню, тогда я хочу отобразить меню её родительской страницы.

Я делаю что-то похожее на автора вопроса: позволяю своему клиенту (администратору WordPress) создавать меню (в разделе WP-Admin > Внешний вид > Меню), которые НЕ привязаны к конкретному расположению в теме, потому что это требует статического/однозначного соответствия.
Вместо этого, эти меню отображаются динамически (с помощью пользовательского виджета), на основе имени верхнего предка текущей страницы. Если это имя совпадает с именем существующего меню, показываем меню (обёрнутое стандартным HTML виджета before/after). Но если совпадения НЕТ, ничего не выводим.
Поэтому мне нужно было проверить, существует ли меню, перед началом вывода виджета.
$args = array(
'menu' => $menu_name, // из верхнего предка текущей страницы
'echo' => 0, // true или 0
'theme_location' => '__fake', // фиктивное значение, чтобы предотвратить вывод первого реального меню
'fallback_cb' => false // предотвратить вывод первого реального меню
);
$menu = wp_nav_menu( $args );
if ($menu){
# вывод
echo $before_widget; // Before
echo $before_title . $title . $after_title; // Title
echo $menu;
echo $after_widget; // After
}
