WordPress菜单非常棒。拖放界面使WordPress主题开发人员和用户都非常容易。在过去,我们向您展示了如何在WordPress添加自定义菜单以及如何设置自定义菜单的样式。菜单的可视界面限制的一件事是您只能添加链接(页面,类别或自定义链接)。如果要将自定义项添加到WordPress菜单,该怎么办?也许您想在WordPress菜单中添加搜索栏,登录/注销链接,今天的日期或其他任何内容。仅仅因为没有可视化界面,并不意味着它是不可能的。在本文中,我们将向您展示如何利用wp_nav_menu_items钩子将自定义项添加到所有或特定的WordPress菜单。

注意:本教程适用于WordPress主题开发人员,因此您需要了解基本的html / css以及对WordPress主题如何工作的公平理解。

显然,您需要在主题中启用自定义菜单,然后才能继续。

让我们从基础开始。我们需要添加您自己的过滤器wp_nav_menu_items钩。一个例子如下:

add_filter( "wp_nav_menu_items", "your_custom_menu_item", 10, 2 );
function your_custom_menu_item ( $items, $args ) {
    if (is_single() && $args->theme_location == "primary") {
        $items .= "<li>Show whatever</li>";
    }
    return $items;
}

现在如您所见,您可以将条件语句与参数theme_location一起使用。这使您可以根据需要定位特定菜单位置。如果您不想要条件语句,则不必使用它。只需将其添加到特定菜单位置,反之亦然。

现在您已经看到了一个基本示例,让我们向您展示一些如何工作的具体示例。

将登录/注销链接添加到特定的WordPress菜单

如果您想让您的用户能够登录/退出,那么您可以在自定义菜单中添加链接。下面的代码段会在菜单位置显示适当的用户登录/注销链接primary。如果需要,您可以更改菜单位置。

add_filter( "wp_nav_menu_items", "add_loginout_link", 10, 2 );
function add_loginout_link( $items, $args ) {
    if (is_user_logged_in() && $args->theme_location == "primary") {
        $items .= "<li><a href="". wp_logout_url() ."">Log Out</a></li>";
    }
    elseif (!is_user_logged_in() && $args->theme_location == "primary") {
        $items .= "<li><a href="". site_url("wp-login.php") ."">Log In</a></li>";
    }
    return $items;
}

将搜索栏添加到特定菜单

想要在特定菜单添加搜索栏?好吧,不要再看了。您可以通过粘贴以下代码段来完成此操作:

add_filter("wp_nav_menu_items","add_search_box_to_menu", 10, 2);
function add_search_box_to_menu( $items, $args ) {
    if( $args->theme_location == "primary" )
        return $items."<li class="menu-header-search"><form action="http://example.com/" id="searchform" method="get"><input type="text" name="s" id="s" placeholder="Search"></form></li>";

    return $items;
}

将今天的日期添加到特定的WordPress菜单

下面的代码段会将今天的日期添加到您的WordPress菜单中。如果需要,您可以使用我们今天的日期手册来调整代码。

add_filter("wp_nav_menu_items","add_todaysdate_in_menu", 10, 2);
function add_todaysdate_in_menu( $items, $args ) {
    if( $args->theme_location == "primary")  {
		
		$todaysdate = date("l jS F Y");
        $items .=  "<li>" . $todaysdate .  "</li>";

	}
    return $items;
}