dylanjameswagner
1/19/2016 - 8:34 PM

RS Navigation

RS Navigation

<?php

/***

Navigation Functions

***/

// Init the navigation variables
$navigation = array();
$active_section = NULL;

//  Register Nav Menu Locations
register_nav_menus(array(
    'concerts'  =>  'Concerts & Events',
    'calendar'  =>  'Calendar & Ticketing',
    'education' =>  'Education & Engagement',
    'about'     =>  'Who We Are',
    'support'   =>  'Support',
    'utility'   =>  'Utility Navigation'
));

function navigation() {
    global $active_section;
    global $navigation;
    global $post;

    if(tribe_is_month() || (tribe_is_past() || tribe_is_upcoming()) || tribe_is_day() || tribe_is_venue() || (tribe_is_event() && is_single())) {
        $this_post_ID = 114;
    } elseif (is_singular('profile')){
        $this_post_ID = 139;
    } else {
        $this_post_ID = $post->ID;
    }


    $menus = get_registered_nav_menus();
    $ancestors = get_post_ancestors($this_post_ID);
    $ancestors_end = (count($ancestors)-1);

    $navigation = new stdClass;

    // Build Primary & Utility Navigation
    $navigation->primary = array();
    $navigation->utility = NULL;

    foreach($menus as $menu) {
        if($menu == 'Utility Navigation') {
            $navigation->utility = wp_get_nav_menu_items($menu);
        } else {
            $menu_items = wp_get_nav_menu_items($menu);
            $this_menu = new stdClass;
            $this_menu->title = $menu;
            $this_menu->slug = slugify($menu);
            $this_menu->target = $menu_items[0];
            $this_menu->parent = (!empty($ancestors)) ? $ancestors[$ancestors_end] : $this_post_ID;
            $this_menu->active = ($this_menu->target->object_id == $this_menu->parent) ? true : false;
            array_push($navigation->primary, $this_menu);
            $active_section = ($this_menu->active === true) ? $this_menu->title : $active_section;
        }
    }

    // Build Section Navigation
    $navigation->sections = array();

    foreach($navigation->primary as $section) {
        $this_section = new stdClass;
        $this_section->title = $section->title;
        $this_section->slug = $section->slug;
        $this_section->items = wp_get_nav_menu_items($section->title);
        $this_section->parent = $section->parent;
        $this_section->parent_title = $this_section->title;
        $this_section->parents = wp_list_pluck($this_section->items, 'menu_item_parent');
        $this_section->parents = array_unique($this_section->parents);
        $this_section->active = $section->active;
        $this_section->sub_sections = array();
        foreach($this_section->items as $item) {
            foreach($this_section->parents as $parent) {
                if($item->menu_item_parent == $parent) {
                    if(in_array($item->ID, $this_section->parents)) {
                        $sub_section = new stdClass;
                        $sub_section->title = $item->title;
                        $sub_section->slug = slugify($item->title);
                        $sub_section->parent = intval($item->object_id);
                        $sub_section->parents = array($item->ID);
                        $sub_section->active = (in_array($item->object_id, $ancestors)) ? true : false;
                        $sub_section->items = array();
                        foreach($this_section->items as $sub_item) {
                            if($sub_item->menu_item_parent == $item->ID) {
                                $sub_section->parent_title = $item->title;
                                array_push($sub_section->items, $sub_item);
                            }
                        }
                        array_push($this_section->sub_sections, $sub_section);
                    }
                }
            }
        }
        array_push($navigation->sections, $this_section);
    }
    // return $navigation;
}
// Add filter to run this function on WP init
add_action('wp_head', 'navigation');

// Build Primary Menu
function primary_navigation($item_classes = array('-list-item')) {
    // Import the global navigation variable
    global $navigation;
    // Clean menu-item class array for output
    $item_classes = implode(' ', $item_classes);
    // Check for items and loop for output
    if($navigation->primary) {
        foreach($navigation->primary as $item) {
            echo '<li class="' . $item_classes . '">';
            echo '<a' . (($item->active === true) ? ' class="-active"' : '') . ' href="' . $item->target->url . '">' . $item->title . '</a>';
            echo '</li>';
        }
    }
}

