diff --git a/inc/front/menu.php b/inc/front/menu.php
index bba06ed..9e1866c 100644
--- a/inc/front/menu.php
+++ b/inc/front/menu.php
@@ -8,59 +8,81 @@
/*
* Maybe make current for post type archives or top categories
*/
+/**
+ *
+ * @param $items
+ *
+ * @return mixed
+ */
function stormbringer_maybe_make_current($items)
{
- foreach ($items as $item) {
- if ('cpt-archive' != $item->object) {
- continue;
- }
-
- $post_type = $item->type;
- if ( ! is_post_type_archive($post_type) && ! is_singular($post_type)) {
- continue;
- }
-
- //Make item current
- $item->current = true;
- $item->classes[] = 'current-menu-item';
-
- //Get menu item's ancestors:
- $_anc_id = (int)$item->db_id;
- $active_ancestor_item_ids = array();
-
- while (($_anc_id = get_post_meta($_anc_id, '_menu_item_menu_item_parent', true))
- &&
- ! in_array($_anc_id, $active_ancestor_item_ids)) {
- $active_ancestor_item_ids[] = $_anc_id;
- }
-
- //Loop through ancestors and give them 'ancestor' or 'parent' class
- foreach ($items as $key => $parent_item) {
- $classes = (array)$parent_item->classes;
-
- //If menu item is the parent
- if ($parent_item->db_id == $item->menu_item_parent) {
- $classes[] = 'current-menu-parent';
- $items[$key]->current_item_parent = true;
- }
-
- //If menu item is an ancestor
- if (in_array(intval($parent_item->db_id), $active_ancestor_item_ids)) {
- $classes[] = 'current-menu-ancestor';
- $items[$key]->current_item_ancestor = true;
- }
-
- $items[$key]->classes = array_unique($classes);
- }
-
- }
-
- return $items;
+ foreach ($items as $item) {
+ if ('cpt-archive' != $item->object) {
+ continue;
+ }
+
+ $post_type = $item->type;
+ if ( ! is_post_type_archive($post_type) && ! is_singular($post_type)) {
+ continue;
+ }
+
+ //Make item current
+ $item->current = true;
+ $item->classes[] = 'current-menu-item';
+
+ //Get menu item's ancestors:
+ $_anc_id = (int)$item->db_id;
+ $active_ancestor_item_ids = array();
+
+ while (($_anc_id = get_post_meta($_anc_id, '_menu_item_menu_item_parent', true))
+ &&
+ ! in_array($_anc_id, $active_ancestor_item_ids)) {
+ $active_ancestor_item_ids[] = $_anc_id;
+ }
+
+ //Loop through ancestors and give them 'ancestor' or 'parent' class
+ foreach ($items as $key => $parent_item) {
+ $classes = (array)$parent_item->classes;
+
+ //If menu item is the parent
+ if ($parent_item->db_id == $item->menu_item_parent) {
+ $classes[] = 'current-menu-parent';
+ $items[$key]->current_item_parent = true;
+ }
+
+ //If menu item is an ancestor
+ if (in_array(intval($parent_item->db_id), $active_ancestor_item_ids)) {
+ $classes[] = 'current-menu-ancestor';
+ $items[$key]->current_item_ancestor = true;
+ }
+
+ $items[$key]->classes = array_unique($classes);
+ }
+
+ }
+
+ return $items;
}
-
add_filter('wp_nav_menu_objects', 'stormbringer_maybe_make_current');
+/**
+ * Menus active class
+ *
+ * @param $classes
+ * @param $item
+ *
+ * @return array
+ */
+function stormbringer_nav_menu_css_class ($classes, $item) {
+ if (in_array('current-menu-item', $classes) ){
+ $classes[] = 'active ';
+ }
+ return $classes;
+}
+add_filter('nav_menu_css_class' , 'stormbringer_nav_menu_css_class' , 10 , 2);
+
+
/**
* A custom WordPress nav walker class to implement the Bootstrap 3 navigation style in a custom theme using the WordPress built in menu manager.
*
@@ -69,221 +91,221 @@ function stormbringer_maybe_make_current($items)
class Stormbringer_Navbar_Nav_Walker extends Walker_Nav_Menu
{
- /**
- * @see Walker::start_lvl()
- * @since 3.0.0
- *
- * @param string $output Passed by reference. Used to append additional content.
- * @param int $depth Depth of page. Used for padding.
- */
- public function start_lvl(&$output, $depth = 0, $args = array())
- {
- $indent = str_repeat("\t", $depth);
- $output .= "\n$indent
\n";
- }
-
- /**
- * @see Walker::start_el()
- * @since 3.0.0
- *
- * @param string $output Passed by reference. Used to append additional content.
- * @param object $item Menu item data object.
- * @param int $depth Depth of menu item. Used for padding.
- * @param int $current_page Menu item ID.
- * @param object $args
- */
- public function start_el(&$output, $item, $depth = 0, $args = array(), $id = 0)
- {
- $indent = ($depth) ? str_repeat("\t", $depth) : '';
-
- /**
- * Dividers, Headers or Disabled
- * =============================
- * Determine whether the item is a Divider, Header, Disabled or regular
- * menu item. To prevent errors we use the strcasecmp() function to so a
- * comparison that is not case sensitive. The strcasecmp() function returns
- * a 0 if the strings are equal.
- */
- if (strcasecmp($item->attr_title, 'divider') == 0 && $depth === 1) {
- $output .= $indent.'- ';
- } else if (strcasecmp($item->title, 'divider') == 0 && $depth === 1) {
- $output .= $indent.'
- ';
- } else if (strcasecmp($item->attr_title, 'dropdown-header') == 0 && $depth === 1) {
- $output .= $indent.'
- '.esc_attr($item->title).'';
- } else {
-
- $class_names = $value = '';
-
- $classes = empty($item->classes) ? array() : (array)$item->classes;
- $classes[] = 'menu-item-'.$item->ID;
-
- $class_names = join(' ', apply_filters('nav_menu_css_class', array_filter($classes), $item, $args));
-
- if ($args->has_children) {
- $class_names .= ' dropdown';
- }
-
- if (in_array('current-menu-item', $classes)) {
- $class_names .= ' active';
- }
-
- if (in_array('current-menu-ancestor', $classes)) {
- $class_names .= ' active';
- }
-
- if (in_array('current-menu-parent', $classes)) {
- $class_names .= ' active';
- }
-
- if (in_array('current_page_parent', $classes)) {
- $class_names .= ' active';
- }
-
- $class_names = $class_names ? ' class="'.esc_attr($class_names).'"' : '';
-
- $id = apply_filters('nav_menu_item_id', 'menu-item-'.$item->ID, $item, $args);
- $id = $id ? ' id="'.esc_attr($id).'"' : '';
-
- $output .= $indent.'
- ';
-
- $atts = array();
- $atts['title'] = ! empty($item->title) ? $item->title : '';
- $atts['target'] = ! empty($item->target) ? $item->target : '';
- $atts['rel'] = ! empty($item->xfn) ? $item->xfn : '';
-
- // If item has_children add atts to a.
- if ($args->has_children && $depth === 0) {
- $atts['href'] = '#';
- $atts['data-toggle'] = 'dropdown';
- $atts['class'] = 'dropdown-toggle';
- } else {
- $atts['href'] = ! empty($item->url) ? $item->url : '';
- }
-
- $atts = apply_filters('nav_menu_link_attributes', $atts, $item, $args);
-
- $attributes = '';
- foreach ($atts as $attr => $value) {
- if ( ! empty($value)) {
- $value = ('href' === $attr) ? esc_url($value) : esc_attr($value);
- $attributes .= ' '.$attr.'="'.$value.'"';
- }
- }
-
- $item_output = $args->before;
-
- /*
- * Glyphicons
- * ===========
- * Since the the menu item is NOT a Divider or Header we check the see
- * if there is a value in the attr_title property. If the attr_title
- * property is NOT null we apply it as the class name for the glyphicon.
- */
- if ( ! empty($item->attr_title)) {
- $item_output .= ' ';
- } else {
- $item_output .= '';
- }
-
- $item_output .= $args->link_before.apply_filters('the_title', $item->title, $item->ID).$args->link_after;
- $item_output .= ($args->has_children && 0 === $depth) ? ' ' : '';
- $item_output .= $args->after;
-
- $output .= apply_filters('walker_nav_menu_start_el', $item_output, $item, $depth, $args);
- }
- }
-
- /**
- * Traverse elements to create list from elements.
- *
- * Display one element if the element doesn't have any children otherwise,
- * display the element and its children. Will only traverse up to the max
- * depth and no ignore elements under that depth.
- *
- * This method shouldn't be called directly, use the walk() method instead.
- *
- * @see Walker::start_el()
- * @since 2.5.0
- *
- * @param object $element Data object
- * @param array $children_elements List of elements to continue traversing.
- * @param int $max_depth Max depth to traverse.
- * @param int $depth Depth of current element.
- * @param array $args
- * @param string $output Passed by reference. Used to append additional content.
- *
- * @return null Null on failure with no changes to parameters.
- */
- public function display_element($element, &$children_elements, $max_depth, $depth, $args, &$output)
- {
- if ( ! $element) {
- return;
- }
-
- $id_field = $this->db_fields['id'];
-
- // Display this element.
- if (is_object($args[0])) {
- $args[0]->has_children = ! empty($children_elements[$element->$id_field]);
- }
-
- parent::display_element($element, $children_elements, $max_depth, $depth, $args, $output);
- }
-
- /**
- * Menu Fallback
- * =============
- * If this function is assigned to the wp_nav_menu's fallback_cb variable
- * and a manu has not been assigned to the theme location in the WordPress
- * menu manager the function with display nothing to a non-logged in user,
- * and will add a link to the WordPress menu manager if logged in as an admin.
- *
- * @param array $args passed from the wp_nav_menu function.
- *
- */
- public static function fallback($args)
- {
- if (current_user_can('manage_options')) {
-
- extract($args);
-
- $fb_output = null;
-
- if ($container) {
- $fb_output = '<'.$container;
-
- if ($container_id) {
- $fb_output .= ' id="'.$container_id.'"';
- }
-
- if ($container_class) {
- $fb_output .= ' class="'.$container_class.'"';
- }
-
- $fb_output .= '>';
- }
-
- $fb_output .= '
'.__('Add a menu','stormbringer').'
';
- $fb_output .= '
';
-
- if ($container) {
- $fb_output .= ''.$container.'>';
- }
-
- echo $fb_output;
- }
- }
+ /**
+ * @see Walker::start_lvl()
+ * @since 3.0.0
+ *
+ * @param string $output Passed by reference. Used to append additional content.
+ * @param int $depth Depth of page. Used for padding.
+ */
+ public function start_lvl(&$output, $depth = 0, $args = array())
+ {
+ $indent = str_repeat("\t", $depth);
+ $output .= "\n$indent\n";
+ }
+
+ /**
+ * @see Walker::start_el()
+ * @since 3.0.0
+ *
+ * @param string $output Passed by reference. Used to append additional content.
+ * @param object $item Menu item data object.
+ * @param int $depth Depth of menu item. Used for padding.
+ * @param int $current_page Menu item ID.
+ * @param object $args
+ */
+ public function start_el(&$output, $item, $depth = 0, $args = array(), $id = 0)
+ {
+ $indent = ($depth) ? str_repeat("\t", $depth) : '';
+
+ /**
+ * Dividers, Headers or Disabled
+ * =============================
+ * Determine whether the item is a Divider, Header, Disabled or regular
+ * menu item. To prevent errors we use the strcasecmp() function to so a
+ * comparison that is not case sensitive. The strcasecmp() function returns
+ * a 0 if the strings are equal.
+ */
+ if (strcasecmp($item->attr_title, 'divider') == 0 && $depth === 1) {
+ $output .= $indent.'- ';
+ } else if (strcasecmp($item->title, 'divider') == 0 && $depth === 1) {
+ $output .= $indent.'
- ';
+ } else if (strcasecmp($item->attr_title, 'dropdown-header') == 0 && $depth === 1) {
+ $output .= $indent.'
- '.esc_attr($item->title).'';
+ } else {
+
+ $class_names = $value = '';
+
+ $classes = empty($item->classes) ? array() : (array)$item->classes;
+ $classes[] = 'menu-item-'.$item->ID;
+
+ $class_names = join(' ', apply_filters('nav_menu_css_class', array_filter($classes), $item, $args));
+
+ if ($args->has_children) {
+ $class_names .= ' dropdown';
+ }
+
+ if (in_array('current-menu-item', $classes)) {
+ $class_names .= ' active';
+ }
+
+ if (in_array('current-menu-ancestor', $classes)) {
+ $class_names .= ' active';
+ }
+
+ if (in_array('current-menu-parent', $classes)) {
+ $class_names .= ' active';
+ }
+
+ if (in_array('current_page_parent', $classes)) {
+ $class_names .= ' active';
+ }
+
+ $class_names = $class_names ? ' class="'.esc_attr($class_names).'"' : '';
+
+ $id = apply_filters('nav_menu_item_id', 'menu-item-'.$item->ID, $item, $args);
+ $id = $id ? ' id="'.esc_attr($id).'"' : '';
+
+ $output .= $indent.'
- ';
+
+ $atts = array();
+ $atts['title'] = ! empty($item->title) ? $item->title : '';
+ $atts['target'] = ! empty($item->target) ? $item->target : '';
+ $atts['rel'] = ! empty($item->xfn) ? $item->xfn : '';
+
+ // If item has_children add atts to a.
+ if ($args->has_children && $depth === 0) {
+ $atts['href'] = '#';
+ $atts['data-toggle'] = 'dropdown';
+ $atts['class'] = 'dropdown-toggle';
+ } else {
+ $atts['href'] = ! empty($item->url) ? $item->url : '';
+ }
+
+ $atts = apply_filters('nav_menu_link_attributes', $atts, $item, $args);
+
+ $attributes = '';
+ foreach ($atts as $attr => $value) {
+ if ( ! empty($value)) {
+ $value = ('href' === $attr) ? esc_url($value) : esc_attr($value);
+ $attributes .= ' '.$attr.'="'.$value.'"';
+ }
+ }
+
+ $item_output = $args->before;
+
+ /*
+ * Glyphicons
+ * ===========
+ * Since the the menu item is NOT a Divider or Header we check the see
+ * if there is a value in the attr_title property. If the attr_title
+ * property is NOT null we apply it as the class name for the glyphicon.
+ */
+ if ( ! empty($item->attr_title)) {
+ $item_output .= ' ';
+ } else {
+ $item_output .= '';
+ }
+
+ $item_output .= $args->link_before.apply_filters('the_title', $item->title, $item->ID).$args->link_after;
+ $item_output .= ($args->has_children && 0 === $depth) ? ' ' : '';
+ $item_output .= $args->after;
+
+ $output .= apply_filters('walker_nav_menu_start_el', $item_output, $item, $depth, $args);
+ }
+ }
+
+ /**
+ * Traverse elements to create list from elements.
+ *
+ * Display one element if the element doesn't have any children otherwise,
+ * display the element and its children. Will only traverse up to the max
+ * depth and no ignore elements under that depth.
+ *
+ * This method shouldn't be called directly, use the walk() method instead.
+ *
+ * @see Walker::start_el()
+ * @since 2.5.0
+ *
+ * @param object $element Data object
+ * @param array $children_elements List of elements to continue traversing.
+ * @param int $max_depth Max depth to traverse.
+ * @param int $depth Depth of current element.
+ * @param array $args
+ * @param string $output Passed by reference. Used to append additional content.
+ *
+ * @return null Null on failure with no changes to parameters.
+ */
+ public function display_element($element, &$children_elements, $max_depth, $depth, $args, &$output)
+ {
+ if ( ! $element) {
+ return;
+ }
+
+ $id_field = $this->db_fields['id'];
+
+ // Display this element.
+ if (is_object($args[0])) {
+ $args[0]->has_children = ! empty($children_elements[$element->$id_field]);
+ }
+
+ parent::display_element($element, $children_elements, $max_depth, $depth, $args, $output);
+ }
+
+ /**
+ * Menu Fallback
+ * =============
+ * If this function is assigned to the wp_nav_menu's fallback_cb variable
+ * and a manu has not been assigned to the theme location in the WordPress
+ * menu manager the function with display nothing to a non-logged in user,
+ * and will add a link to the WordPress menu manager if logged in as an admin.
+ *
+ * @param array $args passed from the wp_nav_menu function.
+ *
+ */
+ public static function fallback($args)
+ {
+ if (current_user_can('manage_options')) {
+
+ extract($args);
+
+ $fb_output = null;
+
+ if ($container) {
+ $fb_output = '<'.$container;
+
+ if ($container_id) {
+ $fb_output .= ' id="'.$container_id.'"';
+ }
+
+ if ($container_class) {
+ $fb_output .= ' class="'.$container_class.'"';
+ }
+
+ $fb_output .= '>';
+ }
+
+ $fb_output .= '
'.__('Add a menu','stormbringer').'
';
+ $fb_output .= '
';
+
+ if ($container) {
+ $fb_output .= ''.$container.'>';
+ }
+
+ echo $fb_output;
+ }
+ }
}