Cum verific dacă un meniu există în WordPress?

8 oct. 2013, 19:26:51
Vizualizări: 16.2K
Voturi: 5

Î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ă?

8
Comentarii

Te rog să editezi întrebarea ta pentru a adăuga codul în care înregistrezi sidebarele dinamice.

Chip Bennett Chip Bennett
8 oct. 2013 19:37:13

Nu am înregistrat acest lucru ca un sidebar dinamic. Trebuie să o fac? Până acum doar denumeam fișierele mele de sidebar ca sidebar-nume.php și apoi foloseam get_sidebar('nume') când era nevoie.

justlemons justlemons
8 oct. 2013 20:13:03

Bine, ce înțelegi când folosești termenul sidebar. Poate însemna cel puțin 3 lucruri: 1) un sidebar de conținut (HTML), 2) o zonă cu widget-uri (dynamic_sidebar()), sau 3) un fișier template-part (get_sidebar()/sidebar.php).

Chip Bennett Chip Bennett
8 oct. 2013 20:16:22

Îmi cer scuze pentru confuzie. Mă refeream la un fișier template-part.

justlemons justlemons
8 oct. 2013 20:19:16

Oh, acum îmi dau seama cât de confuz a fost. Lucrez cu meniurile de navigare din Wordpress. Doar că îl plasez într-o bară laterală.

justlemons justlemons
8 oct. 2013 20:25:20

Bine, acum poți posta codul tău register_nav_menus()?

Chip Bennett Chip Bennett
8 oct. 2013 20:38:35

Nici eu nu folosesc asta. Eu folosesc doar wp_nav_menu() și get_sidebar() în fișierele mele de template. De exemplu, codul pe care l-am listat în postarea mea este dintr-un fișier numit sidebar-nav.php. Folosesc acest sidebar într-un șablon de pagină personalizat folosind get_sidebar('nav').

justlemons justlemons
8 oct. 2013 20:53:57

Dacă nu înregistrezi locații de meniu în Theme, atunci nu folosești wp_nav_menu() corect și probabil nu vei putea rezolva această întrebare. Te rog să consulți Codex pentru wp_nav_menu() și register_nav_menus().

Chip Bennett Chip Bennett
8 oct. 2013 20:56:22
Arată celelalte 3 comentarii
Toate răspunsurile la întrebare 2
6
10

Presupunând că aveți implementate corect meniurile de navigare personalizate:

  1. Î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
    ) );
    
  2. 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' ) );
}
8 oct. 2013 21:00:59
Comentarii

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.

justlemons justlemons
9 oct. 2013 00:19:06

"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().

Chip Bennett Chip Bennett
9 oct. 2013 00:21:59

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. :)

Chip Bennett Chip Bennett
9 oct. 2013 00:23:47

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.

justlemons justlemons
9 oct. 2013 00:25:37

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.

justlemons justlemons
9 oct. 2013 00:35:19

Încă cred că există o modalitate mai ușoară de a gestiona ceea ce încerci să realizezi. Dacă dorești să intrăm în chat, probabil am putea rezolva problema...

Chip Bennett Chip Bennett
9 oct. 2013 00:56:03
Arată celelalte 1 comentarii
0

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
}
8 dec. 2015 05:58:27