You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用Walker类实现WordPress三级自定义菜单并指定类名与添加按钮

WordPress自定义菜单Walker实现方案

你可以通过继承WordPress原生的Walker_Nav_Menu类自定义菜单输出逻辑,完全匹配你需要的结构、class和按钮元素,具体操作如下:


步骤1:添加自定义Walker类到主题

将以下代码复制到你当前使用主题的functions.php文件中:

class Custom_Menu_Walker extends Walker_Nav_Menu {
    // 自定义各级子菜单ul标签输出
    function start_lvl(&$output, $depth = 0, $args = array()) {
        $indent = str_repeat("\t", $depth);
        if ($depth === 0) {
            // 二级菜单ul配置
            $output .= "\n$indent<ul data-spollers=\"768,max\" class=\"menu__sub-list\">\n";
        } elseif ($depth === 1) {
            // 三级菜单ul配置
            $output .= "\n$indent<ul class=\"menu__subsub-list\">\n";
        }
    }

    // 自定义各级菜单项li、链接、按钮输出
    function start_el(&$output, $item, $depth = 0, $args = array(), $id = 0) {
        $indent = $depth ? str_repeat("\t", $depth) : '';
        $li_classes = $a_classes = [];
        $button = '';

        // 按菜单深度分配对应class和按钮
        switch ($depth) {
            case 0:
                // 一级菜单配置
                $li_classes[] = 'menu__item';
                $a_classes[] = 'menu__link';
                if ($args->walker->has_children) {
                    $button = '<button type="button" class="menu__arrow _icon-menu_down"></button>';
                }
                break;
            case 1:
                // 二级菜单配置
                $li_classes[] = 'menu__sub-item';
                $a_classes[] = 'menu__sub-link';
                if ($args->walker->has_children) {
                    $button = '<button data-spoller type="button" class="menu__sub-arrow _icon-menu_left"></button>';
                }
                break;
            case 2:
                // 三级菜单配置
                $li_classes[] = 'menu__subsub-item';
                $a_classes[] = 'menu__subsub-link';
                break;
        }

        // 生成li的class属性
        $li_class = implode(' ', apply_filters('nav_menu_css_class', array_filter($li_classes), $item, $args, $depth));
        $li_attr = $li_class ? ' class="' . esc_attr($li_class) . '"' : '';

        // 生成链接的class和href属性
        $a_attr = [];
        $a_attr[] = !empty($item->url) ? ' href="' . esc_attr($item->url) . '"' : '';
        $a_class = implode(' ', apply_filters('nav_menu_link_attributes', array_filter($a_classes), $item, $args, $depth));
        $a_attr[] = $a_class ? ' class="' . esc_attr($a_class) . '"' : '';
        $a_attr = implode(' ', $a_attr);

        // 拼接最终菜单项内容
        $output .= "{$indent}<li{$li_attr}>";
        $output .= "<a{$a_attr}>" . apply_filters('the_title', $item->title, $item->ID) . "</a>";
        $output .= $button;
    }
}

步骤2:注册菜单位置(未注册的情况下需要操作)

如果还没有注册过主导航位置,同样在functions.php中添加以下代码:

function register_custom_nav() {
    register_nav_menu('primary', '站点主导航');
}
add_action('after_setup_theme', 'register_custom_nav');

添加完成后进入WordPress后台「外观-菜单」,创建你需要的菜单结构并分配到「站点主导航」位置。

步骤3:在主题中调用自定义菜单

找到主题中需要输出导航的位置(通常是header.php),替换原有菜单调用代码为以下内容:

wp_nav_menu([
    'theme_location' => 'primary', // 对应你注册的菜单位置标识
    'container' => false, // 取消外层默认的div容器
    'menu_class' => 'menu__list', // 最外层ul的class
    // 自定义最外层ul结构,添加你需要的data属性
    'items_wrap' => '<ul data-spollers="768,max" class="%2$s">%3$s</ul>',
    'walker' => new Custom_Menu_Walker(), // 调用我们自定义的Walker类
    'depth' => 3, // 最多支持3级菜单输出
]);

完成以上操作后输出的菜单结构会和你提供的示例完全一致,你已经开发完成的按钮JS逻辑可以直接复用,不需要做额外调整。

内容的提问来源于stack exchange,提问作者Dmitry Timofeev

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.05 05:09:03