如何从wp_NAV_MENU请求CONTAINER_CLASS

时间:2016-04-16 作者:550

我目前正在尝试设置一个自定义导航行者,它将使用菜单中的container\\u class作为列表项和子项的类名前缀。

$defaults = array(
\'menu\'            => \'\',
\'menu_class\'      => \'\',
\'menu_id\'     => \'\',
\'container\'       => \'nav\',
\'container_class\' => \'nav-primary\',
\'container_id\'    => \'\',
\'before\'      => \'\',
\'after\'       => \'\',
\'link_before\'     => \'\',
\'link_after\'      => \'\',
\'depth\'       => 0,
\'walker\'          => new Custom_Nav_Walker(),
\'theme_location\'  => \'primary\',
\'items_wrap\'      => \'<ul>%3$s</ul>\',
);
wp_nav_menu( $defaults );
一般的想法是walker将根据容器类名称循环出类。就像这样。

<nav class="nav-primary">
  <li class="nav-primary__item"><a href="#">Link</a></li>
  <li class="nav-primary__item"><a href="#">Link</a></li>
  <li class="nav-primary__item"><a href="#">Link</a></li>
</nav>
希望有人能帮忙。

2 个回复
最合适的回答,由SO网友:Tung Du 整理而成

使用定制助行器

class Your_Walker_Nav_Menu extends Walker_Nav_Menu {
    var $container_class;
    public function __construct($container_class) {
        $this->container_class = $container_class;
    }

    function start_el( &$output, $item, $depth = 0, $args = array(), $id = 0 ) {
        global $wp_query;
        $indent = ( $depth > 0 ? str_repeat( "\\t", $depth ) : \'\' ); // code indent

        // Depth-dependent classes.
        $depth_classes = array(
            ( $depth == 0 ? \'main-menu-item\' : \'sub-menu-item\' ),
            ( $depth >=2 ? \'sub-sub-menu-item\' : \'\' ),
            ( $depth % 2 ? \'menu-item-odd\' : \'menu-item-even\' ),
            \'menu-item-depth-\' . $depth
        );
        $depth_class_names = esc_attr( implode( \' \', $depth_classes ) );

        // Passed classes.
        $classes = empty( $item->classes ) ? array() : (array) $item->classes;
        $class_names = esc_attr( implode( \' \', apply_filters( \'nav_menu_css_class\', array_filter( $classes ), $item ) ) );

        // Build HTML.
        $output .= $indent . \'<li id="nav-menu-item-\'. $item->ID . \'" class="\'. $this->container_class . \'__item \' . $depth_class_names . \' \' . $class_names . \'">\';

        // Link attributes.
        $attributes  = ! empty( $item->attr_title ) ? \' title="\'  . esc_attr( $item->attr_title ) .\'"\' : \'\';
        $attributes .= ! empty( $item->target )     ? \' target="\' . esc_attr( $item->target     ) .\'"\' : \'\';
        $attributes .= ! empty( $item->xfn )        ? \' rel="\'    . esc_attr( $item->xfn        ) .\'"\' : \'\';
        $attributes .= ! empty( $item->url )        ? \' href="\'   . esc_attr( $item->url        ) .\'"\' : \'\';
        $attributes .= \' class="menu-link \' . ( $depth > 0 ? \'sub-menu-link\' : \'main-menu-link\' ) . \'"\';

        // Build HTML output and pass through the proper filter.
        $item_output = sprintf( \'%1$s<a%2$s>%3$s%4$s%5$s</a>%6$s\',
            $args->before,
            $attributes,
            $args->link_before,
            apply_filters( \'the_title\', $item->title, $item->ID ),
            $args->link_after,
            $args->after
        );
        $output .= apply_filters( \'walker_nav_menu_start_el\', $item_output, $item, $depth, $args );
    }
}
注意构造函数,然后调用菜单时:

\'container_class\' => \'nav-primary\',
\'walker\' => new Your_Walker_Nav_Menu(\'nav-primary\')

SO网友:550

到目前为止,我已经尝试从nav模板中提取值。

https://github.com/WordPress/WordPress/blob/master/wp-includes/nav-menu-template.php.

我知道这与$class = $args->container_class ? \' class="\' . esc_attr( $args->container_class ) . \'"\' : \' class="menu-\'. $menu->slug .\'-container"\'; on line 353.

该值在请求时返回null。其思想是将值作为类名的一部分循环输出。因为我只需要返回名称本身。

\'primary-menu__item\'
将成为

$container_class . \'-menu__item

相关推荐

WordPress中声明SplitMenuWalker::Walk($Elements,$max_Depth)时出现警告

我开始在WordPress网站上收到以下错误:警告:SplitMenuWalker::walk($elements,$max\\u depth)的声明应与/home/relati67/public\\u html/wp content/themes/mentis/inc/mega menu/split menu中的walk::walk($elements,$max\\u depth,$args)兼容。php第0行我不知道在这里该怎么办。我发现了一个具有类似内容的线程,但错误指向特定行(不是第0行),并且不