Cum verific dacă un meniu există în WordPress?
În prezent preiau un meniu de navigare bazat pe titlul paginii părinte, iar dacă pagina nu are părinte, folosesc titlul propriu.
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 = 'Bara laterală - '.$page_title;
wp_nav_menu(array( 'menu' => $sidebar_title));
În loc să verific mai întâi existența unui părinte, aș dori să verific mai întâi dacă o pagină are propriul meniu unic. Acesta este codul pe care l-am scris, dar nu funcționează:
global $post;
$page_title = get_the_title($post);
$sidebar_title = 'Bara laterală - '.$page_title;
if ( !wp_nav_menu(array( 'menu' => $sidebar_title, 'echo' => false )) ) {
$page_title = get_the_title($post->post_parent);
$sidebar_title = 'Bara laterală - '.$page_title;
}
wp_nav_menu(array( 'menu' => $sidebar_title ));
Pe scurt: Cum verific dacă un meniu există?

Presupunând că aveți implementate corect meniurile de navigare personalizate:
Înregistrarea locațiilor de meniu în temă:
register_nav_menus( array( 'parent_page' => "Pagina Părinte", 'page_a' => "Pagina A", 'page_b' => "Pagina B", //etc ) );
Apelarea corectă a funcției
wp_nav_menu()
:wp_nav_menu( array( 'theme_location' => 'page_a' );
...apoi puteți folosi condiția has_nav_menu()
pentru a determina dacă o locație de meniu are un meniu atribuit:
if ( has_nav_menu( 'page_a' ) ) {
// fă ceva
}
În cazul dumneavoastră specific, puteți face ceva de genul:
if ( has_nav_menu( 'page_a' ) ) {
wp_nav_menu( array( 'theme_location' => 'page_a' ) );
} else {
wp_nav_menu( array( 'theme_location' => 'parent_page' ) );
}

Mulțumesc pentru răspuns. Acesta este primul website pe care l-am dezvoltat folosind Wordpress și nu știam că trebuie să înregistrez meniurile de navigare. Am citit materialele sugerate de tine. Totuși, am reușit să rezolv problema fără să le înregistrez. Cred că funcționează pentru nevoile mele, deoarece clientul meu nu va avea nevoie să gestioneze locațiile meniurilor.
Dacă crezi că acest lucru îmi va cauza probleme pe termen lung, te rog să-mi spui.

"clientul meu nu va avea nevoie să gestioneze locațiile meniurilor" - atunci de ce să ai meniuri de navigare deloc? (Serios.) De ce să nu folosești wp_list_pages()
sau wp_page_menu()
? Pentru că dacă utilizatorul nu definește meniuri, atunci nu există niciun motiv să folosești wp_nav_menu()
.

De asemenea: sunt confuz de titlul întrebării tale: cum să verifici dacă un meniu există?. Dacă utilizatorul nu definește meniuri, cum ar putea meniurile să existe vreodată? Bănuiesc că există ceva mai profund pe care încerci să-l realizezi - și cred că există probabil o cale mai ușoară decât cea pe care o urmezi acum. :)

Chiar dacă clientul meu nu va gestiona amplasarea meniurilor, el va avea în continuare posibilitatea de a adăuga elemente noi în acele meniuri, dacă dorește.

Am mai multe pagini pe site și fiecare pagină părinte are un meniu de navigare unic. Unele pagini copil au de asemenea meniuri de navigare unice, dar nu toate. Pentru acele pagini copil care nu au meniuri unice, doresc să folosească meniul paginii părinte. Așadar, verific dacă meniul unic există pentru a-l afișa, iar dacă pagina nu are un meniu unic, atunci doresc să afișez meniul paginii părinte.

Cred că fac ceva similar cu OP: îmi permit clientului meu (utilizatorul admin WordPress) să creeze Meniuri (în WP-Admin > Aspect > Meniuri), care NU sunt asignate unei locații specifice din temă, deoarece asta necesită o relație statică/unu-la-unu.
În schimb, aceste Meniuri sunt afișate dinamic (printr-un widget personalizat), bazat pe numele strămoșului de top al paginii curente. Dacă acel nume se potrivește cu numele unui Meniu existent, afișează Meniul (înconjurat de HTML-ul standard before/after al widget-ului). Dar, dacă NU există potrivire, nu afișa nimic.
Așadar, a trebuit să verific dacă Meniul există înainte de a începe afișarea widget-ului.
$args = array(
'menu' => $menu_name, // de la strămoșul de top al paginii curente
'echo' => 0, // true sau 0
'theme_location' => '__fake', // valoare falsă, pentru a preveni afișarea primului meniu real
'fallback_cb' => false // previne afișarea primului meniu real
);
$menu = wp_nav_menu( $args );
if ($menu){
# output
echo $before_widget; // Before
echo $before_title . $title . $after_title; // Titlu
echo $menu;
echo $after_widget; // After
}
