Skip to content

Instantly share code, notes, and snippets.

Embed
What would you like to do?
<?php
/**
* Processa um menu do WordPress de acordo com a localização no tema
* Sintaxe: wpu_get_nav_menu ($localização, $returns = null)
* Sintaxe: wpu_get_nav_menu_array ($menu, $args = array())
* Autor: Matheus Pratta <eu@matheus.io>
*/
function wpu_get_nav_menu ($location, $returns = null) {
// Obtemos as posições de menu no tema
$themeLocations = get_nav_menu_locations();
// Pegamos qual o menu que está sendo utilizado e seu nome
$menuObj = get_term($themeLocations[$location], 'nav_menu');
$menuName = $menuObj->name;
// Aqui diferenciamos o que vai ser retornado (default: nome do menu, 'array', 'object', 'items')
switch (strtolower($returns)) {
case 'array': return wpu_get_nav_menu_array($menuName); break;
case 'object': return wp_get_nav_menu_object($menuName); break;
case 'items': return wp_get_nav_menu_items($menuName); break;
default: return $menuName; break;
}
}
function wpu_get_nav_menu_array ($menu, $args = array()) {
// Obtemos o menu do Wordpress pela própria API
$rawMenu = wp_get_nav_menu_items($menu);
// Sempre esperamos uma array
if (!is_array($rawMenu)) return $rawMenu;
// Retornamos o menu processado por nossa função walker
return wpu_get_nav_menu_array_walker($rawMenu);
}
function wpu_get_nav_menu_array_walker ($rawMenu, $root = 0) {
// Array de menu de saída e para armazenar a relação de IDs e índices
$menu = array();
$menuIds = array();
$menuLastIndex = 0;
// Convertemos o menu "flat" do Wordpress para um formato baseado em uma array multidimensional
foreach ($rawMenu as $rawItem) {
// Verificamos se o item é root ou tem parent
if ($rawItem->menu_item_parent == $root) {
// Caso root, geramos um index para ele na array resultante, guardamos uma relação de ID => Index em outra array e, por fim, guardamos o menu
$menuIndex = count($menu);
$menuIds[$rawItem->ID] = $menuIndex;
$menu[$menuIndex] = array(
'item' => $rawItem,
'submenu' => array()
);
} else {
// Caso tenha parent, apenas buscamos o index correto na array e inserimos na subarray correspondente ao submenu, caso esta não exista, utilizamos a última que foi usada
if (isset($menuIds[$rawItem->menu_item_parent])) {
$menuIndex = $menuIds[$rawItem->menu_item_parent];
$menuLastIndex = $menuIndex;
} else {
$menuIndex = $menuLastIndex;
}
$menu[$menuIndex]['submenu'][] = $rawItem;
}
}
// Limpamos a array temporária e liberamos a memória
unset($menuIds);
// Segunda passagem na array, desta vez para processar os submenus
foreach ($menu as $menuIndex => $menuObject) {
if (count($menuObject['submenu']) > 0) {
$menuObject['submenu'] = wpu_get_nav_menu_array_walker($menuObject['submenu'], $menuObject['item']->ID);
$menu[$menuIndex] = $menuObject;
}
}
return $menu;
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
You can’t perform that action at this time.