Cum să afișezi un anumit element de meniu din wp_nav_menu bazat pe ID

18 mai 2011, 04:38:57
Vizualizări: 18.7K
Voturi: 3

Am un meniu wp_nav_menu "Main Menu" cu următoarea structură:

  • Element Principal (#menu-item-1)
    • Subelement
    • Subelement
  • Element Principal (#menu-item-2)
    • Subelement
  • Element Principal (#menu-item-3)
    • Subelement A
    • Subelement B
      • Subelement a.1
    • Subelement C

În template-ul meu, vreau să pot afișa subelementele meniului Main Menu pentru un element principal cu ID-ul menu-item-3, unde menu-item-3 este elementul curent din meniul principal.

Ceva de genul acesta: (dar ce ar funcționa, desigur)

wp_nav_menu( array('menu' => 'Main Menu' 'menu-item-id' => '3' ));

Și acesta ar returna:

  • Subelement A
  • Subelement B
    • Subelement a.1
  • Subelement C

Dacă contează, vreau să afișez subelementele ca meniu lateral în interior, în funcție de secțiunea din meniul principal în care te afli, în mod dinamic. Mulțumesc anticipat!

De menționat că aceasta nu este o duplicare a întrebării "http://wordpress.stackexchange.com/questions/2802/display-a-portion-branch-of-the-menu-tree-using-wp-nav-menu". Deși acea pagină conține mai multe răspunsuri similare, niciunul nu funcționează conform așteptărilor cu versiunea curentă de WordPress. Ideea este să afișeze un anumit submeniu și toți descendenții săi (adâncime nelimitată).

5
Comentarii

posibil duplicat al Afișează o porțiune/ramură a arborelui de meniu folosind wp_nav_menu()

Jan Fabry Jan Fabry
18 mai 2011 09:17:40

Cred că poți rezolva această întrebare citind răspunsul la această întrebare. Dacă nu reușești să o rezolvi după ce ai citit acea întrebare, te rog să editezi întrebarea ta pentru a clarifica ce ai încercat și ce nu a funcționat. (Folosește @Jan când răspunzi într-un comentariu și voi primi o notificare)

Jan Fabry Jan Fabry
18 mai 2011 09:19:11

Arată perfect! O să încerc asta în dimineața aceasta în timp ce citesc acele comentarii și văd dacă funcționează. Mulțumesc, Jan!

TechRemarker TechRemarker
18 mai 2011 15:48:29

Din păcate, după ce am încercat acele opțiuni din link, nu am găsit o soluție funcțională. Prima clasă walker afișează pur și simplu toate elementele de meniu, ceea ce înseamnă că nu funcționează. A treia din listă părea să funcționeze, dar afișează doar elementul de meniu de top și merge doar un nivel în adâncime, în timp ce eu am nevoie de toate nivelurile. Am încercat și opțiunea cu pluginul, dar nici aceasta nu funcționează - afișează toate elementele de meniu. Următoarea soluție, răspunsul lui Alp, afișează meniul lateral fără nivelul de top, ceea ce e bine, dar afișează și elementele copil. Iar ultima soluție de pe pagină nu funcționează deloc. Aveți sugestii?

TechRemarker TechRemarker
18 mai 2011 17:26:01

@heavymark, ai reușit să găsești vreo soluție pentru această problemă?

Ian Dunn Ian Dunn
9 iul. 2011 19:19:55
Toate răspunsurile la întrebare 3
6

Dacă am înțeles corect ceea ce doriți, puteți realiza acest lucru cu CSS. Veți folosi wp_nav_menu în mod normal și îl veți lăsa să genereze toate linkurile, dar apoi veți ascunde toate acestea, cu excepția submeniului paginii curente.

CSS-ul dumneavoastră ar arăta cam așa,

#sidebar ul.menu li
{
    display: none;
}

    #sidebar ul.menu li.current-page-parent,
    #sidebar ul.menu li.current-page-parent ul,
    #sidebar ul.menu li.current-page-parent ul.li
    {
        display: block;
    }

Actualizare: Puteți vizita http://thataboycreative.com pentru a vedea un exemplu unde am folosit această tehnică anterior. Iată CSS-ul relevant din acel exemplu:

ul.sub-menu
{
    display: none;
}

    #menu-main-navigation > li.current-menu-item ul.sub-menu,
    #menu-main-navigation > li.current-menu-ancestor ul.sub-menu
    {
        display: block;
    }
18 mai 2011 09:03:02
Comentarii

@Ian Aceasta nu funcționează. Nu am văzut niciodată folosită clasa "current-page-parent". Cred că WordPress generează clasele "current-menu-item" și "current_page_item". Dar chiar și folosind acestea, nu pare să funcționeze și pur și simplu ascunde întregul meniu. Ai implementat cu succes această metodă pe un site anterior la care te poți referi?

TechRemarker TechRemarker
18 mai 2011 17:40:11

Clasa current-page-parent există și ea, dar poate doar în unele versiuni. WordPress nu a fost foarte consistent cu denumirile claselor. Voi edita răspunsul pentru a arăta un exemplu unde am implementat asta înainte.

Ian Dunn Ian Dunn
18 mai 2011 18:40:13

Voi încerca noul tău cod CSS pentru a vedea dacă va funcționa ca o opțiune temporară până voi determina o metodă de a face asta în cod. Deoarece prin metoda CSS, pagina ar trebui totuși să încarce toate elementele din meniu, crescând timpul de încărcare și resursele consumate, doar pentru a le ascunde. Dar din cauza unei situații urgente, este cu siguranță o opțiune de luat în considerare. Mulțumesc.

TechRemarker TechRemarker
19 mai 2011 00:24:52

De fapt, nu cred că ar fi cazul, deoarece WordPress stochează în cache citirile din baza de date. Deci, dacă ai apelat deja wp_nav_menu() o dată pentru meniul tău principal, apelând-o a doua oară pentru navigația secundară nu va rezulta într-o a doua interogare la baza de date.

Ian Dunn Ian Dunn
19 mai 2011 03:13:10

@Ian, acesta este un punct bun dacă așa funcționează, presupunând.

TechRemarker TechRemarker
20 mai 2011 18:08:16

Am parcurs codul ieri și wp_nav_menu() apelează în final get_term(), iar acesta apelează wp_cache_add() pe termen.

Ian Dunn Ian Dunn
21 mai 2011 00:56:11
Arată celelalte 1 comentarii
1

Am creat un plugin pentru asta - asigură-te că treci ID-ul ca STRING și nu ca Integer. Te rog să îmi evaluezi pluginul - este primul meu! :)

Descarcă aici

8 mar. 2012 22:33:22
Comentarii

Prefixul pentru funcția ta personalizată este wp_? Asta va cauza probleme într-o zi.

fuxia fuxia
2 nov. 2012 22:54:21
1

Un alt mod în care am realizat acest lucru este prin preluarea directă a postărilor, în loc să folosesc wp_nav_menu. Totuși, aceasta se bazează pe structura reală a paginii, nu pe meniu.

functions.php:

function __construct()
{
    $this->currentPageID    = $this->getCurrentPageID();
    $this->sectionChildren    = $this->getSectionChildren();
}

function getCurrentPageID()
{
    $currentPage = $_SERVER['REQUEST_URI'];

    if($currentPage == '/')
        $currentPage = '/home';
    $currentPage = get_page_by_path($currentPage);

    if($currentPage)
        return $currentPage->ID;
    else
        return -1;
}

function getSectionID()
{
    global $wpdb;

    $currentSectionID = $wpdb->get_var("
        SELECT post_parent
        FROM ". $wpdb->posts ."
        WHERE ID = ". $this->currentPageID
    );

    if($currentSectionID == 0)
        return $this->currentPageID;
    else
        return $currentSectionID;
}

function getSectionChildren()
{
    global $wpdb;

    $children = $wpdb->get_results("
        SELECT ID, post_title
        FROM ". $wpdb->posts ."
        WHERE
            post_parent = ". $this->getSectionID() ." AND
            post_type = 'page' AND
            post_status = 'publish'
    ", ARRAY_A);

    return $children;
}

sidebar.php:

<ul id="sub-navigation">
    <?php foreach($dc->sectionChildren as $c) : ?>
        <li <?php if($dc->currentPageID == $c['ID']) echo 'class="active"'; ?>><a href="<?php echo get_permalink($c['ID']); ?>"><?php echo $c['post_title']; ?></a></li>
    <?php endforeach; ?>
</ul>
18 mai 2011 18:52:38
Comentarii

Inițial am configurat-o folosind pagini, ceea ce a necesitat doar câteva linii de cod de pe site-ul WordPress, însă pe o sub-sub pagină, afișa meniul sub-sub, în loc să afișeze primul nivel de submeniu și descendenții acestuia. De asemenea, atunci când utilizatorul actualiza meniul principal, modificările nu se reflectau în meniul lateral interior dacă foloseam structura pe bază de pagini, motiv pentru care am ales varianta cu meniu. Dar îți mulțumesc.

TechRemarker TechRemarker
19 mai 2011 00:21:15