Mostrare un elemento specifico del menu da wp_nav_menu basato sull'ID
Ho un wp_nav_menu "Menu Principale" come il seguente:
- Livello superiore (#menu-item-1)
- Sotto-elemento
- Sotto-elemento
- Livello superiore (#menu-item-2)
- Sotto-elemento
- Livello superiore (#menu-item-3)
- Sotto-elemento A
- Sotto-elemento B
- Sotto-elemento a.1
- Sotto-elemento C
Poi nel mio template voglio essere in grado di visualizzare i sotto-elementi del wp_nav_menu Menu Principale per il livello superiore con ID menu-item-3 dove menu-item-3 è l'elemento corrente del menu principale.
Quindi qualcosa del genere: (ma che funzioni davvero ovviamente)
wp_nav_menu( array('menu' => 'Main Menu', 'menu-item-id' => '3' ));
E che dovrebbe restituire:
- Sotto-elemento A
- Sotto-elemento B
- Sotto-elemento a.1
- Sotto-elemento C
Se serve come informazione, questo mi serve per mostrare i sotto-elementi come menu laterale interno basato dinamicamente sulla sezione del menu principale in cui ti trovi. Grazie in anticipo!
Da notare che questa non è una duplicata di "http://wordpress.stackexchange.com/questions/2802/display-a-portion-branch-of-the-menu-tree-using-wp-nav-menu". Anche se quella pagina ha diverse risposte simili, nessuna funziona come previsto con l'ultima versione di WordPress. Cioè mostrare un particolare sotto-elemento del menu e tutti i suoi figli, i figli dei figli e così via (profondità illimitata).

Se ho capito correttamente quello che vuoi, puoi farlo con il CSS. Chiamerai wp_nav_menu normalmente e lascerai che generi tutti i link, ma poi nasconderai tutti tranne il sottomenu della pagina corrente.
Il tuo CSS sarebbe qualcosa del genere,
#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;
}
Aggiornamento: Puoi dare un'occhiata a http://thataboycreative.com per vedere un esempio di dove ho usato questa tecnica prima. Ecco il CSS rilevante da quell'esempio:
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 Questo non funziona. Non ho mai visto "current-page-parent" usato prima. Credo che WP generi "current-menu-item" e "current_page_item". Ma anche usando quelli non sembra funzionare e nasconde semplicemente l'intero menu. Hai mai implementato con successo questo metodo su un sito a cui potrei fare riferimento?

Anche current-page-parent esiste, ma potrebbe essere presente solo in alcune versioni. WP non è stato molto coerente con la denominazione delle classi. Modificherò la risposta per mostrare un esempio di dove l'ho fatto in precedenza.

Proverò il tuo nuovo codice CSS per vedere se può funzionare come opzione temporanea finché non trovo un modo per farlo nel codice. Con il metodo CSS, la pagina dovrebbe comunque caricare tutti gli elementi del menu, aumentando il tempo di caricamento e le risorse, e semplicemente nasconderli. Ma a causa di una scadenza stretta, è sicuramente un'opzione da considerare. Grazie.

In realtà, non credo che succederebbe, perché WordPress memorizza nella cache le letture dal database. Quindi, se hai già chiamato wp_nav_menu() una volta per il tuo menu principale, chiamarlo una seconda volta per il menu secondario non risulterà in una seconda query al database.

Ho creato un plugin per questo - assicurati di passare l'ID come STRINGA e non come numero intero. Per favore valuta il mio plugin - è il mio primo! :)

Un altro modo in cui ho affrontato questo problema è recuperare direttamente i post, invece di utilizzare wp_nav_menu. Questo si basa però sulla struttura effettiva delle pagine, non sul menu.
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>

Inizialmente l'avevo configurato utilizzando le pagine, che richiedevano solo poche righe di codice dal sito di WordPress, tuttavia quando ci si trovava su una sotto-sottopagina, mostrava il sotto-sottomenu, anziché il primo livello secondario e i suoi discendenti. Inoltre, quando l'utente aggiornava il menu principale, non si rifletteva nel menu laterale interno se si utilizzava la struttura a pagine, motivo per cui ho scelto il metodo basato sui menu. Ma grazie lo stesso.
