WordPress设置登陆用户和未登陆用户显示不同菜单

日期: 标签:WordPress教程
如需帮忙改代码,或者WordPress二次开发、PHP网站建设等需求,可联系我购买付费服务:  点此联系我
文章目录

目前大多数WordPress主题都支持在后台 - 外观 - 菜单中设置网站的菜单,而且可以创建多个菜单,给各个菜单单独设置菜单项。

目前有这样的需求:网站头部有一个导航菜单,想在这个位置给登录和未登录用户分别显示不同的菜单项,该如何实现呢?WordPress给我们提供了wp_nav_menu_args这个filter,可以在菜单显示之前更改wp_nav_menu函数的参数。具体我们可以这样实现:

1、创建两个菜单

先进入WordPress后台 - 外观 - 菜单中, 创建两个菜单,菜单名称分别设置成:已登录未登录,并给这两个菜单分配不同的菜单项。

不懂设置的,可以参考视频教程:WordPress创建菜单

2、确定菜单位置名称

开始下一步前,我们需要知道菜单位置名称,也就是theme_location参数的值,用文本编辑器打开当前主题目录中的header.php,搜索wp_nav_menu一般都能找到这个值,代码一般长这样:

// theme_location后面的 top 就是我们要找的值
wp_nav_menu( array( 'theme_location' => 'top', 'menu_id' => 'top-menu') );

如果你实在不懂代码,具体可以看视频教程提供的简便方法:确定菜单位置名称

3、添加执行代码

最后,在当前主题的functions.php添加以下代码即可:

function ludou_nav_menu_args($args = '') {
   // 下面的top改成第2步获取到的菜单位置名称
   if ($args['theme_location'] == 'top') {
      if (is_user_logged_in()) {
         $args['menu'] = '已登录';
      }
      else {
         $args['menu'] = '未登录';
      }
   }
   
   return $args;
}

add_filter('wp_nav_menu_args', 'ludou_nav_menu_args');

-- 完 --

本文采用 「CC BY-NC-SA 4.0」创作共享协议,转载请标注以下信息:
原文出处:露兜即刻 https://www.ludou.org/wordpress-show-different-menu-for-logged-in-users-and-users-not-logged-in.html
露兜
kaapass@outlook.com  QQ 825533758

业余编程爱好者。

33 条留言

