I'm trying to create a normal dropdown menu and a megamenu in WP by using a custom walker.

The problem that I have is that the usual ul tag needs to be replaced with a div.

I already created the an extra checkbox to enable the megamenu by using the wp_update_nav_menu_item and wp_setup_nav_menu_item filters.

function custom_menu_fields( $menu_item ) { 
    $menu_item->is_mega_menu = get_post_meta( $menu_item->ID, '_menu_item_megamenu', true );
    return $menu_item;
add_filter('wp_setup_nav_menu_item', 'custom_menu_fields');

function fields_update($menu_id, $menu_item_db_id, $args) {         
    if ( isset($_REQUEST['menu-item-megamenu']) && is_array($_REQUEST['menu-item-megamenu'])) {
        $custom_value = $_REQUEST['menu-item-megamenu'][$menu_item_db_id];
        update_post_meta($menu_item_db_id, '_menu_item_megamenu', $custom_value);
add_action('wp_update_nav_menu_item', 'fields_update', 10, 3);

Then my walker:

public function start_lvl( &$output, $depth = 0, $args = array() ) {

        $indent     = str_repeat("\t", $depth);     

        if( $this->is_mega_menu && $depth == 0 ) { 
             $indent = "\t$indent";
             $output.= "$indent <div class=\"mega-menu\">\n";
        } else {
            $output.= "\n$indent<ul class=\"dropdown-menu\">\n";

The problem is $this->is_mega_menu. Normally I would use $item->is_mega_menu or $item->classes but both won't work inside the start_lvl public funtion due to the "...should be compatible with Walker::start_lvl(&$output, $depth = 0, $args = Array)" the moment I add $item.

How do I connect $this->is_mega_menu with the custom checkbox to enable the megamenu? Any help is much appreciated.


I used var_dump($args); to see what options I have and I had to changed $this->is_mega_menu to $args->walker->is_mega_menu

There's still one thing left; is_mega_menu remains NULL

object(stdClass)#1687 (17) {    
    ["depth"]=> int(0) 

    ["walker"]=> object(Custom_Nav_Menu)#1688 (5) { 
        ["db_fields"]=> array(2) { ["parent"]=> string(16) "menu_item_parent" ["id"]=> string(5) "db_id" } 
        ["is_mega_menu"]=> NULL         
        ["has_children"]=> bool(true) 
    "theme_location"]=> string(15) "main_navigation"    


Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Browse other questions tagged or ask your own question.