输出导航菜单子菜单的aria-Labelledby参数

时间:2017-05-30 作者:Daniele Squalo

虽然我知道Bootstrap nav menu class, 我决定自己写Walker, 因此,我可以更好地控制打印内容,如果需要,我对许可证没有任何问题。

THE PROBLEM

乍一看,我的班级几乎在我想要的所有方面都在努力。只有一个问题:出于可访问性的目的(正如Bootstrap的示例所建议的),我想添加aria-labelledby 属性设置为包含子元素的下拉菜单。我在这方面遇到了困难,因为我不清楚首先真正执行的是什么函数。我的代码:

这个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}<ul class=\\"dropdown-menu\\" aria-labelledby=\\"\\">{$n}";
    }
Thestart_el() 功能(基于原始Walker_Nav_Menu; 检查接近尾端的地方,查看我在哪里修改了它)

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 `<li>` 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 `<li>` 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 . \'<li\' . $id . $class_names .\'>\';

            $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 `<a>` 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. \' <span class="caret"></span>\';
            }
            $item_output = $args->before;
            $item_output .= \'<a\'. $attributes .\'>\';
            $item_output .= $args->link_before . $title . $args->link_after;
            $item_output .= \'</a>\';
            $item_output .= $args->after;

            /**
             * Filters a menu item\'s starting output.
             *
             * The menu item\'s starting output only includes `$args->before`, the opening `<a>`,
             * the menu item\'s title, the closing `</a>`, and `$args->after`. Currently, there is
             * no filter for modifying the opening and closing `<li>` 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 );
        }
其他功能未触及。事实上,我需要放一些东西start_el(), 但在里面start_lvl(). 顺便说一句,据我所知,即使是已知的nav walker类也没有此功能。我如何实现它?非常感谢。

1 个回复
最合适的回答,由SO网友:Daniele Squalo 整理而成

我解决了它。我认为这可以奏效,但我不确定,我想从更有经验的人那里得到一些意见。无论如何,这就是我所做的:

首先,我在walker类中定义了一个私有var:

private $el;
在我的start_el() 函数,我用$item

$this->el = $item;
此时,我可以从start_lvl()

$output .= "{$n}{$indent}<ul class=\\"dropdown-menu\\" aria-labelledby=\\"link-".$this->el->ID."\\">{$n}";
哦,那很简单,但我希望我能帮助别人

结束

相关推荐

Walker Class:在子菜单后立即输出父描述和特色图像?

我到处找遍了,但似乎找不到这个具体案例的答案。我试图在子菜单开始后立即输出页面的父描述和特征图像。我有以下代码可以工作,但会迭代每个链接,这很混乱。我至少能够修改深度,使其只输出一次内容,但我想a)清理它,b)找到真正正确的方法来执行此操作。这是我现在的步行者:class Description_Walker extends Walker_Nav_Menu { function start_el(&$output, $item, $depth, $args) {