如何过滤WordPress导航菜单中的子菜单类名


How to filter the sub-menu classname in WordPress navigation menus?

在WordPress中,当使用导航菜单时,二级菜单被赋予sub-menu类。例如:

<ul>
    <li>
        <a title="Page 1" href="/page-1/">Page 1</a>
        <ul class="sub-menu">
            <li>
                <a title="Sub page 1" href="/sub-page-1/">Sub page 1</a>
            </li>
            <li>
                <a title="Sub page 2" href="/sub-page-2/">Sub page 2</a>
            </li>
        </ul>
    </li>
</ul>

我使用Bootstrap 3所以需要的类名是dropdown-menu。到目前为止,我的尝试是将所有的dropdown-menu类从bootstrap.css复制到我的主题style.css中,并将它们的名称更改为sub-menu。这不是一个很好的方法,因为当我下次升级Bootstrap时,我需要检查任何东西都没有改变。

我的下一个想法是过滤类名。WordPress是否提供了一个过滤器,可以让我改变这个类名?

我在这里找到了一个walker解决方案,它可以让我改变sub-menu类。

class My_Walker_Nav_Menu extends Walker_Nav_Menu {
  function start_lvl(&$output, $depth) {
    $indent = str_repeat("'t", $depth);
    $output .= "'n$indent<ul class='"my-sub-menu'">'n";
  }
}

我直接将其粘贴到主题的functions.php中。这允许我改变类名,但我现在的问题是我得到以下PHP调试通知:

严格标准:My_Walker_Nav_Menu声明::start_lvl()应该兼容Walker_Nav_Menu::start_lvl(&$output, $depth= 0, $args = Array)在/wp-content/themes/my-theme/functions.php中第224行

我应该粘贴步行者直接到我的主题的函数。php?我哪里做错了?

你为什么不相反呢?而不是编辑CSS,编辑主题文件。你可以直接改变ul的类。

<ul class="dropdown-menu">
   ...
</ul>

如果你出于任何原因需要在ul中保留"sub-menu"类,你也可以在同一个元素中同时使用这两个类。只需将"bootstrap.css"类添加到ul中。

<ul class="sub-menu dropdown-menu">
   ...
</ul>

您需要在functions.php中包含您的walker文件,并在wp_nav_menu函数中更改为像这样调用walker…

wp_nav_menu( array(
    'menu'              => 'Main Navigation',
    'theme_location'    => 'main_navigation',
    'depth'             => 0,
    'container'         => 'div',
    'container_class'   => 'collapse navbar-collapse',
    'container_id'      => 'bs-example-navbar-collapse-1',
    'menu_class'        => 'nav navbar-nav',
    'fallback_cb'       => 'wp_bootstrap_navwalker::fallback',
    'walker'            => new wp_bootstrap_navwalker())
);