Custom Navigation
Clean Custom Menu
Description
This function generates a clean custom menu based on the WordPress menu system. It uses the get_nav_menu_locations and wp_get_nav_menu_items functions to retrieve the menu items and their respective locations.
Code
function clean_custom_menu( $theme_location ) {
if ( ($theme_location) && ($locations = get_nav_menu_locations()) && isset($locations[$theme_location]) ) {
// MAIN MENU CLASSES
$ul_class = 'main-nav';
$li_class = 'item';
$link_class = 'link_class';
// SUB-MENU CLASSES
$ul_submenu_class = 'sub-menu';
$li_submenu_class = 'item';
$link_submenu_class = 'submenu_link';
$menu = get_term( $locations[$theme_location], 'nav_menu' );
$menu_items = wp_get_nav_menu_items($menu->term_id);
$menu_list = '<nav>' ."\n";
$menu_list .= '<ul class="'.$ul_class.'">' ."\n";
$count = 0;
$submenu = false;
foreach( $menu_items as $menu_item ) {
$link = $menu_item->url;
$title = $menu_item->title;
if ( !$menu_item->menu_item_parent ) {
$parent_id = $menu_item->ID;
$menu_list .= '<li class "'.$li_class.'">' ."\n";
$menu_list .= '<a href="'.$link.'" class="'.$link_class.'">'.$title.'</a>' ."\n";
}
if ( $parent_id == $menu_item->menu_item_parent ) {
if ( !$submenu ) {
$submenu = true;
$menu_list .= '<ul class="'.$ul_submenu_class.'">' ."\n";
}
$menu_list .= '<li class="'.$li_submenu_class.'">' ."\n";
$menu_list .= '<a href="'.$link.'" class="'.$link_submenu_class.'">'.$title.'</a>' ."\n";
$menu_list .= '</li>' ."\n";
if ( $menu_items[ $count + 1 ]->menu_item_parent != $parent_id && $submenu ){
$menu_list .= '</ul>' ."\n";
$submenu = false;
}
}
if ( $menu_items[ $count + 1 ]->menu_item_parent != $parent_id ) {
$menu_list .= '</li>' ."\n";
$submenu = false;
}
$count++;
}
$menu_list .= '</ul>' ."\n";
$menu_list .= '</nav>' ."\n";
} else {
$menu_list = '<!-- no menu defined in location "'.$theme_location.'" -->';
}
echo $menu_list;
}
Usage
To use this function, simply call it and pass the theme location as an argument:
clean_custom_menu('menu-1');
Make sure to define the register_nav_menus function in your theme's functions.php file:
register_nav_menus(
array(
'menu-1' => esc_html__( 'Primary', 'fatboys' ),
)
);
Custom Menu (Not-Preferred Method)
Description
This function generates a custom menu based on the WordPress menu system. It uses the wp_get_nav_menu_object and wp_get_nav_menu_items functions to retrieve the menu items.
Code
function clean_custom_menus() {
$menu_name = 'primary'; // specify custom menu name
if (($locations = get_nav_menu_locations()) && isset($locations[$menu_name])) {
$menu = wp_get_nav_menu_object($locations[$menu_name]);
$menu_items = wp_get_nav_menu_items($menu->term_id);
$menu_list .= "\t\t\t\t". '<ul class="navbar-nav mb-2 mb-lg-0 mt-lg-4 ms-auto">' ."\n";
foreach ((array) $menu_items as $key => $menu_item) {
$title = $menu_item->title;
$url = $menu_item->url;
$menu_list .= "\t\t\t\t\t". '<li class="nav-item px-lg-1 mt-0 mb-0 mt-lg-0 mx-lg-1"><a class="nav-link my-auto" href="'. $url .'">'. $title .'</a></li>' ."\n";
}
$menu_list .= "\t\t\t\t". '</ul>' ."\n";
} else {
// $menu_list = '<!-- no list defined -->';
}
echo $menu_list;
}