¿Cómo crear un menú desplegable como el del tema Twenty Eleven?

14 sept 2011, 15:46:31
Vistas: 21.4K
Votos: 3

Me gusta mucho la solución del menú desplegable del tema Twenty Eleven:

http://twentyelevendemo.wordpress.com/

y me gustaría crear uno similar pero no puedo entender cómo funciona, ¿está basado en algún código existente para menús desplegables?

¿Hay algún código fuente que se pueda utilizar, o alguien puede explicar el principio detrás de él?

Sé que internet está lleno de soluciones tanto con JavaScript como sin él, incluso he creado algunas yo mismo, pero en mi opinión nada se acerca a este menú, así que agradezco cualquier ayuda :)

2
Comentarios

puedes acceder al código descargando Twenty Eleven http://wordpress.org/extend/themes/twentyeleven

Michael Michael
14 sept 2011 15:56:53

Excelente comentario, y eso fue lo primero que hice, pero todo estaba demasiado desordenado para entenderlo, aunque lo intenté.

CodeVirtuoso CodeVirtuoso
14 sept 2011 16:48:10
Todas las respuestas a la pregunta 2
3

Aquí hay un fragmento rápido que uso para comenzar mis proyectos:

El primer paso es agregar algo de código al archivo functions.php. Esto es lo que habilitará el Menú Personalizado de WordPress. Los controles estarán en Apariencia>Menús una vez que hayas terminado. Código para functions.php:

<?php
add_action( 'init', 'register_my_menus' );
function register_my_menus() {
register_nav_menus(
array(
    'main' => __( 'Menú Principal' ),
    'secondary-menu' => __( 'Menú Secundario' ),
    ));
}
?>

El código anterior permite dos menús. Te mostraré cómo agregar uno, y si quieres puedes usar el mismo método para agregar un segundo donde desees.

El siguiente paso es agregar el código al archivo header.php. Observa que arriba el primer menú en el array está etiquetado como main. Esto es lo que usaremos para colocar el menú en el header.php.

Aquí está el código para header.php:

<div id="menu" class="menu-center">
    <?php wp_nav_menu( array( 'theme_location' => 'main' ) ); ?>
</div>

Esto debe colocarse dentro de tus <div id="header"> (no es obligatorio, pero es el lugar más común para este código).

El último paso es agregar algo de CSS para estilizar el menú y hacer que realmente "descienda", en lugar de ser un montón de enlaces multinivel.

El código CSS:

ul.menu,ul.menu ul,ul.menu li,ul.menu a {
display:block;
margin:0;
padding:0;
}

ul.menu ul {
display:none;
}
ul.menu li:hover {
z-index:999;
}
ul.menu li:hover > ul {
display:block;
position:absolute;
float:left;
}
ul.menu li {
float:left;
width:auto;
}
ul.menu ul li {
float:left;
width:190px;
}
ul.menu ul li ul {
float:left;
width:190px;
position:absolute;
left:100%;
top:0;
}
ul.menu-ver,ul.menu-ver ul {
width:14em;
}

div.menu-center ul.menu {
float:left;
position:relative;
left:50%;
}

div.menu-center ul.menu li {
position:relative;
left:-50%;
}

div.menu-center ul.menu li li {
left:auto;
}


ul.menu li a {
border-bottom:1px outset ghostwhite;
}

ul.menu li a {
padding:8px 12px 10px;
}

ul.menu li a:link,ul.menu li a:hover,ul.menu li a:visited,ul.menu li a:active {
text-decoration:none;
border-bottom:1px outset black;
}


