Advertisement
bedas

Bootstrap NavWalker

Jul 16th, 2020
164
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
PHP 20.93 KB | None | 0 0
  1. <?php
  2. /**
  3.  * WP Bootstrap Navwalker
  4.  *
  5.  * @package WP-Bootstrap-Navwalker
  6.  *
  7.  * @wordpress-plugin
  8.  * Plugin Name: WP Bootstrap Navwalker
  9.  * Plugin URI:  https://github.com/wp-bootstrap/wp-bootstrap-navwalker
  10.  * Description: A custom WordPress nav walker class to implement the Bootstrap 4 navigation style in a custom theme using the WordPress built in menu manager.
  11.  * Author: Edward McIntyre - @twittem, WP Bootstrap, William Patton - @pattonwebz
  12.  * Version: 4.3.0
  13.  * Author URI: https://github.com/wp-bootstrap
  14.  * GitHub Plugin URI: https://github.com/wp-bootstrap/wp-bootstrap-navwalker
  15.  * GitHub Branch: master
  16.  * License: GPL-3.0+
  17.  * License URI: http://www.gnu.org/licenses/gpl-3.0.txt
  18.  */
  19.  
  20. // Check if Class Exists.
  21. if ( ! class_exists( 'WP_Bootstrap_Navwalker' ) ) {
  22.     /**
  23.      * WP_Bootstrap_Navwalker class.
  24.      *
  25.      * @extends Walker_Nav_Menu
  26.      */
  27.     class WP_Bootstrap_Navwalker extends Walker_Nav_Menu {
  28.  
  29.         /**
  30.          * Starts the list before the elements are added.
  31.          *
  32.          * @since WP 3.0.0
  33.          *
  34.          * @see Walker_Nav_Menu::start_lvl()
  35.          *
  36.          * @param string   $output Used to append additional content (passed by reference).
  37.          * @param int      $depth  Depth of menu item. Used for padding.
  38.          * @param stdClass $args   An object of wp_nav_menu() arguments.
  39.          */
  40.         public function start_lvl( &$output, $depth = 0, $args = array() ) {
  41.             if ( isset( $args->item_spacing ) && 'discard' === $args->item_spacing ) {
  42.                 $t = '';
  43.                 $n = '';
  44.             } else {
  45.                 $t = "\t";
  46.                 $n = "\n";
  47.             }
  48.             $indent = str_repeat( $t, $depth );
  49.             // Default class to add to the file.
  50.             $classes = array( 'dropdown-menu' );
  51.             /**
  52.              * Filters the CSS class(es) applied to a menu list element.
  53.              *
  54.              * @since WP 4.8.0
  55.              *
  56.              * @param array    $classes The CSS classes that are applied to the menu `<ul>` element.
  57.              * @param stdClass $args    An object of `wp_nav_menu()` arguments.
  58.              * @param int      $depth   Depth of menu item. Used for padding.
  59.              */
  60.             $class_names = join( ' ', apply_filters( 'nav_menu_submenu_css_class', $classes, $args, $depth ) );
  61.             $class_names = $class_names ? ' class="' . esc_attr( $class_names ) . '"' : '';
  62.  
  63.             /*
  64.              * The `.dropdown-menu` container needs to have a labelledby
  65.              * attribute which points to it's trigger link.
  66.              *
  67.              * Form a string for the labelledby attribute from the the latest
  68.              * link with an id that was added to the $output.
  69.              */
  70.             $labelledby = '';
  71.             // Find all links with an id in the output.
  72.             preg_match_all( '/(<a.*?id=\"|\')(.*?)\"|\'.*?>/im', $output, $matches );
  73.             // With pointer at end of array check if we got an ID match.
  74.             if ( end( $matches[2] ) ) {
  75.                 // Build a string to use as aria-labelledby.
  76.                 $labelledby = 'aria-labelledby="' . esc_attr( end( $matches[2] ) ) . '"';
  77.             }
  78.             $output .= "{$n}{$indent}<ul$class_names $labelledby role=\"menu\">{$n}";
  79.         }
  80.  
  81.         /**
  82.          * Starts the element output.
  83.          *
  84.          * @since WP 3.0.0
  85.          * @since WP 4.4.0 The {@see 'nav_menu_item_args'} filter was added.
  86.          *
  87.          * @see Walker_Nav_Menu::start_el()
  88.          *
  89.          * @param string   $output Used to append additional content (passed by reference).
  90.          * @param WP_Post  $item   Menu item data object.
  91.          * @param int      $depth  Depth of menu item. Used for padding.
  92.          * @param stdClass $args   An object of wp_nav_menu() arguments.
  93.          * @param int      $id     Current item ID.
  94.          */
  95.         public function start_el( &$output, $item, $depth = 0, $args = array(), $id = 0 ) {
  96.             if ( isset( $args->item_spacing ) && 'discard' === $args->item_spacing ) {
  97.                 $t = '';
  98.                 $n = '';
  99.             } else {
  100.                 $t = "\t";
  101.                 $n = "\n";
  102.             }
  103.             $indent = ( $depth ) ? str_repeat( $t, $depth ) : '';
  104.  
  105.             $classes = empty( $item->classes ) ? array() : (array) $item->classes;
  106.  
  107.             /*
  108.              * Initialize some holder variables to store specially handled item
  109.              * wrappers and icons.
  110.              */
  111.             $linkmod_classes = array();
  112.             $icon_classes    = array();
  113.  
  114.             /*
  115.              * Get an updated $classes array without linkmod or icon classes.
  116.              *
  117.              * NOTE: linkmod and icon class arrays are passed by reference and
  118.              * are maybe modified before being used later in this function.
  119.              */
  120.             $classes = self::separate_linkmods_and_icons_from_classes( $classes, $linkmod_classes, $icon_classes, $depth );
  121.  
  122.             // Join any icon classes plucked from $classes into a string.
  123.             $icon_class_string = join( ' ', $icon_classes );
  124.  
  125.             /**
  126.              * Filters the arguments for a single nav menu item.
  127.              *
  128.              *  WP 4.4.0
  129.              *
  130.              * @param stdClass $args  An object of wp_nav_menu() arguments.
  131.              * @param WP_Post  $item  Menu item data object.
  132.              * @param int      $depth Depth of menu item. Used for padding.
  133.              */
  134.             $args = apply_filters( 'nav_menu_item_args', $args, $item, $depth );
  135.  
  136.             // Add .dropdown or .active classes where they are needed.
  137.             if ( isset( $args->has_children ) && $args->has_children ) {
  138.                 $classes[] = 'dropdown';
  139.             }
  140.             if ( in_array( 'current-menu-item', $classes, true ) || in_array( 'current-menu-parent', $classes, true ) ) {
  141.                 $classes[] = 'active';
  142.             }
  143.  
  144.             // Add some additional default classes to the item.
  145.             $classes[] = 'menu-item-' . $item->ID;
  146.             $classes[] = 'nav-item';
  147.  
  148.             // Allow filtering the classes.
  149.             $classes = apply_filters( 'nav_menu_css_class', array_filter( $classes ), $item, $args, $depth );
  150.  
  151.             // Form a string of classes in format: class="class_names".
  152.             $class_names = join( ' ', $classes );
  153.             $class_names = $class_names ? ' class="' . esc_attr( $class_names ) . '"' : '';
  154.  
  155.             /**
  156.              * Filters the ID applied to a menu item's list item element.
  157.              *
  158.              * @since WP 3.0.1
  159.              * @since WP 4.1.0 The `$depth` parameter was added.
  160.              *
  161.              * @param string   $menu_id The ID that is applied to the menu item's `<li>` element.
  162.              * @param WP_Post  $item    The current menu item.
  163.              * @param stdClass $args    An object of wp_nav_menu() arguments.
  164.              * @param int      $depth   Depth of menu item. Used for padding.
  165.              */
  166.             $id = apply_filters( 'nav_menu_item_id', 'menu-item-' . $item->ID, $item, $args, $depth );
  167.             $id = $id ? ' id="' . esc_attr( $id ) . '"' : '';
  168.  
  169.             $output .= $indent . '<li itemscope="itemscope" itemtype="https://www.schema.org/SiteNavigationElement"' . $id . $class_names . '>';
  170.  
  171.             // Initialize array for holding the $atts for the link item.
  172.             $atts = array();
  173.  
  174.             /*
  175.              * Set title from item to the $atts array - if title is empty then
  176.              * default to item title.
  177.              */
  178.             if ( empty( $item->attr_title ) ) {
  179.                 $atts['title'] = ! empty( $item->title ) ? strip_tags( $item->title ) : '';
  180.             } else {
  181.                 $atts['title'] = $item->attr_title;
  182.             }
  183.  
  184.             $atts['target'] = ! empty( $item->target ) ? $item->target : '';
  185.             $atts['rel']    = ! empty( $item->xfn ) ? $item->xfn : '';
  186.             // If the item has children, add atts to the <a>.
  187.             if ( isset( $args->has_children ) && $args->has_children && $args->depth > 1 ) {
  188.                 $atts['href']          = '#';
  189.                 $atts['data-toggle']   = 'dropdown';
  190.                 $atts['aria-haspopup'] = 'true';
  191.                 $atts['aria-expanded'] = 'false';
  192.                 $atts['class']         = 'dropdown-toggle nav-link';
  193.                 $atts['id']            = 'menu-item-dropdown-' . $item->ID;
  194.             } else {
  195.                 $atts['href'] = ! empty( $item->url ) ? $item->url : '#';
  196.                 // For items in dropdowns use .dropdown-item instead of .nav-link.
  197.                 if ( $depth > 0 ) {
  198.                     $atts['class'] = 'dropdown-item';
  199.                 } else {
  200.                     $atts['class'] = 'nav-link';
  201.                 }
  202.             }
  203.  
  204.             $atts['aria-current'] = $item->current ? 'page' : '';
  205.  
  206.             // Update atts of this item based on any custom linkmod classes.
  207.             $atts = self::update_atts_for_linkmod_type( $atts, $linkmod_classes );
  208.             // Allow filtering of the $atts array before using it.
  209.             $atts = apply_filters( 'nav_menu_link_attributes', $atts, $item, $args, $depth );
  210.  
  211.             // Build a string of html containing all the atts for the item.
  212.             $attributes = '';
  213.             foreach ( $atts as $attr => $value ) {
  214.                 if ( ! empty( $value ) ) {
  215.                     $value       = ( 'href' === $attr ) ? esc_url( $value ) : esc_attr( $value );
  216.                     $attributes .= ' ' . $attr . '="' . $value . '"';
  217.                 }
  218.             }
  219.  
  220.             // Set a typeflag to easily test if this is a linkmod or not.
  221.             $linkmod_type = self::get_linkmod_type( $linkmod_classes );
  222.  
  223.             // START appending the internal item contents to the output.
  224.             $item_output = isset( $args->before ) ? $args->before : '';
  225.  
  226.             /*
  227.              * This is the start of the internal nav item. Depending on what
  228.              * kind of linkmod we have we may need different wrapper elements.
  229.              */
  230.             if ( '' !== $linkmod_type ) {
  231.                 // Is linkmod, output the required element opener.
  232.                 $item_output .= self::linkmod_element_open( $linkmod_type, $attributes );
  233.             } else {
  234.                 // With no link mod type set this must be a standard <a> tag.
  235.                 $item_output .= '<a' . $attributes . '>';
  236.             }
  237.  
  238.             /*
  239.              * Initiate empty icon var, then if we have a string containing any
  240.              * icon classes form the icon markup with an <i> element. This is
  241.              * output inside of the item before the $title (the link text).
  242.              */
  243.             $icon_html = '';
  244.             if ( ! empty( $icon_class_string ) ) {
  245.                 // Append an <i> with the icon classes to what is output before links.
  246.                 $icon_html = '<i class="' . esc_attr( $icon_class_string ) . '" aria-hidden="true"></i> ';
  247.             }
  248.  
  249.             /** This filter is documented in wp-includes/post-template.php */
  250.             $title = apply_filters( 'the_title', esc_html( $item->title ), $item->ID );
  251.  
  252.             /**
  253.              * Filters a menu item's title.
  254.              *
  255.              * @since WP 4.4.0
  256.              *
  257.              * @param string   $title The menu item's title.
  258.              * @param WP_Post  $item  The current menu item.
  259.              * @param stdClass $args  An object of wp_nav_menu() arguments.
  260.              * @param int      $depth Depth of menu item. Used for padding.
  261.              */
  262.             $title = apply_filters( 'nav_menu_item_title', $title, $item, $args, $depth );
  263.  
  264.             // If the .sr-only class was set apply to the nav items text only.
  265.             if ( in_array( 'sr-only', $linkmod_classes, true ) ) {
  266.                 $title         = self::wrap_for_screen_reader( $title );
  267.                 $keys_to_unset = array_keys( $linkmod_classes, 'sr-only', true );
  268.                 foreach ( $keys_to_unset as $k ) {
  269.                     unset( $linkmod_classes[ $k ] );
  270.                 }
  271.             }
  272.  
  273.             // Put the item contents into $output.
  274.             $item_output .= isset( $args->link_before ) ? $args->link_before . $icon_html . $title . $args->link_after : '';
  275.  
  276.             /*
  277.              * This is the end of the internal nav item. We need to close the
  278.              * correct element depending on the type of link or link mod.
  279.              */
  280.             if ( '' !== $linkmod_type ) {
  281.                 // Is linkmod, output the required closing element.
  282.                 $item_output .= self::linkmod_element_close( $linkmod_type );
  283.             } else {
  284.                 // With no link mod type set this must be a standard <a> tag.
  285.                 $item_output .= '</a>';
  286.             }
  287.  
  288.             $item_output .= isset( $args->after ) ? $args->after : '';
  289.  
  290.             // END appending the internal item contents to the output.
  291.             $output .= apply_filters( 'walker_nav_menu_start_el', $item_output, $item, $depth, $args );
  292.  
  293.         }
  294.  
  295.         /**
  296.          * Traverse elements to create list from elements.
  297.          *
  298.          * Display one element if the element doesn't have any children otherwise,
  299.          * display the element and its children. Will only traverse up to the max
  300.          * depth and no ignore elements under that depth. It is possible to set the
  301.          * max depth to include all depths, see walk() method.
  302.          *
  303.          * This method should not be called directly, use the walk() method instead.
  304.          *
  305.          * @since WP 2.5.0
  306.          *
  307.          * @see Walker::start_lvl()
  308.          *
  309.          * @param object $element           Data object.
  310.          * @param array  $children_elements List of elements to continue traversing (passed by reference).
  311.          * @param int    $max_depth         Max depth to traverse.
  312.          * @param int    $depth             Depth of current element.
  313.          * @param array  $args              An array of arguments.
  314.          * @param string $output            Used to append additional content (passed by reference).
  315.          */
  316.         public function display_element( $element, &$children_elements, $max_depth, $depth, $args, &$output ) {
  317.             if ( ! $element ) {
  318.                 return; }
  319.             $id_field = $this->db_fields['id'];
  320.             // Display this element.
  321.             if ( is_object( $args[0] ) ) {
  322.                 $args[0]->has_children = ! empty( $children_elements[ $element->$id_field ] ); }
  323.             parent::display_element( $element, $children_elements, $max_depth, $depth, $args, $output );
  324.         }
  325.  
  326.         /**
  327.          * Menu Fallback.
  328.          *
  329.          * If this function is assigned to the wp_nav_menu's fallback_cb variable
  330.          * and a menu has not been assigned to the theme location in the WordPress
  331.          * menu manager the function with display nothing to a non-logged in user,
  332.          * and will add a link to the WordPress menu manager if logged in as an admin.
  333.          *
  334.          * @param array $args passed from the wp_nav_menu function.
  335.          */
  336.         public static function fallback( $args ) {
  337.             if ( current_user_can( 'edit_theme_options' ) ) {
  338.  
  339.                 // Get Arguments.
  340.                 $container       = $args['container'];
  341.                 $container_id    = $args['container_id'];
  342.                 $container_class = $args['container_class'];
  343.                 $menu_class      = $args['menu_class'];
  344.                 $menu_id         = $args['menu_id'];
  345.  
  346.                 // Initialize var to store fallback html.
  347.                 $fallback_output = '';
  348.  
  349.                 if ( $container ) {
  350.                     $fallback_output .= '<' . esc_attr( $container );
  351.                     if ( $container_id ) {
  352.                         $fallback_output .= ' id="' . esc_attr( $container_id ) . '"';
  353.                     }
  354.                     if ( $container_class ) {
  355.                         $fallback_output .= ' class="' . esc_attr( $container_class ) . '"';
  356.                     }
  357.                     $fallback_output .= '>';
  358.                 }
  359.                 $fallback_output .= '<ul';
  360.                 if ( $menu_id ) {
  361.                     $fallback_output .= ' id="' . esc_attr( $menu_id ) . '"'; }
  362.                 if ( $menu_class ) {
  363.                     $fallback_output .= ' class="' . esc_attr( $menu_class ) . '"'; }
  364.                 $fallback_output .= '>';
  365.                 $fallback_output .= '<li class="nav-item"><a href="' . esc_url( admin_url( 'nav-menus.php' ) ) . '" class="nav-link" title="' . esc_attr__( 'Add a menu', 'wp-bootstrap-navwalker' ) . '">' . esc_html__( 'Add a menu', 'wp-bootstrap-navwalker' ) . '</a></li>';
  366.                 $fallback_output .= '</ul>';
  367.                 if ( $container ) {
  368.                     $fallback_output .= '</' . esc_attr( $container ) . '>';
  369.                 }
  370.  
  371.                 // If $args has 'echo' key and it's true echo, otherwise return.
  372.                 if ( array_key_exists( 'echo', $args ) && $args['echo'] ) {
  373.                     echo $fallback_output; // WPCS: XSS OK.
  374.                 } else {
  375.                     return $fallback_output;
  376.                 }
  377.             }
  378.         }
  379.  
  380.         /**
  381.          * Find any custom linkmod or icon classes and store in their holder
  382.          * arrays then remove them from the main classes array.
  383.          *
  384.          * Supported linkmods: .disabled, .dropdown-header, .dropdown-divider, .sr-only
  385.          * Supported iconsets: Font Awesome 4/5, Glypicons
  386.          *
  387.          * NOTE: This accepts the linkmod and icon arrays by reference.
  388.          *
  389.          * @since 4.0.0
  390.          *
  391.          * @param array   $classes         an array of classes currently assigned to the item.
  392.          * @param array   $linkmod_classes an array to hold linkmod classes.
  393.          * @param array   $icon_classes    an array to hold icon classes.
  394.          * @param integer $depth           an integer holding current depth level.
  395.          *
  396.          * @return array  $classes         a maybe modified array of classnames.
  397.          */
  398.         private function separate_linkmods_and_icons_from_classes( $classes, &$linkmod_classes, &$icon_classes, $depth ) {
  399.             // Loop through $classes array to find linkmod or icon classes.
  400.             foreach ( $classes as $key => $class ) {
  401.                 /*
  402.                  * If any special classes are found, store the class in it's
  403.                  * holder array and and unset the item from $classes.
  404.                  */
  405.                 if ( preg_match( '/^disabled|^sr-only/i', $class ) ) {
  406.                     // Test for .disabled or .sr-only classes.
  407.                     $linkmod_classes[] = $class;
  408.                     unset( $classes[ $key ] );
  409.                 } elseif ( preg_match( '/^dropdown-header|^dropdown-divider|^dropdown-item-text/i', $class ) && $depth > 0 ) {
  410.                     /*
  411.                      * Test for .dropdown-header or .dropdown-divider and a
  412.                      * depth greater than 0 - IE inside a dropdown.
  413.                      */
  414.                     $linkmod_classes[] = $class;
  415.                     unset( $classes[ $key ] );
  416.                 } elseif ( preg_match( '/^fa-(\S*)?|^fa(s|r|l|b)?(\s?)?$/i', $class ) ) {
  417.                     // Font Awesome.
  418.                     $icon_classes[] = $class;
  419.                     unset( $classes[ $key ] );
  420.                 } elseif ( preg_match( '/^glyphicon-(\S*)?|^glyphicon(\s?)$/i', $class ) ) {
  421.                     // Glyphicons.
  422.                     $icon_classes[] = $class;
  423.                     unset( $classes[ $key ] );
  424.                 }
  425.             }
  426.  
  427.             return $classes;
  428.         }
  429.  
  430.         /**
  431.          * Return a string containing a linkmod type and update $atts array
  432.          * accordingly depending on the decided.
  433.          *
  434.          * @since 4.0.0
  435.          *
  436.          * @param array $linkmod_classes array of any link modifier classes.
  437.          *
  438.          * @return string                empty for default, a linkmod type string otherwise.
  439.          */
  440.         private function get_linkmod_type( $linkmod_classes = array() ) {
  441.             $linkmod_type = '';
  442.             // Loop through array of linkmod classes to handle their $atts.
  443.             if ( ! empty( $linkmod_classes ) ) {
  444.                 foreach ( $linkmod_classes as $link_class ) {
  445.                     if ( ! empty( $link_class ) ) {
  446.  
  447.                         // Check for special class types and set a flag for them.
  448.                         if ( 'dropdown-header' === $link_class ) {
  449.                             $linkmod_type = 'dropdown-header';
  450.                         } elseif ( 'dropdown-divider' === $link_class ) {
  451.                             $linkmod_type = 'dropdown-divider';
  452.                         } elseif ( 'dropdown-item-text' === $link_class ) {
  453.                             $linkmod_type = 'dropdown-item-text';
  454.                         }
  455.                     }
  456.                 }
  457.             }
  458.             return $linkmod_type;
  459.         }
  460.  
  461.         /**
  462.          * Update the attributes of a nav item depending on the limkmod classes.
  463.          *
  464.          * @since 4.0.0
  465.          *
  466.          * @param array $atts            array of atts for the current link in nav item.
  467.          * @param array $linkmod_classes an array of classes that modify link or nav item behaviors or displays.
  468.          *
  469.          * @return array                 maybe updated array of attributes for item.
  470.          */
  471.         private function update_atts_for_linkmod_type( $atts = array(), $linkmod_classes = array() ) {
  472.             if ( ! empty( $linkmod_classes ) ) {
  473.                 foreach ( $linkmod_classes as $link_class ) {
  474.                     if ( ! empty( $link_class ) ) {
  475.                         /*
  476.                          * Update $atts with a space and the extra classname
  477.                          * so long as it's not a sr-only class.
  478.                          */
  479.                         if ( 'sr-only' !== $link_class ) {
  480.                             $atts['class'] .= ' ' . esc_attr( $link_class );
  481.                         }
  482.                         // Check for special class types we need additional handling for.
  483.                         if ( 'disabled' === $link_class ) {
  484.                             // Convert link to '#' and unset open targets.
  485.                             $atts['href'] = '#';
  486.                             unset( $atts['target'] );
  487.                         } elseif ( 'dropdown-header' === $link_class || 'dropdown-divider' === $link_class || 'dropdown-item-text' === $link_class ) {
  488.                             // Store a type flag and unset href and target.
  489.                             unset( $atts['href'] );
  490.                             unset( $atts['target'] );
  491.                         }
  492.                     }
  493.                 }
  494.             }
  495.             return $atts;
  496.         }
  497.  
  498.         /**
  499.          * Wraps the passed text in a screen reader only class.
  500.          *
  501.          * @since 4.0.0
  502.          *
  503.          * @param string $text the string of text to be wrapped in a screen reader class.
  504.          * @return string      the string wrapped in a span with the class.
  505.          */
  506.         private function wrap_for_screen_reader( $text = '' ) {
  507.             if ( $text ) {
  508.                 $text = '<span class="sr-only">' . $text . '</span>';
  509.             }
  510.             return $text;
  511.         }
  512.  
  513.         /**
  514.          * Returns the correct opening element and attributes for a linkmod.
  515.          *
  516.          * @since 4.0.0
  517.          *
  518.          * @param string $linkmod_type a sting containing a linkmod type flag.
  519.          * @param string $attributes   a string of attributes to add to the element.
  520.          *
  521.          * @return string              a string with the openign tag for the element with attribibutes added.
  522.          */
  523.         private function linkmod_element_open( $linkmod_type, $attributes = '' ) {
  524.             $output = '';
  525.             if ( 'dropdown-item-text' === $linkmod_type ) {
  526.                 $output .= '<span class="dropdown-item-text"' . $attributes . '>';
  527.             } elseif ( 'dropdown-header' === $linkmod_type ) {
  528.                 /*
  529.                  * For a header use a span with the .h6 class instead of a real
  530.                  * header tag so that it doesn't confuse screen readers.
  531.                  */
  532.                 $output .= '<span class="dropdown-header h6"' . $attributes . '>';
  533.             } elseif ( 'dropdown-divider' === $linkmod_type ) {
  534.                 // This is a divider.
  535.                 $output .= '<div class="dropdown-divider"' . $attributes . '>';
  536.             }
  537.             return $output;
  538.         }
  539.  
  540.         /**
  541.          * Return the correct closing tag for the linkmod element.
  542.          *
  543.          * @since 4.0.0
  544.          *
  545.          * @param string $linkmod_type a string containing a special linkmod type.
  546.          *
  547.          * @return string              a string with the closing tag for this linkmod type.
  548.          */
  549.         private function linkmod_element_close( $linkmod_type ) {
  550.             $output = '';
  551.             if ( 'dropdown-header' === $linkmod_type || 'dropdown-item-text' === $linkmod_type ) {
  552.                 /*
  553.                  * For a header use a span with the .h6 class instead of a real
  554.                  * header tag so that it doesn't confuse screen readers.
  555.                  */
  556.                 $output .= '</span>';
  557.             } elseif ( 'dropdown-divider' === $linkmod_type ) {
  558.                 // This is a divider.
  559.                 $output .= '</div>';
  560.             }
  561.             return $output;
  562.         }
  563.     }
  564. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement