Existe alguma maneira de pegar os itens do menu de navegação como uma matriz multidimensional em vez de uma matriz plana?
Por uma estrutura em forma de árvore, quero dizer algo que preservaria o relacionamento entre itens filho e pai, assim (este é apenas um exemplo)…
array(
array(
'post_type' => 'page',
'post_name' => 'Home',
'children' => array()
),
array(
'post_type' => 'page',
'post_name' => 'About Us',
'children' => array(
array(
'post_type' => 'page',
'post_name' => 'Our History',
'children' => array()
)
)
)
)
Existe uma wp_get_nav_menu_items()
função, mas ela retorna uma matriz unidimensional com todos os itens no mesmo nível, o que não é o que eu quero. O WordPress inclui uma maneira integrada de obter uma matriz multidimensional para meus itens de menu? Caso contrário, qual é a melhor maneira de obter wp_get_nav_menu_items()
como estrutura de árvore uma matriz multidimensional em termos de desempenho?
Walker
classe lida com a profundidade dos itens de menu de navegação classificados automaticamente, mesmo que a matriz seja plana.Respostas:
O problema de construir uma árvore a partir de uma matriz plana foi resolvido aqui com esta solução recursiva levemente modificada:
onde adicionamos o
wpse_children
atributo prefixado para evitar a colisão de nomes.Agora só precisamos definir uma função auxiliar simples:
Agora fica super fácil transformar um menu de navegação em sua estrutura de árvore com:
Para JSON, podemos simplesmente usar:
Para uma versão ligeiramente diferente, na qual escolhemos os atributos manualmente, confira a primeira revisão desta resposta aqui .
Atualização: Walker Class
Aqui está uma idéia bastante superficial de como poderíamos tentar nos conectar à parte recursiva do
display_element()
método daWalker
classe abstrata .onde
WPSE_Nav_Menu_Tree
é uma extensão daWalker_Nav_Menu
classe:Isso pode nos dar uma abordagem alternativa, se funcionar.
fonte
wp_get_nav_menu_items
recursivamente.Resumindo, a função abaixo cria a árvore de objetos colocando filhos em uma nova propriedade filhos dentro do objeto pai.
Código:
Uso:
Resultado:
fonte
Versão modificada da resposta aceita, que leva em consideração a
menu_order
propriedade dos itens de menu para manter a ordem correta da matriz plana original.menu_order
é definido automaticamente pelo WordPress, portanto, não é necessário verificar nada:Uso:
fonte
Pode haver um mal-entendido aqui sobre os itens do menu de navegação do WordPress como estruturas semelhantes a árvores.
Estruturas de árvore no WordPress NÃO SÃO ARTIGOS MULTIDIMENSIONAIS!
Observe que, embora a matriz de itens de menu retornada seja plana, ela ainda é uma estrutura semelhante a uma árvore, pois cada item contém informações sobre sua ascendência (o valor pai é 0 se o item não tiver pai - ou o ID do item pai se faz).
Quando você passa essa matriz para a
Walker
classe, ela percorre os resultados e cria duas matrizes - uma contendo itens de nível superior e outra contendo itens filhos no formato em$parent_id => array()
que a matriz contém itens de menu que são filhos diretos desse elemento.O caminhante percorre a matriz de itens de nível superior, processa esse item e verifica a matriz filho para ver se há filhos para o elemento atual e processa cada um deles da mesma maneira, recursivamente.
Se você deseja saber como converter uma estrutura semelhante a uma árvore do WordPress em uma matriz multidimensional, essa é uma pergunta completamente diferente (e não tecnicamente uma pergunta do WordPress). Mas as informações retornadas por
wp_get_nav_menu_items()
são uma estrutura semelhante a uma árvore ... e você pode usarWalker
como está para lidar com isso.Se você quiser ver o código exato que a classe Walker do WordPress executa para percorrer a matriz, dê uma olhada em Walker-> walk () no WordPress Trac das linhas 213-258 . Você pode usar esse código como está para criar uma matriz multidimensional, se é isso que você procura.
Caminhantes
O WordPress foi projetado para usar a
Walker
classe para processar suas estruturas semelhantes a árvores. Se você está simplesmente renderizando um menu, ou realmente precisa apenas da saída definitiva, considere usarwp_nav_menu()
a saída do menu…Exemplo:
Você estenderia a classe Walker (por exemplo
Your_Walker()
) para obter a saída necessária. Por exemplo, veja esta entrada no Codex .fonte
$sorted_menu_items
ainda é uma matriz "plana" e a saída da opção B é uma sequência.wp_get_nav_menu_items()
retorna uma estrutura semelhante a uma árvore - ou seja, uma matriz em que cada item contém dados de ascendência. Essas estruturas devem ser renderizadas com umaWalker
classe. Se o caso de uso aqui envolver apenas a conversão de uma matriz "plana" em uma matriz multidimensional com base em dados de pais (por exemplo'post_parent' => 123
), essa pergunta não é tecnicamente sobre WordPress e deve ser movida para Stack Overflow.