Cum să afișezi un anumit element de meniu din wp_nav_menu bazat pe ID
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ă).

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;
}

@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?

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.

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.

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, acesta este un punct bun dacă așa funcționează, presupunând.

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

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>

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.
