Mostrar Automáticamente el Submenú en WordPress

29 jun 2012, 23:14:35
Vistas: 17.2K
Votos: 1

Para empezar... soy nuevo en WordPress y desarrollo de temas.

Tengo un menú principal que he colocado en mi cabecera usando el siguiente código:

<?php wp_nav_menu( array( 'theme_location' => 'primary', 'menu_class' => 'topNav', 'after' => '<span> </span>' ) ); ?>

También he definido mi menú así:

Definición del menú

Funciona como deseo (bueno, casi):

Vista de la página

Ahora, quiero mostrar un submenú en el área de contenido blanco debajo. El submenú se mostraría igual que el menú principal (ContentTopNavigation). Entonces, si el menú estuviera configurado así (solo para demostración):

Definición del Submenú

Y se seleccionara el ítem principal TIENDA, la página TIENDA tendría un menú en la parte superior que mostraría los 3 ítems del submenú.

¿Cómo hago que esta relación sea automática? Es decir, que el submenú de la página se muestre automáticamente basado en el ítem de menú principal mostrado.

0
Todas las respuestas a la pregunta 1
3

Si estás desarrollando este tema con tu propio marcado HTML y CSS, entonces debería ser bastante fácil...

<?php wp_nav_menu( array( 'theme_location' => 'primary', 'menu_class' => 'topNav', 'after' => '<span> </span>' ) ); ?>

Notarás que este menú en PHP genera una lista desordenada con tu submenú como una lista desordenada anidada.

Observa el marcado generado en el DOM, se verá algo así...

<ul class="menu">

    <li class="menu-item">
        <a href="...">Inicio</a>
    </li>

    <li class="menu-item current-menu-parent">  
        <a href="...">Tienda</a>

        <ul class="sub-menu" style="display: none;">

            <li class="sub-menu-item">
                <a href="...">Mi Cuenta</a>
            </li>

            <li class="sub-menu-item current-menu-item">
                <a href="...">Rastrea tu pedido</a>
            </li>

            <li class="sub-menu-item">
                <a href="...">Pagar - Finalizar compra</a>
            </li>

        </ul>

    </li>

    <li class="menu-item">
        <a href="...">Taller</a>
    </li>

    <li class="menu-item">
        <a href="...">Galería</a>
    </li>

</ul>

Puedes ver en el marcado que WordPress genera una clase para cada elemento.

Y cuando un elemento del menú está activo, WordPress añade las clases activas current-menu-item o current-menu-parent a los li's.

Así que usando un poco de jQuery como el siguiente, puedes controlar la visibilidad de esos subelementos...

var allSubmenus = $('.sub-menu').hide();
// esta variable oculta todos los submenús ul con 'display: none;'

$('li.current-menu-parent, li.current-menu-item').find('ul').show();
// si estos li tienen las clases current, se establecen a 'display: block', esto es para recargas de página para que el menú actual sea visible al cargar la página.

$('li.menu-item a').click(function() {
    allSubmenus.hide();
    $(this).parent().find('ul').show();
});
// básicamente, cuando se hace clic en un enlace del menú, oculta todos los submenús usando nuestra variable, luego encuentra cualquier ul hijo (submenú) y lo establece a 'display block'

Luego de esto, tienes que ser inteligente con tu CSS y posicionar tu ul.sub-menu como absoluto respecto al padre ul.menu { position: relative } - y asegurarte de que el li.menu-item y ul.menu tengan el overflow configurado como visible, pero li.menu-item NO debe tener posicionamiento.

Déjame saber si no puedes resolver el CSS.


ACTUALIZACIÓN

Prácticamente me di cuenta, si tus submenús solo aparecen en la página del current-menu-item mismo, y no quieres que el submenú aparezca mientras estás en otra página del menú principal... entonces simplemente configuras tu CSS así, sin necesidad de jQuery... (pero usando el mismo método CSS mencionado anteriormente también)

ul.menu {
   position: relative;
   overflow: visible;
}

li.menu-item {
   /* Sin posicionamiento */
   overflow: visible;
   float: left;
}

ul.sub-menu {
   display: none;
   position: absolute;
}

li.sub-menu-item {
   float: left;
}

li.current-menu-parent ul,
li.current-menu-item ul {
   display: block !important;
}
30 jun 2012 01:44:49
Comentarios

Gracias por la respuesta detallada. Fue muy útil. He optado por la ruta sin jQuery. Creo que tengo el CSS como lo tenías en mente. Usando el [código], ciertamente se muestra en el área de contenido blanco, sin embargo, también se desborda de ese contenido, lo cual no es deseable. Este es puramente un problema de CSS ahora, a menos que haya una manera de llamar a wp_nav_menu una vez en el encabezado (para mostrar el nivel superior) y una vez en el área de contenido (para mostrar el submenú).

Jason Jason
1 jul 2012 02:19:28

No hay problema. Como el submenú está posicionado de forma absoluta, no empuja el contenido hacia abajo en el área blanca. Hmmm, podrías usar algo de jQuery o PHP condicional para agregar una clase al div del área blanca. Esta clase podría agregar un relleno superior adicional para dejar espacio al submenú.

Joshc Joshc
1 jul 2012 22:27:50

Lo que terminé haciendo fue simplemente hacer dos llamadas a la función wp_nav_menu. Lo hago una vez en el encabezado y oculto el submenú usando la clase sub-menu. Eso es bastante fácil. Luego lo hago en la plantilla de la página. Esto fue un poco complicado porque resulta que no puedes ocultar el padre y mostrar el hijo (o al menos no pude lograrlo). Así que tuve que establecer el tamaño de fuente del padre a cero. Eso terminó dándome lo que necesitaba.

Jason Jason
1 jul 2012 22:47:51