Estoy tratando de crear un menú que muestre un máximo de 5 elementos. Si hay más elementos, debe envolverlos en otro <ul>
Elemento para crear un menú desplegable.
5 artículos o menos:
6 artículos o más
Sé que este tipo de funcionalidad podría crearse fácilmente con un andador que cuenta los elementos del menú y se ajusta si hay más de 5 la continuación en un separado <ul>
. Pero no sé cómo crear este andador.
El código que muestra mi menú en este momento es el siguiente:
<?php wp_nav_menu( array( 'theme_location' => 'navigation', 'fallback_cb' => 'custom_menu', 'walker' =>new Custom_Walker_Nav_Menu ) ); ?>
Me di cuenta de que si el usuario no define el menú y utiliza la función alternativa, el andador no tiene ningún efecto. Lo necesito para trabajar en ambos casos.
menus
navigation
walker
Bola de nieve
fuente
fuente
Walker_Nav_Menu
y hay un ejemplo en el códice . ¿Qué quieres decir con "No sé cómo crear el Walker"?Respuestas:
Usando un Walker personalizado, el
start_el()
método tiene acceso a$depth
param: cuando es0
el elemento es uno de los mejores, y podemos usar esta información para mantener un contador interno.Cuando el contador alcanza un límite, podemos usar
DOMDocument
para obtener de la salida HTML completa solo el último elemento agregado, envolverlo en un submenú y agregarlo nuevamente al HTML.Editar
Cuando el número de elementos es exactamente el número que requerimos + 1, por ejemplo, requerimos que 5 elementos estén visibles y el menú tiene 6, no tiene sentido dividir el menú, porque los elementos serán 6 de cualquier manera. El código fue editado para abordar eso.
Aquí está el código:
El uso es bastante simple:
fuente
$split_at = 5
pero el$count
índice comienza en 0.$split_at
argumento, 5 por defecto.Incluso hay una manera de hacer esto posible solo con CSS. Esto tiene algunas limitaciones, pero todavía pensé que podría ser un enfoque interesante:
Limitaciones
Acercarse
Aunque realmente no estoy usando "Consultas de cantidad", el uso creativo de
:nth-child
y~
he leído en las Consultas de cantidad recientes para CSS fue lo que me llevó a esta solución.El enfoque es básicamente este:
...
puntos usando unbefore
pseudo-elemento.Aquí está el código CSS para un marcado de menú predeterminado de WordPress. He comentado en línea.
También he creado un jsfiddle para mostrarlo en acción: http://jsfiddle.net/jg6pLfd1/
Si tiene más preguntas sobre cómo funciona esto, deje un comentario, me complacerá aclarar más el código.
fuente
Puedes usar
wp_nav_menu_items
filtro. Acepta resultados de menú y argumentos que contienen atributos de menú, como babosa de menú, contenedor, etc.fuente
DOMDocument
se puede usar. Sin embargo, en esta pregunta no hay submenús, por lo tanto, la respuesta es correcta para este caso específico. DOMDocument sería una solución "universal" pero no tengo tiempo en este momento. Puede investigar;) recorrer los elementos de LI, si uno tiene un hijo UL omitirlo, sería una solución pero necesita una versión escrita :)ul
. WordPress ya recorre los elementos del menú en el menú de Walker Ya es una operación lenta per se , agregando y un ciclo adicional, creo que no es la solución correcta, por el contrario, un andador personalizado sería una solución mucho más limpia y eficiente.Tiene una función de trabajo, pero no estoy seguro de si es la mejor solución.
Usé un andador personalizado:
La función que muestra el menú real es la siguiente:
Declaré la variable global $ menu_items y la usé para mostrar el cierre
<li>
y<ul>
-tags. Probablemente sea posible hacer eso también dentro del andador personalizado, pero no encontré dónde y cómo.Dos problemas: 1. Si solo hay 5 elementos en el menú, también envuelve el último elemento en un pensamiento, aunque no es necesario.
fuente
substr_count($output,'<li')
estará== 4
en el lugar equivocado ...