Как проверить существование меню в WordPress?

8 окт. 2013 г., 19:26:51
Просмотры: 16.2K
Голосов: 5

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

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?

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

Пожалуйста, отредактируйте ваш вопрос, добавив код, где вы регистрируете динамические сайдбары.

Chip Bennett Chip Bennett
8 окт. 2013 г. 19:37:13

Я не регистрировал это как динамический сайдбар. Нужно ли это делать? Я просто называю файлы сайдбаров sidebar-name.php и затем использую get_sidebar('name'), когда это необходимо.

justlemons justlemons
8 окт. 2013 г. 20:13:03

Хорошо, что вы имеете в виду под термином сайдбар? Он может означать как минимум 3 вещи: 1) контентный сайдбар (HTML), 2) область для виджетов (dynamic_sidebar()), или 3) файл шаблона (get_sidebar()/sidebar.php).

Chip Bennett Chip Bennett
8 окт. 2013 г. 20:16:22

Извините за путаницу. Я имел в виду файл template-part.

justlemons justlemons
8 окт. 2013 г. 20:19:16

Ой, теперь я понимаю, как это было запутанно. Я работаю с навигационными меню WordPress. Просто размещаю его в сайдбаре.

justlemons justlemons
8 окт. 2013 г. 20:25:20

Хорошо, теперь можете показать ваш код register_nav_menus()?

Chip Bennett Chip Bennett
8 окт. 2013 г. 20:38:35

Я тоже этим не пользуюсь. В моих файлах шаблонов я просто использую wp_nav_menu() и get_sidebar(). Например, код, который я привёл в своём сообщении, взят из файла sidebar-nav.php. Я использую этот сайдбар в пользовательском шаблоне страницы через get_sidebar('nav').

justlemons justlemons
8 окт. 2013 г. 20:53:57

Если вы не регистрируете расположения меню в теме, значит вы используете wp_nav_menu() неправильно и вряд ли сможете решить этот вопрос. Пожалуйста, ознакомьтесь с Кодексом по функциям wp_nav_menu() и register_nav_menus().

Chip Bennett Chip Bennett
8 окт. 2013 г. 20:56:22
Показать остальные 3 комментариев
Все ответы на вопрос 2
6
10

Предполагая, что у вас правильно реализованы пользовательские меню навигации:

  1. Регистрация расположений меню в теме:

    register_nav_menus( array(
        'parent_page' => "Родительская страница",
        'page_a' => "Страница A",
        'page_b' => "Страница B", //и так далее
    ) );
    
  2. Правильный вызов 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' ) );
}
8 окт. 2013 г. 21:00:59
Комментарии

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

Если вы считаете, что это может вызвать проблемы в будущем, пожалуйста, дайте мне знать.

justlemons justlemons
9 окт. 2013 г. 00:19:06

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

Chip Bennett Chip Bennett
9 окт. 2013 г. 00:21:59

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

Chip Bennett Chip Bennett
9 окт. 2013 г. 00:23:47

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

justlemons justlemons
9 окт. 2013 г. 00:25:37

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

justlemons justlemons
9 окт. 2013 г. 00:35:19

Я всё ещё думаю, что есть более простой способ реализовать то, что вы пытаетесь сделать. Если хотите обсудить в чате, мы могли бы разобраться с этим...

Chip Bennett Chip Bennett
9 окт. 2013 г. 00:56:03
Показать остальные 1 комментариев
0

Я делаю что-то похожее на автора вопроса: позволяю своему клиенту (администратору 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
}
8 дек. 2015 г. 05:58:27