// Build Utility Menu
function utility_navigation($item_classes = array('-list-item')) {
    // Import the global navigation & user variable
    global $navigation;
    // Clean menu-item class array for output
    $item_classes = implode(' ', $item_classes);
    // Check for items and loop for output
    if($navigation->utility) {
        foreach($navigation->utility as $item) {
            echo '<li class="' . $item_classes . '">';
            echo '<a href="' . $item->url . '">' . $item->title . '</a>';
            echo '</li>';
        }
    }
    $links = member_utility_links();
    if(isset($links)) {
        echo '<li class="' . $item_classes . '">';
        echo '<a href="' . $links['Member Content'] . '">Member Content</a>';
        echo '</li>';
        echo '<li class="' . $item_classes . '">';
        echo '<a href="' . $links['Logout'] . '">Logout</a>';
        echo '</li>';
    }
}

// Build Section(Sidebar) Navigation
function section_navigation($menu_classes = array('-menu'), $sub_menu_classes = array('-sub-menu'), $item_classes = array('-list-item')) {
    // Import the global navigation variable
    global $navigation;
    // Get ancestors
    global $post;

    if(tribe_is_month() || (tribe_is_past() || tribe_is_upcoming()) || tribe_is_day() || tribe_is_venue() || (tribe_is_event() && is_single())) {
        $this_post_ID = 114;
    } else {
        $this_post_ID = $post->ID;
    }

    $ancestors = get_post_ancestors($this_post_ID);
    array_pop($ancestors);
    // Check for items and loop for output
    if($navigation->sections) {
        // Loop through sections
        foreach($navigation->sections as $section) {

            // Filter by active section
            if($section->active) {
                // Loop through active section items
                foreach($section->items as $item) {
                    // Filter by top level items
                    if($item->menu_item_parent == 0) {

                        // Build list item
                        $this_item_classes = $item_classes;
                        $active = ($item->object_id == $this_post_ID || in_array($item->object_id, $ancestors)) ? array_push($this_item_classes, '-active') : false;
                        $has_children = (in_array($item->ID, $section->parents)) ? array_push($this_item_classes, '-has-children')  : false;
                        $active_parent = (in_array($item->object_id, $ancestors)) ? array_push($this_item_classes, '-accordion-active') : false;
                        $this_item_classes = implode(' ', $this_item_classes);
                        echo '<li class="' . $this_item_classes . '">';
                        echo '<a href="' . $item->url . '">' . $item->title . '</a>';
                        // Check for sub menu
                        if(in_array($item->ID, $section->parents)) {
                            // Build sub menus recursively
                            echo '<span class="-accordion-toggle">';
                            echo '<span class="-indicator' . ((in_array($item->object_id, $ancestors)) ? ' -open' : '') . '"></span>';
                            echo '</span>';
                            sub_section_loop($section, $item, $sub_menu_classes, $item_classes);
                        }
                        echo '</li>';
                    }
                }
            }
        }
    }
}

function sub_section_loop($section, $item, $sub_menu_classes, $item_classes) {
    global $post;

    if(tribe_is_month() || (tribe_is_past() || tribe_is_upcoming()) || tribe_is_day() || tribe_is_venue() || (tribe_is_event() && is_single())) {
        $this_post_ID = 114;
    } else {
        $this_post_ID = $post->ID;
    }

    $ancestors = get_post_ancestors($this_post_ID);
    $this_sub_menu_classes = implode(' ', $sub_menu_classes);
    // array_pop($ancestors);
    foreach($section->sub_sections as $sub_section) {
        if(in_array($item->ID, $sub_section->parents)) {
            echo '<ul class="' . $this_sub_menu_classes . '">';
            foreach($sub_section->items as $sub_item) {
                $this_item_classes = $item_classes;
                $active = ($sub_item->object_id == $this_post_ID || in_array($sub_item->object_id, $ancestors)) ? array_push($this_item_classes, '-active') : false;
                $has_children = (in_array($sub_item->ID, $section->parents)) ? array_push($this_item_classes, '-has-children')  : false;
                $active_parent = (in_array($sub_item->object_id, $ancestors) || $sub_item->active && $has_children) ? array_push($this_item_classes, '-accordion-active') : false;
                $this_item_classes = implode(' ', $this_item_classes);
                echo '<li class="' . $this_item_classes . '">';
                echo '<a href="' . $sub_item->url . '">' . $sub_item->title . '</a>';
                if(in_array($sub_item->ID, $section->parents)) {
                    echo '<span class="-accordion-toggle">';
                    echo '<span class="-indicator' . ((in_array($sub_item->object_id, $ancestors)) ? ' -open' : '') . '"></span>';
                    echo '</span>';
                    sub_section_loop($section, $sub_item, $sub_menu_classes, $item_classes);
                }
                echo '</li>';
            }
            echo '</ul>';
        }
    }
}

// Build Footer Menu
function footer_navigation($menu_classes = array('-menu'), $item_classes = array('-list-item')) {
    // Import the global navigation variable
    global $navigation;
    // Clean class arrays for output
    $menu_classes = implode(' ', $menu_classes);
    $item_classes = implode(' ', $item_classes);
    if($navigation->sections) {
        foreach($navigation->sections as $section) {
            // Echo wrapper to open section
            echo '<ul class="'. $menu_classes .'">';
            // Echo the section label
            echo '<li class="' . $item_classes . ' -label">' . $section->title . '</li>';
            // Echo only the top-level menu items
            foreach($section->items as $item) {
                if($item->menu_item_parent == 0) {
                    echo '<li class="' . $item_classes . '"><a href="' . $item->url . '">' . $item->title . '</a></li>';
                }
            }
            // Echo wrapper to close seciton
            echo '</ul>';
        }
    }
}

// Build Mobile Menu
function mobile_navigation() {
    // Import the global navigation variable
    global $navigation;
    global $active_section;
    global $post;

    if(tribe_is_month() || (tribe_is_past() || tribe_is_upcoming()) || tribe_is_day() || tribe_is_venue() || (tribe_is_event() && is_single())) {
        $this_post_ID = 114;
    } else {
        $this_post_ID = $post->ID;
    }

    // Build Home Layer
    if($navigation->primary && $navigation->utility) {
        echo '<div id="mobile-menu-home" class="-menu-layer -home-layer' . (($active_section === NULL) ? ' -active-layer' : '') . '">';
        echo '<h1 class="-section-title">' . get_bloginfo('name') . '</h1>';
        echo '<ul class="-menu">';
        foreach($navigation->primary as $item) {
            echo '<li class="-list-item">';
            echo '<a href="' . $item->target->url  . '">' . $item->title . '</a>';
            echo '<span class="indicator -menu-traverse" data-target="mobile-menu-' . slugify($item->title) . '">';
            echo '<span class="-arrow -right"></span>';
            echo '</span>';
            echo '</li>';
        }
        foreach($navigation->utility as $item) {
            echo '<li class="-list-item">';
            echo '<a href="' . $item->url . '">' . $item->title . '</a>';
            echo '</li>';
        }
        $links = member_utility_links();
        if(isset($links)) {
            echo '<li class="-list-item">';
            echo '<a href="' . $links['Member Content'] . '">Member Content</a>';
            echo '</li>';
            echo '<li class="-list-item">';
            echo '<a href="' . $links['Logout'] . '">Logout</a>';
            echo '</li>';
        }
        echo '</ul>';
        echo '</div>';
    }

    // Check for items and loop for output
    if($navigation->sections) {
        // Loop through sections recursively
        foreach($navigation->sections as $section) {
            mobile_layer_loop($section, $section);
        }
    }

}

function mobile_layer_loop($parent_section, $section) {
    $layer_parent = $section->items[0];
    $layer_parent_menu_id = $layer_parent->menu_item_parent;
    $section_id = 'mobile-menu-' . slugify($section->title);
    $parent_target = ($layer_parent_menu_id == 0) ? 'mobile-menu-home' : 'mobile-menu-' . slugify($parent_section->parent_title);
    $parent_target_title = ($layer_parent_menu_id == 0) ? 'Main Menu' : $parent_section->parent_title;

    echo '<div id="' . $section_id . '" class="-menu-layer -section' . (($section->active) ? ' -active-layer' : '') . '">';
    echo '<h1 class="-section-title">' . $section->title . '</h1>';
    echo '<a class="-layer-back -menu-traverse" data-target="' . $parent_target . '" href="#">' . $parent_target_title;
    echo '<span class="indicator"><span class="-arrow -left"></span></span>';
    echo '</a>';
    echo '<ul class="-menu">';
    foreach($section->items as $item) {
        if($item->menu_item_parent == $layer_parent_menu_id) {
            $has_children = (in_array($item->ID, $parent_section->parents)) ? true : false;
            echo '<li class="-list-item">';
            echo '<a' . (($has_children) ? ' class="-parent"' : '') . ' href="' . $item->url . '">' . $item->title . '</a>';
            if($has_children) {
                echo '<span class="indicator -menu-traverse" data-target="mobile-menu-' . slugify($item->title) . '">';
                echo '<span class="-arrow -right"></span>';
                echo '</span>';
            }
            echo '</li>';
        }
    }
    echo '</ul>';
    echo '</div>';
    if($section->sub_sections) {
        foreach($section->sub_sections as $sub_section) {
            mobile_layer_loop($section, $sub_section);
        }
    }
}