Mostrar un elemento específico del menú wp_nav_menu basado en su ID

18 may 2011, 04:38:57
Vistas: 18.7K
Votos: 3

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

5
Comentarios

posible duplicado de Mostrar una porción/rama del árbol del menú usando wp_nav_menu()

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

Creo que puedes resolver esta pregunta leyendo la respuesta a esta pregunta. Si no puedes resolverlo después de leer esa pregunta, por favor edita tu pregunta para aclarar qué intentaste y qué no funcionó. (Usa @Jan cuando respondas en un comentario y recibiré una notificación)

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

¡Esto se ve perfecto! Lo probaré esta mañana mientras leo esos comentarios y veré si funciona. ¡Gracias Jan!

TechRemarker TechRemarker
18 may 2011 15:48:29

Lamentablemente, después de probar esas opciones en ese enlace, no he encontrado una solución viable. La primera clase walker simplemente muestra todos los elementos del menú, lo que significa que no funciona. La tercera en la lista parecía funcionar, pero solo muestra el elemento superior del menú y solo un nivel hacia abajo, mientras que yo necesito todos los niveles. Probé la opción del plugin, pero tampoco funciona, simplemente muestra todos los elementos del menú. La siguiente respondida por Alp muestra el menú lateral y no el nivel superior, lo cual es genial, pero sí muestra sus elementos secundarios. Y la última en la página no funciona en absoluto. ¿Alguna sugerencia?

TechRemarker TechRemarker
18 may 2011 17:26:01

@heavymark, ¿llegaste a encontrar una solución para esto?

Ian Dunn Ian Dunn
9 jul 2011 19:19:55
Todas las respuestas a la pregunta 3
6

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;
    }
18 may 2011 09:03:02
Comentarios

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

TechRemarker TechRemarker
18 may 2011 17:40:11

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.

Ian Dunn Ian Dunn
18 may 2011 18:40:13

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.

TechRemarker TechRemarker
19 may 2011 00:24:52

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 Dunn Ian Dunn
19 may 2011 03:13:10

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

TechRemarker TechRemarker
20 may 2011 18:08:16

Revisé el código ayer y wp_nav_menu() eventualmente llama a get_term(), y eso llama a wp_cache_add() en el término.

Ian Dunn Ian Dunn
21 may 2011 00:56:11
Mostrar los 1 comentarios restantes
1

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

Descargar aquí

8 mar 2012 22:33:22
Comentarios

¿El prefijo para tu función personalizada es wp_? Eso algún día fallará.

fuxia fuxia
2 nov 2012 22:54:21
1

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>
18 may 2011 18:52:38
Comentarios

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.

TechRemarker TechRemarker
19 may 2011 00:21:15