wordpress登陆前登陆后显示不同的顶部菜单

在WordPress中让"未登录"和"已登录"用户看到不同的顶部菜单,最干净、最安全、最可维护的做法是:

在同一个菜单位置(themelocation)里,根据is_user_logged_in()动态切换菜单。

下面给出三种常见实现方式,按推荐程度排序。任选其一即可,不要混用。

方案一:在主题或子主题里用filter切换(推荐)

为你的顶部菜单在主题里注册一个菜单位置(如果还没注册):

复制代码
// functions.php
add_action( 'after_setup_theme', function () {
    register_nav_menus( [
        'primary' => __( '顶部菜单', 'your-textdomain' ),
    ] );
} );

用wp_nav_menu_args过滤器在渲染前判断是否登录,并替换菜单:

复制代码
// functions.php
add_filter( 'wp_nav_menu_args', function ( $args ) {

    // 只针对前端、只针对我们关心的菜单位置
    if ( ! is_admin() && 'primary' === $args['theme_location'] ) {
        // 未登录时显示哪个菜单
        $guest_menu = get_term_by( 'slug', 'guest-menu', 'nav_menu' ); // 也可以用 id
        // 已登录时显示哪个菜单
        $user_menu  = get_term_by( 'slug', 'user-menu',  'nav_menu' );

        if ( ! is_user_logged_in() && $guest_menu ) {
            $args['menu'] = $guest_menu->term_id;
        } elseif ( is_user_logged_in() && $user_menu ) {
            $args['menu'] = $user_menu->term_id;
        }
    }

    return $args;
} );

在后台"外观→菜单"里分别建好两个菜单,并记录它们的别名(slug)或ID,对应到上面的guest_menu、user_menu即可。

注意:这两个菜单都不要勾选任何菜单位置,完全由代码接管。

模板里照常调用:

复制代码
wp_nav_menu( [ 'theme_location' => 'primary' ] );

优点

不依赖插件,逻辑集中,可版本控制。

菜单本身仍由WordPress管理,客户日后改菜单不用改代码。

方案二:用同一个菜单+条件标签隐藏/显示条目

如果你两个菜单80%都一样,只是个别条目不同,可以只建一个菜单,然后:

在"外观→菜单"给需要隐藏的条目加CSS类:

未登录条目加hide-logged-in,已登录条目加hide-logged-out。

在主题额外输出一段CSS:

复制代码
add_action( 'wp_head', function () {
    if ( is_user_logged_in() ) {
        echo '<style>.hide-logged-in{display:none!important}</style>';
    } else {
        echo '<style>.hide-logged-out{display:none!important}</style>';
    }
} );

优点:只有一个菜单,维护简单。

缺点:条目其实仍在HTML里,只是display:none,安全性/SEO略差。

方案三:用插件(不想写代码时)

"ConditionalMenus"

"UserMenus"

安装后可在菜单位置里给不同角色/登录状态指派不同菜单。

缺点:多一个插件,代码控制权低。

常见坑

缓存插件/全页缓存

如果站点启用了全页缓存(WPSuperCache、WPRocket、CloudflareAPO等),需要把登录cookie设为不缓存或者缓存分用户组,否则访客会相互看到对方的菜单。

WPRocket:开启"为登录用户单独缓存"。

Cloudflare:用BypassCacheonCookie规则匹配wordpress_logged_in_*。

使用了页面构建器(Elementor、Bricks等)

这些构建器往往用自己的Nav组件,需要在其设置里找"Visibility"或"DisplayCondition",把上述条件标签is_user_logged_in()填进去即可。

一句话总结

最推荐方案一:注册一个菜单位置,用wp_nav_menu_args过滤器根据is_user_logged_in()把$args['menu']换成不同的菜单ID。

原文

http://www.dulizhan.bj.cn/wordpress/239.html

相关推荐
syjy28 小时前
(含下载)BeTheme WordPress主题使用教程
前端·wordpress·wordpress建站
He19550115 小时前
Elementor 自定义块开发
wordpress·elementor·elementor块开发
He1955012 天前
wordpress搭建块
开发语言·wordpress·古腾堡·wordpress块
WordPress学习笔记3 天前
wordpress独立站主题
wordpress·wordpress主题
WordPress学习笔记4 天前
三级产品分类折叠展示wordpress外贸主题
wordpress
syjy24 天前
(含下载)Slider Revolution WordPress插件使用教程
wordpress·wordpress插件
2601_954023665 天前
Review and Installation Guide: Meminz - Download Software Landing Page Theme
数据库·seo·wordpress·gpl
2601_954023666 天前
Architecting for Tomorrow: The 2025 High-Performance Stack for Agencies
java·前端·python·seo·wordpress·gpl
WordPress学习笔记6 天前
建外贸独立站公司
前端·wordpress
syjy27 天前
(含下载)WP Mail SMTP Pro WordPress插件使用教程
运维·服务器·wordpress·wordpress插件