Completed
Pull Request — master (#341)
by
unknown
02:07
created

wp-bootstrap-navwalker.php (4 issues)

Upgrade to new PHP Analysis Engine

These results are based on our legacy PHP analysis, consider migrating to our new PHP analysis engine instead. Learn more

1
<?php
2
/**
3
 * WP Bootstrap Navwalker
4
 *
5
 * @package WP-Bootstrap-Navwalker
6
 */
7
8
/**
9
 * Class Name: WP_Bootstrap_Navwalker
10
 * Plugin Name: WP Bootstrap Navwalker
11
 * Plugin URI:  https://github.com/wp-bootstrap/wp-bootstrap-navwalker
12
 * Description: A custom WordPress nav walker class to implement the Bootstrap 3 navigation style in a custom theme using the WordPress built in menu manager.
13
 * Author: Edward McIntyre - @twittem, WP Bootstrap, William Patton - @pattonwebz
14
 * Version: 3.0.0
15
 * Author URI: https://github.com/wp-bootstrap
16
 * GitHub Plugin URI: https://github.com/wp-bootstrap/wp-bootstrap-navwalker
17
 * GitHub Branch: master
18
 * License: GPL-3.0+
19
 * License URI: https://www.gnu.org/licenses/gpl-3.0.txt
20
 */
21
22
/* Check if Class Exists. */
23
if ( ! class_exists( 'WP_Bootstrap_Navwalker' ) ) {
24
	/**
25
	 * WP_Bootstrap_Navwalker class.
26
	 *
27
	 * @extends Walker_Nav_Menu
28
	 */
29
	class WP_Bootstrap_Navwalker extends Walker_Nav_Menu {
0 ignored issues
show
Coding Style Compatibility introduced by
PSR1 recommends that each class must be in a namespace of at least one level to avoid collisions.

You can fix this by adding a namespace to your class:

namespace YourVendor;

class YourClass { }

When choosing a vendor namespace, try to pick something that is not too generic to avoid conflicts with other libraries.

Loading history...
30
31
		/**
32
		 * Start Level.
33
		 *
34
		 * @see Walker::start_lvl()
35
		 * @since 3.0.0
36
		 *
37
		 * @access public
38
		 * @param mixed $output Passed by reference. Used to append additional content.
39
		 * @param int   $depth (default: 0) Depth of page. Used for padding.
40
		 * @param array $args (default: array()) Arguments.
41
		 * @return void
42
		 */
43
		public function start_lvl( &$output, $depth = 0, $args = array() ) {
44
			$indent  = str_repeat( "\t", $depth );
45
			$output .= "\n$indent<ul role=\"menu\" class=\" dropdown-menu\" >\n";
46
		}
47
48
		/**
49
		 * Start El.
50
		 *
51
		 * @see Walker::start_el()
52
		 * @since 3.0.0
53
		 *
54
		 * @access public
55
		 * @param mixed $output Passed by reference. Used to append additional content.
56
		 * @param mixed $item Menu item data object.
57
		 * @param int   $depth (default: 0) Depth of menu item. Used for padding.
58
		 * @param array $args (default: array()) Arguments.
59
		 * @param int   $id (default: 0) Menu item ID.
60
		 * @return void
61
		 */
62
		public function start_el( &$output, $item, $depth = 0, $args = array(), $id = 0 ) {
63
			$indent = ( $depth ) ? str_repeat( "\t", $depth ) : '';
64
65
			/**
66
			 * Dividers, Headers or Disabled
67
			 * =============================
68
			 * Determine whether the item is a Divider, Header, Disabled or regular
69
			 * menu item. To prevent errors we use the strcasecmp() function to so a
70
			 * comparison that is not case sensitive. The strcasecmp() function returns
71
			 * a 0 if the strings are equal.
72
			 */
73
			if ( 0 === strcasecmp( $item->attr_title, 'divider' ) && 1 === $depth ) {
74
				$output .= $indent . '<li role="presentation" class="divider">';
75
			} elseif ( 0 === strcasecmp( $item->title, 'divider' ) && 1 === $depth ) {
76
				$output .= $indent . '<li role="presentation" class="divider">';
77
			} elseif ( 0 === strcasecmp( $item->attr_title, 'dropdown-header' ) && 1 === $depth ) {
78
				$output .= $indent . '<li role="presentation" class="dropdown-header">' . esc_attr( $item->title );
79
			} elseif ( 0 === strcasecmp( $item->attr_title, 'disabled' ) ) {
80
				$output .= $indent . '<li role="presentation" class="disabled"><a href="#">' . esc_attr( $item->title ) . '</a>';
81
			} else {
82
				$value       = '';
83
				$class_names = $value;
0 ignored issues
show
$class_names is not used, you could remove the assignment.

This check looks for variable assignements that are either overwritten by other assignments or where the variable is not used subsequently.

$myVar = 'Value';
$higher = false;

if (rand(1, 6) > 3) {
    $higher = true;
} else {
    $higher = false;
}

Both the $myVar assignment in line 1 and the $higher assignment in line 2 are dead. The first because $myVar is never used and the second because $higher is always overwritten for every possible time line.

Loading history...
84
				$classes     = empty( $item->classes ) ? array() : (array) $item->classes;
85
				$classes[]   = 'menu-item-' . $item->ID;
86
				$class_names = join( ' ', apply_filters( 'nav_menu_css_class', array_filter( $classes ), $item, $args, $depth ) );
87
				if ( $args->has_children ) {
88
					$class_names .= ' dropdown';
89
				}
90
				if ( in_array( 'current-menu-item', $classes, true ) ) {
91
					$class_names .= ' active';
92
				}
93
				$class_names = $class_names ? ' class="' . esc_attr( $class_names ) . '"' : '';
94
				$id          = apply_filters( 'nav_menu_item_id', 'menu-item-' . $item->ID, $item, $args );
95
				$id          = $id ? ' id="' . esc_attr( $id ) . '"' : '';
96
				$output     .= $indent . '<li itemscope="itemscope" itemtype="https://www.schema.org/SiteNavigationElement"' . $id . $value . $class_names . '>';
97
				$atts        = array();
98
99
				if ( empty( $item->attr_title ) ) {
100
					$atts['title'] = ! empty( $item->title ) ? strip_tags( $item->title ) : '';
101
				} else {
102
					$atts['title'] = $item->attr_title;
103
				}
104
105
				$atts['target'] = ! empty( $item->target ) ? $item->target : '';
106
				$atts['rel']    = ! empty( $item->xfn ) ? $item->xfn : '';
107
				// If item has_children add atts to a.
108
				if ( $args->has_children && 0 === $depth ) {
109
					$atts['href']          = '#';
110
					$atts['data-toggle']   = 'dropdown';
111
					$atts['class']         = 'dropdown-toggle';
112
					$atts['aria-haspopup'] = 'true';
113
				} else {
114
					$atts['href'] = ! empty( $item->url ) ? $item->url : '';
115
				}
116
				$atts       = apply_filters( 'nav_menu_link_attributes', $atts, $item, $args );
117
				$icon_attributes = '';
118
				$attributes = '';
119
				foreach ( $atts as $attr => $value ) {
120
					if ( ! empty( $value ) ) {
121
						$value       = ( 'href' === $attr ) ? esc_url( $value ) : esc_attr( $value );
122
						$attributes .= ' ' . $attr . '="' . $value . '"';
123
						// if item has icon, we want all except title attributes because we
124
						// want to avoid link title to be icon class
125
						if ( 'title' != $attr ) {
126
							$icon_attributes .= ' ' . $attr . '="' . $value . '"';
127
						}
128
					}
129
				}
130
				$item_output = $args->before;
131
132
				/*
133
				 * Glyphicons/Font-Awesome
134
				 * ===========
135
				 * Since the the menu item is NOT a Divider or Header we check the see
136
				 * if there is a value in the attr_title property. If the attr_title
137
				 * property is NOT null we apply it as the class name for the glyphicon.
138
				 */
139
				if ( ! empty( $item->attr_title ) ) {
140
					$pos = strpos( esc_attr( $item->attr_title ), 'glyphicon' );
141
					if ( false !== $pos ) {
142
						$item_output .= '<a' . $icon_attributes . ' title="' . esc_attr( $item->title ) . '"><span class="glyphicon ' . esc_attr( $item->attr_title ) . '" aria-hidden="true"></span>&nbsp;';
143
					} else {
144
						$item_output .= '<a' . $icon_attributes . ' title="' . esc_attr( $item->title ) . '"><i class="fa ' . esc_attr( $item->attr_title ) . '" aria-hidden="true"></i>&nbsp;';
145
					}
146
				} else {
147
					$item_output .= '<a' . $attributes . '>';
148
				}
149
				$item_output .= $args->link_before . apply_filters( 'the_title', $item->title, $item->ID ) . $args->link_after;
150
				$item_output .= ( $args->has_children && 0 === $depth ) ? ' <span class="caret"></span></a>' : '</a>';
151
				$item_output .= $args->after;
152
				$output      .= apply_filters( 'walker_nav_menu_start_el', $item_output, $item, $depth, $args );
153
			} // End if().
0 ignored issues
show
Unused Code Comprehensibility introduced by
43% of this comment could be valid code. Did you maybe forget this after debugging?

Sometimes obsolete code just ends up commented out instead of removed. In this case it is better to remove the code once you have checked you do not need it.

The code might also have been commented out for debugging purposes. In this case it is vital that someone uncomments it again or your project may behave in very unexpected ways in production.

This check looks for comments that seem to be mostly valid code and reports them.

Loading history...
154
		}
155
156
		/**
157
		 * Traverse elements to create list from elements.
158
		 *
159
		 * Display one element if the element doesn't have any children otherwise,
160
		 * display the element and its children. Will only traverse up to the max
161
		 * depth and no ignore elements under that depth.
162
		 *
163
		 * This method shouldn't be called directly, use the walk() method instead.
164
		 *
165
		 * @see Walker::start_el()
166
		 * @since 2.5.0
167
		 *
168
		 * @access public
169
		 * @param mixed $element Data object.
170
		 * @param mixed $children_elements List of elements to continue traversing.
171
		 * @param mixed $max_depth Max depth to traverse.
172
		 * @param mixed $depth Depth of current element.
173
		 * @param mixed $args Arguments.
174
		 * @param mixed $output Passed by reference. Used to append additional content.
175
		 * @return null Null on failure with no changes to parameters.
176
		 */
177
		public function display_element( $element, &$children_elements, $max_depth, $depth, $args, &$output ) {
178
			if ( ! $element ) {
179
				return; }
180
			$id_field = $this->db_fields['id'];
181
			// Display this element.
182
			if ( is_object( $args[0] ) ) {
183
				$args[0]->has_children = ! empty( $children_elements[ $element->$id_field ] ); }
184
			parent::display_element( $element, $children_elements, $max_depth, $depth, $args, $output );
185
		}
186
187
		/**
188
		 * Menu Fallback
189
		 * =============
190
		 * If this function is assigned to the wp_nav_menu's fallback_cb variable
191
		 * and a menu has not been assigned to the theme location in the WordPress
192
		 * menu manager the function with display nothing to a non-logged in user,
193
		 * and will add a link to the WordPress menu manager if logged in as an admin.
194
		 *
195
		 * @param array $args passed from the wp_nav_menu function.
196
		 */
197
		public static function fallback( $args ) {
198
			if ( current_user_can( 'edit_theme_options' ) ) {
199
200
				/* Get Arguments. */
201
				$container       = $args['container'];
202
				$container_id    = $args['container_id'];
203
				$container_class = $args['container_class'];
204
				$menu_class      = $args['menu_class'];
205
				$menu_id         = $args['menu_id'];
206
207
				if ( $container ) {
208
					echo '<' . esc_attr( $container );
209
					if ( $container_id ) {
210
						echo ' id="' . esc_attr( $container_id ) . '"';
211
					}
212
					if ( $container_class ) {
213
						echo ' class="' . esc_attr( $container_class ) . '"'; }
214
					echo '>';
215
				}
216
				echo '<ul';
217
				if ( $menu_id ) {
218
					echo ' id="' . esc_attr( $menu_id ) . '"'; }
219
				if ( $menu_class ) {
220
					echo ' class="' . esc_attr( $menu_class ) . '"'; }
221
				echo '>';
222
				echo '<li><a href="' . esc_url( admin_url( 'nav-menus.php' ) ) . '" title="">' . esc_attr( 'Add a menu', '' ) . '</a></li>';
223
				echo '</ul>';
224
				if ( $container ) {
225
					echo '</' . esc_attr( $container ) . '>'; }
226
			}
227
		}
228
	}
229
} // End if().
0 ignored issues
show
Unused Code Comprehensibility introduced by
43% of this comment could be valid code. Did you maybe forget this after debugging?

Sometimes obsolete code just ends up commented out instead of removed. In this case it is better to remove the code once you have checked you do not need it.

The code might also have been commented out for debugging purposes. In this case it is vital that someone uncomments it again or your project may behave in very unexpected ways in production.

This check looks for comments that seem to be mostly valid code and reports them.

Loading history...
230