Skip to content

Instantly share code, notes, and snippets.

@lucasmenendez
Last active August 1, 2016 10:47
Show Gist options
  • Save lucasmenendez/ca776318831cdc5244b801a422ca7cf0 to your computer and use it in GitHub Desktop.
Save lucasmenendez/ca776318831cdc5244b801a422ca7cf0 to your computer and use it in GitHub Desktop.
Use: get_menu('<string : menu_name>') to get nested array or print_menu('<string : menu_name>') to print it.
<?php
function get_menu($menu, $items = null, $id = 0) {
if (is_null($items) && $id == 0) {
$items = array();
$menu = wp_get_nav_menu_items($menu);
foreach ($menu as $menu_item) {
$items[] = array(
'id' => $menu_item->ID,
'title' => $menu_item->title,
'url' => $menu_item->url,
'parent' => $menu_item->menu_item_parent
);
}
}
$result = array();
foreach ($items as $index => $item) {
if ($item['parent'] == $id) {
$item['subitems'] = get_menu('', $items, $item['id']);
$result[] = $item;
}
}
return $result;
}
?>
.menu.level-0 {
display: block;
vertical-align: top;
list-style: none;
width: auto;
height: auto;
}
.menu, .menu ul, .menu li {
margin: 0;
padding: 0;
box-sizing: border-box;
}
.menu .subitem {
display: inline-block;
vertical-align: top;
position: relative;
width: auto;
height: auto;
}
.menu .subitem a {
display: block;
vertical-align: top;
width: auto;
height: auto;
padding: 10px 20px;
white-space: nowrap;
}
.menu .subitem .menu.level-1 .subitem {min-width: 100%;}
.menu .subitem:hover > .menu {
opacity: 1 !important;
visibility: visible !important;
}
.menu .subitem .menu[class*="level-"] {
position: absolute;
top: 0; left: 100%;
display: block;
vertical-align: top;
list-style: none;
width: auto;
height: auto;
opacity: 0;
visibility: hidden;
transition: all .2s ease-in-out;
}
.menu .subitem .menu.level-1 {top: 100%; left: 0;}
@media (max-width: 700px) {
.menu .subitem {
display: block;
}
.menu .subitem .menu[class*="level-"] {
position: relative !important;
left: 0 !important;
height: 0 !important;
}
.menu .subitem:hover > .menu[class*="level-"] {
height: auto !important;
}
}
<?php
function print_menu($menu, $items = null, $level = 0) {
$items = (is_null($items)) ? get_menu($menu) : $items;
$html = "<ul class='menu level-". $level ."'>";
foreach ($items as $item) {
$html .= "<li class='subitem'>";
$html .= "<a href='". $item['url'] ."'>". $item['title'] ."</a>";
if ($item['subitems'])
$html .= print_menu(null, $item['subitems'], $level + 1);
$html .= "</li>";
}
$html .= "</ul>";
return $html;
}
?>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment