/im', $output, $matches );
// with pointer at end of array check if we got an ID match.
if ( end( $matches[2] ) ) {
// build a string to use as aria-labelledby.
$labledby = 'aria-labelledby="' . end( $matches[2] ) . '"';
}
$output .= "\n$indent
\n";
}
/**
* Start El.
*
* @see Walker::start_el()
* @since 3.0.0
*
* @access public
* @param mixed $output Passed by reference. Used to append additional content.
* @param mixed $item Menu item data object.
* @param int $depth (default: 0) Depth of menu item. Used for padding.
* @param array $args (default: array()) Arguments.
* @param int $id (default: 0) Menu item ID.
* @return void
*/
public function start_el( &$output, $item, $depth = 0, $args = array(), $id = 0 ) {
$indent = ( $depth ) ? str_repeat( "\t", $depth ) : '';
$value = '';
$class_names = $value;
$classes = empty( $item->classes ) ? array() : (array) $item->classes;
// Loop through the array and pick out any special classes that need
// to be added to an element other than the main - .
$extra_link_classes = array();
$icon_class_string = '';
foreach ( $classes as $key => $class ) {
// test if this is a disabled link, a header or a divider.
if ( 'disabled' === $class || 'dropdown-header' === $class || 'dropdown-divider' === $class ) {
$extra_link_classes[] = $class;
unset( $classes[ $key ] );
}
// test for icon classes - Supports Font Awesome and Glyphicons.
if ( 'fa' === $class || 'fa-' === substr( $class, 0, 3 ) ) {
// Because of the abiguity of just 'fa' at the start both
// 'fa' & 'fa-' are tested for with Font Awesome icons.
$icon_class_string .= $class . ' ';
unset( $classes[ $key ] );
} elseif ( 'glyphicons' === substr( $class, 0, 10 ) ) {
// This should be a glyphicon icon class.
$icon_class_string .= $class . ' ';
unset( $classes[ $key ] );
}
}
$classes[] = 'menu-item-' . $item->ID;
// BSv4 classname - as of v4-alpha.
$classes[] = 'nav-item';
// reasign any filtered classes back to the $classes array.
$classes = apply_filters( 'nav_menu_css_class', array_filter( $classes ), $item, $args );
$class_names = join( ' ', $classes );
if ( $args->has_children ) {
$class_names .= ' dropdown';
}
if ( in_array( 'current-menu-item', $classes, true ) || in_array( 'current-menu-parent', $classes, true ) ) {
$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();
if ( empty( $item->attr_title ) ) {
$atts['title'] = ! empty( $item->title ) ? strip_tags( $item->title ) : '';
} else {
$atts['title'] = $item->attr_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 && 0 === $depth && $args->depth > 1 ) {
$atts['href'] = '#';
$atts['data-toggle'] = 'dropdown';
$atts['aria-haspopup'] = 'true';
$atts['aria-expanded'] = 'false';
$atts['class'] = 'dropdown-toggle nav-link';
$atts['id'] = 'menu-item-dropdown-' . $item->ID;
} else {
$atts['href'] = ! empty( $item->url ) ? $item->url : '';
// if we are in a dropdown then the the class .dropdown-item
// should be used instead of .nav-link.
if ( $depth > 0 ) {
$atts['class'] = 'dropdown-item';
} else {
$atts['class'] = 'nav-link';
}
}
// Set this as an indetifier flag to ease identifying special item
// types later in the processing. Default will be '' or 'link'.
$type_flag = 'link';
// Loop through the array of extra link classes plucked from the
// parent
- s classes array.
if ( ! empty( $extra_link_classes ) ) {
foreach ( $extra_link_classes as $link_class ) {
if ( ! empty( $link_class ) ) {
// update $atts with the extra class link.
$atts['class'] .= ' ' . esc_attr( $link_class );
// check for special class types we need additional handling for.
if ( 'disabled' === $link_class ) {
// if the modification is a disabled class...
// then # the link so it doesn't point anywhere.
$atts['href'] = '#';
} elseif ( 'dropdown-header' === $link_class ) {
// this is a header and needs a special flag
$type_flag = 'dropdown-header';
} elseif ( 'dropdown-divider' === $link_class ) {
// this is a divider and needs a special flag
$type_flag = 'dropdown-divider';
}
}
}
}
$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;
// if $type_flag doesnt contain 'link' it's probably a header or a
// divider for use in a dropdown.
if ( 'dropdown-header' === $type_flag ) {
// for a header I'm using a span with the .h6 class instead of
// a real header tag so that it doesn't confuse screen readers.
$item_output .= '