Instantly share code, notes, and snippets.
MatheusMK3/wpu_get_nav_menu.fn.php
Last active Mar 5, 2019
<?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