wp_nav_menu: afișează meniul doar dacă există, altfel nu afișa nimic
Încerc să folosesc wp_nav_menu pentru a afișa un meniu doar dacă acesta există, altfel să nu afișeze nimic.
Dacă șterg meniul, acesta va afișa o listă cu paginile.
Fișierul meu functions.php conține:
if (function_exists('register_nav_menus')) {
register_nav_menus (
array('main_nav' => 'Meniul Principal de Navigare'));}
Cum pot folosi wp_nav_menu pentru a afișa meniul doar dacă acesta există, altfel să nu afișeze nimic?
Folosește has_nav_menu()
și testează pentru theme_location
, în loc de menu_id
:
<?php
if ( has_nav_menu( $theme_location ) ) {
// Utilizatorul a atribuit un meniu acestei locații;
// afișează-l
wp_nav_menu( array(
'theme_location' => $theme_location,
'menu_class' => 'nav',
'container' => ''
) );
}
?>
Poți afișa conținut alternativ, adăugând o clauză else
.
EDITARE
Trebuie să înlocuiești $theme_location
cu adevăratul theme_location
:
<?php
if ( has_nav_menu( 'main_nav' ) ) {
// Utilizatorul a atribuit un meniu acestei locații;
// afișează-l
wp_nav_menu( array(
'theme_location' => 'main_nav',
'menu_class' => 'nav',
'container' => ''
) );
}
?>

Deși aceasta nu afișează nimic dacă nu există un meniu, din păcate face același lucru și atunci când există un meniu. Aveți alte sugestii?

Dashboard -> Aspect -> Meniuri
. Creează și salvează un meniu personalizat, apoi aplică-l la locația de temă specificată, folosind meniul dropdown.

Ah da, am făcut asta (captură de ecran: http://bit.ly/vrjNf9). Din păcate, problema persistă - meniul nu apare. P.S. Fișierul meu functions.php conține asta: if (function_exists('register_nav_menus')) { register_nav_menus ( array('main_nav' => 'Meniu Principal de Navigare'));}

Poți să actualizezi întrebarea ta cu codul tău real, curent de output?

Vezi răspunsul actualizat; în caz că ai luat prescurtarea mea prea literal, am clarificat argumentele array-ului pentru apelul wp_nav_menu()
. :)

Am actualizat întrebarea cu codul tău actualizat, dar încă nu afișează meniul (nu generează niciun HTML deloc). Mai este ceva ce pot încerca?

Poți specifica pur și simplu false ca argument fallback_cb
pentru wp_nav_menu
. Nu va apărea nimic - mai degrabă, wp_nav_menu va returna false (fără a afișa nimic).
<?php
wp_nav_menu(array(
'theme_location' => $main_nav,
'menu_class' => 'nav',
'container' => '',
'fallback_cb' => false
));

Se pare că nu : https://developer.wordpress.org/reference/functions/wp_nav_menu/#more-information

Puteți înregistra mai întâi meniul fără a specifica locația.
În functions.php
:
add_action( 'init', 'register_my_menus' );
function register_my_menus() {
register_nav_menus(
array(
'header' => __( 'Meniu Header' )
)
);
}
Și când afișați meniul în header.php
, verificați cu has_nav_menu()
:
if ( has_nav_menu( 'header' ) ) {
wp_nav_menu( array( 'theme_location' => 'header' ) );
}

Citește asta:
http://codex.wordpress.org/Function_Reference/wp_nav_menu
setează 'fallback_cb' => false și nu va fi afișat nimic, aceasta este metoda standard recomandată de echipa WordPress.

Știu, voiam doar să vă atrag atenția asupra articolului principal din WordPress Codex.

Se pare că nu este adevărat. Documentația spune:
Dacă nu i se dă un parametru theme_location, funcția afișează https://developer.wordpress.org/reference/functions/wp_nav_menu/#more-information meniul care se potrivește cu ID-ul, slug-ul sau numele dat de parametrul menu; în caz contrar, primul meniu ne-gol; în caz contrar (sau dacă meniul dat de parametrul menu este gol), rezultatul funcției date de parametrul fallback_cb (wp_page_menu(), implicit); altfel, nimic.
