首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >WordPress动态菜单中的HTML/CSS下拉菜单

WordPress动态菜单中的HTML/CSS下拉菜单
EN

Stack Overflow用户
提问于 2021-05-23 20:28:03
回答 1查看 315关注 0票数 1

我正在将静态的HTML/CSS菜单转换成WordPress菜单,如果没有下拉菜单,没有子菜单,这对我来说很好,但是我想对代码进行更改,这样我就可以很好地工作,即使是下拉菜单,现在在我的例子中,如果我使用WordPress菜单放置下拉菜单,它会破坏网站的标题设计。

Header.php

代码语言:javascript
运行
复制
<?php wp_nav_menu(array(
                                 'menu' => 'HeaderMenu',
                                 'menu_class' => 'navbar-nav mr-auto',
                                 'container' => '',
                                 'li_class' => 'nav-item',
                                 'a_class' => 'nav-link',
                                 'active_class' =>'active' ,
                               )); ?>

Functions.php

代码语言:javascript
运行
复制
register_nav_menus(array(
   'HeaderMenu' =>  __( 'Header Menu', 'theme')
));
function add_class_li($classes, $item, $args){
   if(isset($args-> li_class)){
      $classes[] = $args->li_class;
   }
   if(isset($args-> active_class) && in_array('current-menu-item', $classes)){
      $classes[] = $args->active_class;
   }
   return $classes;
}
add_filter('nav_menu_css_class', 'add_class_li',10,3);

function add_anchor_class($attr, $item, $args){
   if(isset($args-> a_class)){
      $attr['class'] = $args->a_class;
   }return $attr;
}
add_filter('nav_menu_link_attributes', 'add_anchor_class',10,3);

HTML/CSS代码

代码语言:javascript
运行
复制
                            <ul class="navbar-nav mr-auto">
                               <li class="nav-item active">
                                <a class="nav-link" href="index.html">HOME<span class="sr-only">(current)</span></a> </li>
                               <li class="nav-item">
                                <a class="nav-link" href="about.html">ABOUT</a></li>
                               <li class="nav-item">
                                <a class="nav-link" href="service.html">SERVICES</a></li>
                               <li class="#" href="#">
                                <a class="nav-link" href="blog.html">BLOG</a></li>
                               <li class="nav-item" href="#">
                                <a class="nav-link" href="contact.html">CONTACT</a></li>
                               <li class="last"><a href="#"><img src="images/search-icon.png" alt="icon"></a></li>
                            </ul>
EN

回答 1

Stack Overflow用户

发布于 2021-05-28 10:55:26

在主题的functions.php中添加这个自定义nav类

代码语言:javascript
运行
复制
class Custom_Nav_Walker extends Walker_Nav_Menu 
{
    /**
     * @var array $menu_items
     */
    private $menu_items;

    /**
     * @var int $last_menu_id
     */
    private $last_menu_id;

    /**
     * @var int $first_menu_id
     */
    private $first_menu_id;
    
    /**
     * @inheritdoc
     */
    public function start_el( &$output, $item, $depth = 0, $args = null, $id = 0 ) {

        if( is_null( $this->menu_items ) ) {

            $this->menu_items = wp_get_nav_menu_items( $args->theme_location );

            if( $this->menu_items != false ) {
                $first_menu_index = array_key_first( $this->menu_items );
                $last_menu_index = array_key_last( $this->menu_items );
                $this->first_menu_id = $this->menu_items[ $first_menu_index ]->ID;
                $this->last_menu_id = $this->menu_items[ $last_menu_index ]->ID;
            }
        }

        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 classes applied to a menu item's list item element.
         *
         * @since 3.0.0
         * @since 4.1.0 The `$depth` parameter was added.
         *
         * @param string[] $classes Array of 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 = apply_filters( 'nav_menu_css_class', array_filter( $classes ), $item, $args, $depth );
        
        $custom_menu_class = [ 'nav-item' ];
        if( in_array( 'current-menu-item', $class_names ) ) {
            $custom_menu_class[] = 'active';
        }

        $class_names = implode( ' ',  $custom_menu_class);

        if( $item->ID == $this->last_menu_id ) {
            $class_names = ' class="last"';
        } else {
            $class_names = $class_names ? ' class="' . esc_attr( $class_names ) . '"' : '';
        }

        $output .= $indent . '<li' . $class_names . '>';

        $atts           = array();
        $atts['title']  = ! empty( $item->attr_title ) ? $item->attr_title : '';
        $atts['target'] = ! empty( $item->target ) ? $item->target : '';
        if ( '_blank' === $item->target && empty( $item->xfn ) ) {
            $atts['rel'] = 'noopener';
        } else {
            $atts['rel'] = $item->xfn;
        }
        $atts['href']         = ! empty( $item->url ) ? $item->url : '';
        $atts['aria-current'] = $item->current ? 'page' : '';
        
        

        /**
         * 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.
         *     @type string $aria_current The aria-current 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 ( is_scalar( $value ) && '' !== $value && false !== $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(  $item->ID == $this->last_menu_id ) {
            $item_output  = '<a href="#"><img src="images/search-icon.png" alt="icon"></a>';
        } else if ( $item->ID == $this->first_menu_id ) {
            $item_output  = $args->before;
            $item_output .= '<a' . $attributes . '>';
            $item_output .= $args->link_before . $title . '<span class="sr-only">(current)</span>';
            $item_output .= '</a>';
            $item_output .= $args->after;
        } else {
            $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 );
    }
}

然后通过wp_nav_menu参数将该类添加到walker中。

代码语言:javascript
运行
复制
wp_nav_menu(
    array(
        'theme_location'    => 'your theme location',
        'echo'              => true,
        'walker' => new Custom_Nav_Walker(),
        'menu_class' => 'navbar-nav mr-auto'
    )
);

另外,也不需要为菜单类添加任何额外的过滤器。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/67664050

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档