Geben Sie den Parameter aria-labeledby für ein Kind im Navigationsmenü aus

Obwohl ich über Bootstrap nav Menü-class weiß, entschied ich mich, meinen eigenen Walker zu schreiben, damit ich besser kontrollieren kann, was gedruckt wird, und im Bedarfsfall habe ich keine Probleme mit Lizenzen.

DAS PROBLEM

Meine class arbeitet auf den ersten Blick in fast allen Aspekten, die ich wollte. Nur ein Problem: Zum Zwecke der Barrierefreiheit (und wie von den Bootstrap-Beispielen vorgeschlagen) möchte aria-labelledby Attribut aria-labelledby zu Dropdown-Menüs hinzufügen, die aria-labelledby Elemente enthalten. Ich habe schwere Zeiten damit, weil ich nicht klar habe, welche functionen zuerst ausgeführt werden. Mein Code:

Die function start_lvl() :

 public function start_lvl( &$output, $depth = 0, $args = array() ) { if ( isset( $args->item_spacing ) && 'discard' === $args->item_spacing ) { $t = ''; $n = ''; } else { $t = "\t"; $n = "\n"; } $indent = str_repeat( $t, $depth ); $output .= "{$n}{$indent}

Die start_el() -function (basierend auf dem Original von Walker_Nav_Menu ; überprüfen Sie bis zum Ende, um zu sehen, wo ich es geändert habe)

 public function start_el( &$output, $item, $depth = 0, $args = array(), $id = 0 ) { if ( isset( $args->item_spacing ) && 'discard' === $args->item_spacing ) { $t = ''; $n = ''; } else { $t = "\t"; $n = "\n"; } $indent = ( $depth ) ? str_repeat( $t, $depth ) : ''; $classes = empty( $item->classes ) ? array() : (array) $item->classes; $classes[] = 'menu-item-' . $item->ID; /** * Filters the arguments for a single nav menu item. * * @since 4.4.0 * * @param stdClass $args An object of wp_nav_menu() arguments. * @param WP_Post $item Menu item data object. * @param int $depth Depth of menu item. Used for padding. */ $args = apply_filters( 'nav_menu_item_args', $args, $item, $depth ); /** * Filters the CSS class(es) applied to a menu item's list item element. * * @since 3.0.0 * @since 4.1.0 The `$depth` parameter was added. * * @param array $classes The CSS classes that are applied to the menu item's `
  • ` element. * @param WP_Post $item The current menu item. * @param stdClass $args An object of wp_nav_menu() arguments. * @param int $depth Depth of menu item. Used for padding. */ $class_names = join( ' ', apply_filters( 'nav_menu_css_class', array_filter( $classes ), $item, $args, $depth ) ); $class_names = $class_names ? ' class="' . esc_attr( $class_names ) . '"' : ''; /** * Filters the ID applied to a menu item's list item element. * * @since 3.0.1 * @since 4.1.0 The `$depth` parameter was added. * * @param string $menu_id The ID that is applied to the menu item's `
  • ` element. * @param WP_Post $item The current menu item. * @param stdClass $args An object of wp_nav_menu() arguments. * @param int $depth Depth of menu item. Used for padding. */ $id = apply_filters( 'nav_menu_item_id', 'menu-item-'. $item->ID, $item, $args, $depth ); $id = $id ? ' id="' . esc_attr( $id ) . '"' : ''; $output .= $indent . '
  • '; $atts = array(); $atts['title'] = ! empty( $item->attr_title ) ? $item->attr_title : ''; $atts['target'] = ! empty( $item->target ) ? $item->target : ''; $atts['rel'] = ! empty( $item->xfn ) ? $item->xfn : ''; $atts['href'] = ! empty( $item->url ) ? $item->url : ''; /** * Filters the HTML attributes applied to a menu item's anchor element. * * @since 3.6.0 * @since 4.1.0 The `$depth` parameter was added. * * @param array $atts { * The HTML attributes applied to the menu item's `` element, empty strings are ignored. * * @type string $title Title attribute. * @type string $target Target attribute. * @type string $rel The rel attribute. * @type string $href The href attribute. * } * @param WP_Post $item The current menu item. * @param stdClass $args An object of wp_nav_menu() arguments. * @param int $depth Depth of menu item. Used for padding. */ $atts = apply_filters( 'nav_menu_link_attributes', $atts, $item, $args, $depth ); $attributes = ''; foreach ( $atts as $attr => $value ) { if ( ! empty( $value ) ) { $value = ( 'href' === $attr ) ? esc_url( $value ) : esc_attr( $value ); $attributes .= ' ' . $attr . '="' . $value . '"'; } } /** This filter is documented in wp-includes/post-template.php */ $title = apply_filters( 'the_title', $item->title, $item->ID ); /** * Filters a menu item's title. * * @since 4.4.0 * * @param string $title The menu item's title. * @param WP_Post $item The current menu item. * @param stdClass $args An object of wp_nav_menu() arguments. * @param int $depth Depth of menu item. Used for padding. */ $title = apply_filters( 'nav_menu_item_title', $title, $item, $args, $depth ); if (array_search('menu-item-has-children', $classes, true)) { $attributes = ' class="btn btn-default dropdown-toggle" type="button" data-toggle="dropdown" aria-haspopup="true" aria-expanded="true" id = "link-'.$item->ID.'"'; $title = $title. ' '; } $item_output = $args->before; $item_output .= ''; $item_output .= $args->link_before . $title . $args->link_after; $item_output .= ''; $item_output .= $args->after; /** * Filters a menu item's starting output. * * The menu item's starting output only includes `$args->before`, the opening ``, * the menu item's title, the closing ``, and `$args->after`. Currently, there is * no filter for modifying the opening and closing `
  • ` for a menu item. * * @since 3.0.0 * * @param string $item_output The menu item's starting HTML output. * @param WP_Post $item Menu item data object. * @param int $depth Depth of menu item. Used for padding. * @param stdClass $args An object of wp_nav_menu() arguments. */ $output .= apply_filters( 'walker_nav_menu_start_el', $item_output, $item, $depth, $args ); }
  • Die anderen functionen sind unberührt. In Fakten muss ich etwas setzen, das in start_el() bleibt, aber in start_lvl() . Als eine Randnotiz, soweit ich weiß, hat nicht einmal die bekannte Nav-Walker-class diese function. Wie könnte ich das umsetzen? Vielen Dank.

    Solutions Collecting From Web of "Geben Sie den Parameter aria-labeledby für ein Kind im Navigationsmenü aus"

    Ich habe es getriggers. Ich dachte, es könnte funktionieren, aber ich war mir nicht sicher, und ich wollte etwas Meinung von erfahreneren Leuten. Wie auch immer, das habe ich getan:

    Als erstes habe ich eine private Var in meiner Walker-class definiert:

     private $el; 

    In meiner start_el() function füllte ich diese start_el() mit $item

     $this->el = $item; 

    Zu diesem Zeitpunkt konnte ich von start_lvl() die Eigenschaft start_lvl() beliebigen Objekts start_lvl()

     $output .= "{$n}{$indent}
      el->ID."\">{$n}";

    Naja, das war einfach, aber ich hoffe, ich werde jemandem helfen