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);
}
}
}