如何在 Wordpress 导航栏中将 class 添加到最后 <li>?

How to add class to last <li> in Wordpress navigation bar?

所以我在wordpress中使用了一个自定义的navwalker,如下图:

function start_el(&$output, $item, $depth = 0, $args = null, $id = 0)
    {
        $title = $item->title;
        $permalink = $item->url;

        $output .= "<li>";
        $output .= "<a href='$permalink'>$title</a>";
        }
    }

我只需要将 class .button 添加到列表中的最后一个 <li>。像这样:

if (not the last class) {
    $output .= "<li>";
    $output .= "<a href='$permalink'>$title</a>";
} else {
    $output .= "<li class = 'button'>";
    $output .= "<a href='$permalink'>$title</a>";
}

有人有简单的方法来完成这个吗?我不能只在 wp admin 中添加 class 因为自定义 navwalker 会覆盖它,而且当我确定有一些非常优雅的方法可以解决这个问题时,我真的不想使用一些 hacky 解决方案。 提前致谢!

在我回答您原来的问题之前,您的示例函数中缺少一些可以提供帮助的内容。 $item 变量有一个名为 classes 的 属性,它包含元素的 classes 数组。这应该包括用户在管理员菜单生成器中输入的任何 classes(这解决了您提到的问题之一,但不是原始问题)。

首先,我们需要添加这样的东西

function start_el(&$output, $item, $depth = 0, $args = null, $id = 0)
    {
        $title = $item->title;
        $permalink = $item->url;
        $classes = implode(" ", $item->classes);

        $output .= “<li classes=‘$classes’>”;
        $output .= "<a href='$permalink'>$title</a>";
        }
    }

现在您已经添加了缺失的 classes,您可以通过编程方式将 class 添加到元素,而不是让用户在管理员中使用过滤器来添加。这可能会在您的 functions.php 文件中的某个地方。

function custom_nav_classes ($items) {
    $items[count($items) - 1]->classes[] = 'last';
    return $items;
}
add_filter('wp_nav_menu_objects', 'wpb_first_and_last_menu_class');

为了解释,我们添加了一个 WP 过滤器,当准备呈现导航菜单时将调用它。使用的过滤器适用于所有菜单对象,因此我们将收到的参数是所有菜单项的数组。 我们使用 count 来获取数组的长度,然后减去一个,因为数组从 0 开始。这就是我们找到最后一项的方式。 然后我们使用 classes[] 将新的 class 附加到 classes 属性 (PHP shorthand 用于附加到数组)。

旁注您可能已经这样做了,但在这种情况下问问自己是否需要此 class 或者是否可以使用 CSS/JavaScript 选择器来完成你需要的。我不知道你的用例,但只是一些值得思考的东西。例如 ul.menu > li:last-child 或类似的东西可能会有用。 从技术上讲,这不是答案的一部分,只是值得一提的东西。