Criar array de menu que liste itens filhos no WordPress
Durante o desenvolvimento de um tema customizado para um cliente, precisei criar um array com todos os itens de um menu criado na estrutura do WordPress (Aparência > Menus).
Tranquilo! Consigo codificar menu customizado utilizando a função WordPress wp_get_nav_menu_items() e iterando pelos itens da array.
Mas como faz na hora de pegar os itens filhos para a criação de um submenu?
Cada item do menu tem uma propriedade chamada menu_item_parent com o ID do item pai. Mas acredita que o item pai não tem uma propriedade que lista quais são os filhos? 🤔
Depois de algumas horas tentando codificar alguma saída (na gambiarra mesmo) acabei chegando em uma solução boa – mas seria mais fácil se a função WordPress wp_get_nav_menu_items() mostrasse o número de itens filhos.
Após algumas pesquisas, encontrei esta postagem no Stack Overflow com um código completo – que é uma solução bem melhor que a minha gambiarra. 😅
A partir da postagem fiz a seguinte função:
// Criar array de menu com lista de filhos
function menu_mobile( $menu = 'menu' ) {
$menu = wp_get_nav_menu_items( $menu );
$child_items = [];
foreach ($menu as $key => $item) {
if ($item->menu_item_parent) {
array_push($child_items, $item);
unset($menu[$key]);
}
}
foreach ($menu as $item) {
foreach ($child_items as $key => $child) {
if ($child->menu_item_parent == $item->post_name
) {
if (!$item->child_items) {
$item->child_items = [];
}
array_push($item->child_items, $child);
unset($child_items[$key]);
}
}
}
return $menu;
}
Code language: PHP (php)
Utilize a função menu_mobile() e coloque o slug do menu criado no WordPress, por exemplo:
<?php menu_mobile( 'menu-principal' ); ?>
Code language: HTML, XML (xml)
Pronto, agora você tem uma array de menu que liste os itens filhos no WordPress – e pode desenvolver o seu menu customizado mais rápido. 🙂
Observação importante para evitar frustrações: o item do menu pai precisa ser uma página WordPress com ID e não um kink personalizado, porque o menu_item_parent pega o ID referente da página – e links personalizado não têm ID.
Caso o item pai não tenha ID, a propriedade child_items do objeto não existirá e seus filhos não aparecerão.
Os itens filhos do menu podem ser links personalizados sem problemas.
Deixe um comentário Cancelar resposta