Login
Andre Publicado em 10/01/2021, atualizado em 11/01/2021
Snippets WordPress

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

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *