PHP / WordPress: agregue flechas a los menús principales

5 minutos de lectura

¿Es posible agregar algún tipo de clase como ‘flecha’ o un lapso dentro de los menús que tienen submenús (en WordPress)? parece que puedes hacer esto usando javascript, pero quiero saber si hay una solución PHP…

en WP 3.0, vi que los menús activos tienen las clases “principal” o “ancestro”, pero esto es solo para el menú activo, y también lo necesito para los inactivos

  • ¿Está utilizando el generador de menús en 3.0? ¿O estás usando páginas o categorías para la navegación? Explique cómo obtiene los menús e ilustre con su código de trabajo para que podamos ayudarlo mejor.

    – kevtrucha

    24 de agosto de 2010 a las 18:24

  • estoy usando los menús personalizados incorporados

    – Alex

    24 de agosto de 2010 a las 18:40

avatar de usuario
donald harvey

¡Esta funcionalidad realmente debería estar en el núcleo de WordPress!
De todos modos, eché un vistazo a la fuente de la plantilla de menú que envió en un comentario sobre la otra respuesta, y encontré una forma (bastante extraña) de agregar una clase en los elementos del menú con niños. Básicamente, subclasifica el caminante predeterminado para extender su comportamiento predeterminado. Probablemente sea mejor si lo pones en tu tema functions.php. Aquí está el código:

<?php
class Arrow_Walker_Nav_Menu extends Walker_Nav_Menu {
    function display_element($element, &$children_elements, $max_depth, $depth=0, $args, &$output) {
        $id_field = $this->db_fields['id'];
        if (!empty($children_elements[$element->$id_field])) { 
            $element->classes[] = 'arrow'; //enter any classname you like here!
        }
        Walker_Nav_Menu::display_element($element, $children_elements, $max_depth, $depth, $args, $output);
    }
}
?>

Para llamarlo, deberá agregar el walker argumento cuando llamas wp_nav_menu() en tu tema, así:

<?php 
wp_nav_menu(array('walker' => new Arrow_Walker_Nav_Menu, [other arguments...]))
?>

¡Espero que eso te funcione! Solo lo he probado superficialmente, pero parece funcionar. Avíseme si hay casos extremos en los que falla la adición de la clase.

  • hay una situación en la que falla: cuando hay una función de devolución de llamada especificada en los argumentos (fallback_cb), es decir. cuando no tiene un menú personalizado creado, wp_nav_menu recuperará los elementos del menú de la función wp_page_menu(), que usa un Walker diferente, creo

    – Alex

    29 de agosto de 2010 a las 14:26


  • Sí, el caminante utilizado por wp_page_menu no permite agregar clases con tanta facilidad. Echaré un vistazo y veré si puedo pensar en una solución en los próximos días y editaré mi respuesta si encuentro algo.

    –Donald Harvey

    5 de septiembre de 2010 a las 10:27

No conozco ningún soporte nativo de WordPress para esto, pero podrías hacerlo fácilmente usando algo de jQuery.

<script type="text/javascript">
$("#menu-id ul li:has(ul)").addClass("parent");
</script>

  • gracias, eso lo sabia. Me preguntaba si hay una manera de hacer esto con PHP. El problema con el método js es que obtiene un pequeño “parpadeo” durante la carga de la página, si los elementos del menú tienen un ancho variable

    – Alex

    28 de agosto de 2010 a las 13:26


  • Entonces, ¿está pidiendo una forma de modificar el HTML que WP está generando a medida que lo genera, entonces? ¿No hay soporte incorporado para eso o una forma en que puede personalizar sus plantillas?

    – Rup

    28 de agosto de 2010 a las 13:31

  • bueno, puede obtener la salida del menú completo (una cadena) y modificarla antes de que se repita, pero no sé qué podría cambiar allí… la plantilla del menú está aquí: core.trac.wordpress.org/browser/trunk/wp-includes/…

    – Alex

    28 de agosto de 2010 a las 13:39


  • Tengo algo un poco como esto en mi blog de WordPress. Hace uso de una función xml to array y descubre qué elementos li tienen submenús, luego les agrega una clase y la vuelve a convertir a xml. La fuente de las funciones está aquí: mysrc.blogspot.com/2007/02/php-xml-to-array-and-backwards.html

    – GoalieGuy6

    28 de agosto de 2010 a las 16:10

avatar de usuario
ccnokes

Si es como yo y desea agregar una flecha HTML en un lapso a su elemento de menú principal, agregue una línea como esta dentro de la clase de caminante de clientes de Donald Harvey:

$element->title .= '<span class="caret down-caret">&#x25BC;</span>'; 

También puede agregar ese HTML directamente a la etiqueta del menú en la página de menú de administración de WP > pero esa no es una buena manera de hacerlo.

Escribí un poco sobre esto aquí http://cameronnokes.com/blog/agregando-un-icono-a

Simplemente pegue esto en su código css y funcionará como se esperaba.

.nav-menu li > a:after {
    color: #888;
    content: ' ▾';
}

.nav-menu li > a:hover:after {
    color: #444;
    content: ' ▾';
}

.nav-menu li > a:only-child:after {
    content: '';
}

PD. No olvide configurar su página UTF-8

avatar de usuario
Suresh Kamal

La forma simple y humilde de agregar el padre de la clase al menú principal si tiene un submenú

<script type="text/javascript">
jQuery(document).ready(function($) {
    $("ul.sub-menu").parents().addClass('parent');  
});
 </script>

Y el estilo es

    <style type="text/css">
       .main-navigation .parent > a, .main-navigation .parent > a:hover {
            background-image: url("images/arrow.png");
            background-position: right center;
            background-repeat: no-repeat;
     }  

    </style>

avatar de usuario
Kesar Sisodiya

No sé cuál es la pregunta, pero podemos agregar una flecha en el menú al css como esto:

.menu li > a:after {
    color: #fff;
    content: ' ▾';
}

.menu li > a:only-child:after {
    content: '';
}

¿Ha sido útil esta solución?