Mostrar un elemento específico del menú wp_nav_menu basado en su ID
Tengo un menú wp_nav_menu "Menú Principal" como el siguiente:
- Nivel Superior (#menu-item-1)
- Sub Elemento
- Sub Elemento
- Nivel Superior (#menu-item-2)
- Sub Elemento
- Nivel Superior (#menu-item-3)
- Sub Elemento A
- Sub Elemento B
- Sub Elemento a.1
- Sub Elemento C
Luego, en mi plantilla quiero poder mostrar solo los subelementos del Menú Principal para un elemento superior específico, por ejemplo el que tiene el ID menu-item-3, donde menu-item-3 es el elemento superior actual del menú.
Algo así: (pero que funcione realmente)
wp_nav_menu( array('menu' => 'Menú Principal' 'menu-item-id' => '3' ));
Y eso debería retornar:
- Sub Elemento A
- Sub Elemento B
- Sub Elemento a.1
- Sub Elemento C
Si es relevante, esto es para poder mostrar los subelementos como menú lateral interior basado dinámicamente en qué sección del menú principal te encuentras. ¡Gracias de antemano!
Nota: Esto no es un duplicado de "http://wordpress.stackexchange.com/questions/2802/display-a-portion-branch-of-the-menu-tree-using-wp-nav-menu". Aunque esa página tiene varias respuestas similares, ninguna funciona como se espera con la versión actual de WordPress. Se trata de mostrar un subelemento de menú particular y todos sus hijos, los hijos de estos y así sucesivamente (profundidad ilimitada).

Si entiendo correctamente lo que deseas, puedes hacer esto con CSS. Llamarás a wp_nav_menu normalmente y dejarás que genere todos los enlaces, pero luego ocultarás todos excepto el submenú de la página actual.
Tu CSS se vería algo así:
#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;
}
Actualización: Puedes ver http://thataboycreative.com para ver un ejemplo donde he usado esto antes. Aquí está el CSS relevante de ese ejemplo:
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 Esto no funciona. No he visto que se use "current-page-parent" antes. Creo que WP genera "current-menu-item" y "current_page_item". Pero incluso usando esos, parece no funcionar y simplemente oculta todo el menú. ¿Has hecho esto con éxito en un sitio antes que puedas referenciar?

current-page-parent también existe, pero puede que solo esté en algunas versiones. WP no ha sido muy consistente con los nombres de las clases. Editaré la respuesta para mostrar un ejemplo de donde lo he hecho antes.

Probaré tu nuevo código CSS para ver si funcionará como una opción temporal hasta que determine una forma de hacerlo en el código. Ya que con el método CSS, la página aún necesitaría cargar todos los elementos del menú, aumentando el tiempo de carga y los recursos, y simplemente ocultándolo. Pero debido a una limitación de tiempo, ciertamente es una opción a considerar. Gracias.

En realidad, no creo que lo haga, porque WordPress almacena en caché las lecturas de la base de datos. Entonces, si ya has llamado a wp_nav_menu() una vez para tu menú principal, llamarlo una segunda vez para tu navegación secundaria no resultará en una segunda consulta a la base de datos.

@Ian, ese es un buen punto si es así como funciona presumiblemente.

Creé un plugin para esto - asegúrate de pasar el ID como una CADENA (STRING) y no como un entero (Integer). Por favor califica mi plugin - ¡es mi primer plugin! :)

Otra forma en que he hecho esto es obteniendo las publicaciones directamente, en lugar de usar wp_nav_menu. Sin embargo, esto se basa en la estructura real de la página, no en el menú.
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>

Inicialmente lo tenía configurado usando páginas, lo cual solo requería unas pocas líneas de código del sitio de WordPress, pero cuando estaba en una sub subpágina, mostraba el sub submenú en lugar del primer nivel de submenú y sus descendientes. Además, cuando el usuario actualizaba el menú principal, no se reflejaba en el menú lateral interior si se usaba la estructura de páginas, por lo que opté por la forma de menú. Pero gracias.
