wp_nav_menu: показувати меню, лише якщо воно існує, інакше нічого не показувати


11

Я намагаюся використовувати wp_nav_menu лише для відображення меню, якщо воно існує, інакше нічого не відображається.

Якщо я видалю меню, воно виведе список сторінок.

Мій файл function.php містить:

if (function_exists('register_nav_menus')) {
register_nav_menus (
array('main_nav' => 'Main Navigation Menu'));}

Як я можу використовувати wp_nav_menu лише для відображення меню, якщо воно існує, інакше нічого не показувати?

Відповіді:


19

Використовуйте has_nav_menu()та перевіряйте theme_location, а не menu_id:

<?php
if ( has_nav_menu( $theme_location ) ) {
    // User has assigned menu to this location;
    // output it
    wp_nav_menu( array( 
        'theme_location' => $theme_location, 
        'menu_class' => 'nav', 
        'container' => '' 
    ) );
}
?>

Ви можете виводити альтернативний вміст, додаючи elseпункт.

EDIT

Ви повинні замінити $theme_locationз вашим фактичним theme_location :

<?php
if ( has_nav_menu( 'main_nav' ) ) {
    // User has assigned menu to this location;
    // output it
    wp_nav_menu( array( 
        'theme_location' => 'main_nav', 
        'menu_class' => 'nav', 
        'container' => '' 
    ) );
}
?>

Хоча це нічого не дає, якщо немає меню, воно, на жаль, робить те саме, коли є меню. Будь-які інші ідеї?
Райан

Ви застосували меню до вказаного розташування теми?
Чіп Беннетт

Ні, як це зробити?
Райан

1
Dashboard -> Appearance -> Menus. Створіть і збережіть користувальницьке меню, а потім застосуйте його до вказаного місця розташування, використовуючи спадне меню.
Чіп Беннетт

Так, я це зробив (скріншот: bit.ly/vrjNf9 ). На жаль, проблема все ще зберігається - меню не з’явиться. PS Файл моїх функцій має таке: якщо (function_exists ('register_nav_menus')) {register_nav_menus (масив ('main_nav' => 'Головне меню навігації'))}}
Ryan

6

Ви можете просто вказати false як fallback_cbаргумент wp_nav_menu. Нічого не з’явиться - швидше, wp_nav_menu повернеться помилковим (нічого не повторюється).

<?php
wp_nav_menu(array( 
    'theme_location' => $main_nav, 
    'menu_class'     => 'nav', 
    'container'      => '',
    'fallback_cb'    => false
));


0

Ви можете просто зареєструвати меню спочатку, не вказуючи місцеположення.
В functions.php:

add_action( 'init', 'register_my_menus' );
function register_my_menus() {  
    register_nav_menus(
        array(
            'header' => __( 'Header Menu' )
        )
    );
}

А коли ви зателефонуєте в меню header.php, перевірте has_nav_menu():

if ( has_nav_menu( 'header' ) ) {
    wp_nav_menu( array( 'theme_location' => 'header' ) ); 
}

Якщо ви зареєструєте меню без розташування теми, ви не зможете пізніше запитувати його з обмеженням розташування теми.
фуксія

0

Прочитай це:

http://codex.wordpress.org/Function_Reference/wp_nav_menu

встановити 'dropback_cb' => false і жоден не відображатиметься, це стандартний метод, запропонований хлопцями wp.


Це те саме, що відповідь chrisguitarguy ...
brasofilo

Я знаю, я просто хотів вас вказати на головну статтю про Wordpress кодекс.
Hooman Askari

Здається, що це неправда. Документи говорять: Якщо не вказаний параметр topic_location, функція відображає developer.wordpress.org/reference/functions/wp_nav_menu/… меню, що відповідає ідентифікатору, слизі або назві, заданому параметром меню; в іншому випадку, перше не порожнє меню; в іншому випадку (або якщо меню, задане меню порожнє), вивести функцію, задану параметром "backback_cb" (wp_page_menu (), за замовчуванням); інакше нічого.
Аліреза
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.