点此留言
  1. 代理记账

    不错的方法的了,值得顶一下。。。。

  2. 上海网站建设

    不错的了,值得顶一下了。。

  3. 龙笑天 龙笑天

    都是通过 is_user_logged_in() 来硬判断的~~

    • 露兜

      @龙笑天 有什么可以软判断?

      • 龙笑天 龙笑天

        @露兜 额,好像也只能这个函数~

    • 云落 云落

      @龙笑天 啥叫软的???

      • 龙笑天 龙笑天

        @云落 没有软的,只有这个硬的~

  4. 门前清风

    博主你好:想请问一下文中你贴的代码是用什么插件生成的?

  5. 博主你好

    求你10年写的wordpress 博客主页随机文章的 4.8版本更新版 ,10年那个我用了不行!!谢谢你了
    我的邮箱在上面

  6. 我爱贝 我爱贝

    这个功能对于不少的站点还是很实用的,简单修改一下就有了新功能。非常不错的教程。

  7. 小飞侠

    请教大神,我想让我的wordpress博客,在关闭首页时打开另外一个网站,怎么实现啊?和退弹意思差不多,只限关闭首页时,关闭内页不打开新网址

  8. afr

    感谢露兜大大,我也想问一个关于菜单的问题
    我在wordpress大学里面看到一篇获取24小时内发布文章数量的文章
    下面是链接
    https://www.wpdaxue.com/count-posts-or-custom-post-types-from-last-24-hours-or-from-today.html
    我想将这个发布文章的数量显示在导航菜单中,应该如何实现呢?
    感谢!

  9. hootown

    站长,我测试了你的这个代码,没有生效。没反应。

    • 露兜

      @hootown 检查一下菜单名称和菜单位置是否正确

  10. 迷路7

    学习了!

  11. Shawn Shawn

    露兜哥您好,首先感谢下您的教程,通过您的教程我一个不会PHP的人也写了一款主题~另外想请教下,我想实现个记录登录时间的功能,网上的代码是这样的
    // 记录登录时间
    function user_last_login($user_login) {
    global $user_ID;
    $user = get_user_by( 'login', $user_login );
    update_user_meta($user->ID, 'last_login', date('Y-m-d H:i:s'));
    }
    add_action('wp_login','user_last_login');
    这个只有在每次登录的时候会记录时间,有的时候WP是默认登陆的,这种情况如何解决呢?

    • 露兜

      @Shawn 记录登陆信息后,登陆信息是保存到浏览器的cookie中的,WordPress会直接读取浏览器cookie来判断用户是否登陆。这种情况并不经过WordPress后台处理,所以记住登陆状态的情况下,你没法判断用户的哪次操作是登陆的。可以提供两种思路:1、禁止用户记住登陆信息,关闭浏览器后再次打开需要重新登陆;2、用户每打开一个页面就记录一下时间,最近一次打开页面的时间可以当作他登陆的时间。

      • Shawn Shawn

        @露兜 好的,非常感谢!我感觉我需要的就是第二种思路!再次感谢!(~o ̄3 ̄)~

      • 龙笑天 龙笑天

        @露兜 第二种不错~

    • w候人兮猗 w候人兮猗

      @Shawn 嗨!好巧,在这个网站能学到很多关于wordpress的知识,真的很不错

  12. 德林

    露兜兄,我刚开始学习,读你的教程很有长进。
    选了个主题是storefront。一步一步模仿你的教程。
    这个主题只有三个菜单位置:1)Primary Menu 2) Secondary Menu 3) Handheld Menu 可以替换“top”;而且“已登录”和“未登录”不能挤在同一个菜单位置。
    比如说:“已登录”占据了Primary Menu菜单位置 ,那么“未登录”只能占据空白菜单位置或者 Secondary Menu菜单位置 和Handheld Menu 菜单位置,于是按照教程,用”Primary Menu “替换“top”以后,无法显示“未登录”菜单。
    请教该怎么做?

    • 露兜

      @德林 不需要在后台指定 已登录未登录 给Primary Menu,程序会根据登陆状态自动自定。
      只需要替换代码中的两处top为Primary Menu即可,另外请确保第2步中,theme_location值的正确性!

      • 德林

        @露兜 回复的真快。赞美你的勤劳!

  13. 德林

    摁错键盘发表了。
    还是不能,太晚了没敢惊扰你。
    但你给了我方法,继续折腾,实在绕不过再麻烦你。谢谢!

  14. 初夏 初夏

    好复杂 新手表示看不懂

  15. h3cse h3cse

    对于我这样的新手,很有指导意义

  16. SKY8G SKY8G

    学习了,不错,对于新手不错的学习

  17. ppsb1066

    不错实现了

  18. 蛛蛛

    很细致

  19. 德林

    又碰到问题
    描述:规定全厂职工用户名六位字符串,前二位是车间类别,要求不同车间的职工使用不同的菜单。
    比如:
    用户名为‘hf0278’的职工登录时,只能显示“后方车间”的专用菜单‘hfmenu’;
    用户名为‘jd3047’的职工登录时,只能显示“机动车间”的专用菜单‘jdmenu’;

    判断
    if ($args['theme_location'] == 'primary') {
    if (is_user_logged_in()) {
    if (substr($current_user->user_login,0,2)=='jd'{//判断机动车间
    $args['menu'] = 'jdmenu';
    }
    }
    else {
    $args['menu'] = 'mymenu';
    }
    }
    报错:The site is experiencing technical difficulties.
    (hfmenu’、 'jdmenu'和 'mymenu'都已经事先设置完毕)

  20. Muze Muze

    这个方法的确不错,但我这里有一个更简单的办法,直接加代码就行了,不需要查看菜单位置名称。
    https://www.npc.ink/6799.html

发表留言