Estou tentando criar um menu que mostre no máximo 5 itens. Se houver mais itens, ele deve agrupá-los em outro <ul>
elemento para criar um menu suspenso.
5 itens ou menos:
6 itens ou mais
Eu sei que esse tipo de funcionalidade pode ser facilmente criado com um andador que conta os itens de menu e envolve se houver mais de 5 o restante em um separado <ul>
. Mas não sei como criar esse andador.
O código que mostra meu menu no momento é o seguinte:
<?php wp_nav_menu( array( 'theme_location' => 'navigation', 'fallback_cb' => 'custom_menu', 'walker' =>new Custom_Walker_Nav_Menu ) ); ?>
Notei que, se o menu não for definido pelo usuário e ele usar a função de fallback, o andador não terá efeito. Eu preciso que ele funcione nos dois casos.
menus
navigation
walker
Bola de neve
fonte
fonte
Walker_Nav_Menu
e há um exemplo no codex . O que você quer dizer com "Eu não sei como criar o Walker"?Respostas:
Usando um Walker personalizado, o
start_el()
método tem acesso a$depth
param: quando ele é0
o elemento principal, e podemos usar essas informações para manter um contador interno.Quando o contador atingir um limite, podemos usar
DOMDocument
para obter da saída HTML completa apenas o último elemento adicionado, envolvê-lo em um submenu e adicioná-lo novamente ao HTML.Editar
Quando o número de elementos é exatamente o número que solicitamos + 1, por exemplo, solicitamos que 5 elementos estejam visíveis e o menu tenha 6, não faz sentido dividir o menu, porque os elementos serão 6 de qualquer maneira. O código foi editado para resolver isso.
Aqui está o código:
O uso é bem simples:
fonte
$split_at = 5
, mas$count
começa de índice em 0.$split_at
argumento, 5 por padrão.Existe até uma maneira de tornar isso possível apenas com CSS. Isso tem algumas limitações, mas eu ainda pensei que poderia ser uma abordagem interessante:
Limitações
Abordagem
Embora eu não esteja realmente usando "Consultas de quantidade", o uso criativo
:nth-child
e~
li nas recentes Consultas de quantidade para CSS foram o que me levou a essa solução.A abordagem é basicamente esta:
...
pontos usando umbefore
pseudoelemento.Aqui está o código CSS para uma marcação de menu padrão do WordPress. Eu comentei em linha.
Também criei um jsfiddle para mostrá-lo em ação: http://jsfiddle.net/jg6pLfd1/
Se você tiver mais alguma dúvida sobre como isso funciona, deixe um comentário. Teremos prazer em esclarecer melhor o código.
fonte
Você pode usar
wp_nav_menu_items
filtro. Ele aceita saída de menu e argumentos que contêm atributos de menu, como slug de menu, contêiner etc.fonte
DOMDocument
pode ser usado. No entanto, nesta pergunta não há submenus, portanto, a resposta está correta para este caso específico. O DOMDocument seria uma solução "universal", mas não tenho tempo no momento. Você pode investigar;) looping através dos itens LI, se alguém tem UL criança ignorá-lo, essa seria a solução, mas precisa de escrita versão :)ul
. O WordPress já faz loops de itens de menu no menu walker. Já é uma operação lenta, por si só , adicionando um loop adicional que eu acho que não é a solução certa. No país, um caminhante personalizado seria uma solução muito mais limpa e eficiente.Tem uma função de trabalho, mas não tem certeza se é a melhor solução.
Eu usei um andador personalizado:
A função que mostra o menu real é a seguinte:
Declarei a variável global $ menu_items e a usei para mostrar o fechamento
<li>
e<ul>
-tags. Provavelmente é possível fazer isso também dentro do andador personalizado, mas não encontrei onde e como.Dois problemas: 1. Se houver apenas 5 itens no menu, ele envolverá o último item e, ainda assim, não será necessário.
fonte
substr_count($output,'<li')
estará== 4
no lugar errado ...