ul.menu li {
background: #45484d;
background: -moz-linear-gradient(top, #45484d 0%, #000000 100%);
background: -webkit-gradient(linear, left top, left bottom, color-stop(0%,#45484d), color-stop(100%,#000000));
background: -webkit-linear-gradient(top, #45484d 0%,#000000 100%);
background: -o-linear-gradient(top, #45484d 0%,#000000 100%);
background: -ms-linear-gradient(top, #45484d 0%,#000000 100%);
filter: progid:DXImageTransform.Microsoft.gradient( startColorstr='#45484d', endColorstr='#000000',GradientType=0 );
background: linear-gradient(top, #45484d 0%,#000000 100%);
}
.menu-center {
float:right;
margin-right:95px;
}

ul.menu li a{
color:ghostwhite;
}
ul.menu li a:hover {
background: #efefef;
background: -moz-linear-gradient(top, #efefef 0%, #ffffff 100%);
background: -webkit-gradient(linear, left top, left bottom, color-stop(0%,#efefef), color-stop(100%,#ffffff));
background: -webkit-linear-gradient(top, #efefef 0%,#ffffff 100%);
background: -o-linear-gradient(top, #efefef 0%,#ffffff 100%);
background: -ms-linear-gradient(top, #efefef 0%,#ffffff 100%);
filter: progid:DXImageTransform.Microsoft.gradient( startColorstr='#efefef', endColorstr='#ffffff',GradientType=0 );
background: linear-gradient(top, #efefef 0%,#ffffff 100%);
color:black;
}

Puedes jugar con el CSS para ajustarlo a tu gusto, pero esto debería darte un buen punto de partida.

Editado para compatibilidad con WordPress 3.3:

Después de actualizar a la última versión de WordPress (v3.3) parece que los menús no funcionarán si tu tema está usando el hook after_setup_theme y usas el hook 'init' para registrar los menús.

La solución:

Para este ejemplo usaré el nombre yourtheme como nombre_de_la_función.

Ejemplo de archivo functions.php:

<?php
if ( ! isset( $content_width ) )
$content_width = 610;
add_action( 'after_setup_theme', 'yourtheme_setup' );
if ( ! function_exists( 'yourtheme_setup' ) ):
function yourtheme_setup() {
  // Agrega estilos al editor visual (editor-style.css)
  add_editor_style();
  add_theme_support( 'automatic-feed-links' );
  // Registrar Menús Personalizados
    register_nav_menus(
      array(
        'main' => 'Menú Principal',
        'secondary' => 'Menú Secundario',
        )
      );  
  // Agregar Miniaturas de Entradas y Tamaños de Imagen Personalizados
  add_theme_support( 'post-thumbnails', array( 'post' ) );
  // Agregar soporte para varios formatos de entrada
  add_theme_support( 'post-formats', array( 'aside', 'link', 'gallery', 'status', 'quote', 'image' ));
  }
endif; // yourtheme_setup
/**
 * Comienza el resto del código de tu archivo functions.php...
 * 
 */
?>

Mira el archivo functions.php del tema TwentyTen para ver otras funciones que puedes incluir en el hook after_theme_setup.

14 sept 2011 16:12:03
Comentarios

Jeremy - Inserté ese código en functions, pero no aparece en mi "menú" bajo apariencia. ¿Hay algún lugar específico donde debería pegarlo??? ¡Gracias!

User User
16 dic 2011 22:37:26

Solo necesita colocarse en el archivo functions.php. Asegúrate de que tu tema no esté usando 'register_my_menus'. Tal vez puedas cambiarlo a 'register_my_custom_menus'. Solo asegúrate de cambiar ambas instancias. Acabo de probarlo en un tema del repositorio que no venía con menús personalizados y funcionó bien. Algunas preguntas para ti: ¿Tu tema actual ya usa menús personalizados? ¿Es tu tema uno que pueda descargar? Lo revisaré si está disponible y si me da algún problema.

Jeremy Jared Jeremy Jared
17 dic 2011 04:13:32

@Megan at Fiterature: Parece que hubo un problema. Por alguna razón, cuando lo probé en mi sitio usando la instalación beta de WordPress funcionó. Acabo de crear un nuevo sitio, instalé WordPress 3.3. Fue entonces cuando noté que los menús no se registraban como dijiste. Consulta el código anterior para ver la solución que lo solucionó para mí.

Jeremy Jared Jeremy Jared
17 dic 2011 21:49:54
1

Estaba haciendo exactamente esto recientemente. No sé qué tan avanzado estás, así que puede que ya sepas algunas de estas cosas.

Encontré este video que es muy bueno (más su segunda parte)

Creo que una de las investigaciones originales que se hicieron fue esta

Creo que Twenty Eleven también usa el plugin jQuery Superfish

Como mencionó otro usuario, puedes encontrar el código de Twenty Eleven en algún lugar entre los archivos del tema

14 sept 2011 16:06:06
Comentarios

Gracias, superfish resultó ser lo que proporcionaba exactamente la misma funcionalidad.

CodeVirtuoso CodeVirtuoso
14 sept 2011 16:49:10