WordPress设置文章只允许特定用户阅读

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

现在WordPress已经不仅仅是一个博客了,更多时候很多人都把WordPress当功能强大的CMS使了,WordPress之所以越来越受欢迎,主要在于它强大的扩展性以及良好的社区支持,看看我博客里的WordPress教程就知道了。今天,我将给你介绍一个新的WordPress扩展功能,文章只允许特定用户阅读。如果你不喜欢此功能,可以忽略以下内容!

WordPress本身也提供了相应功能来实现这个目的,包括文章私有和文章加密等,但是这些功能都比较大一,如何限定授权用户和文章的范围呢?本文将给你介绍这方面的内容。

WordPress设置文章只允许特定用户阅读

某个分类/标签的文章只允许登陆用户阅读

网站的访客最基本的可以分成两类,一类是非注册用户,另一类是登陆用户,很多论坛的就是这样区分用户,部分内容只能登陆后查看,之前我写了一个插件Login to view all来让WordPress来实现类似功能,但是只能对单篇文章起作用,如果想要实现某个分类/标签的文章只允许登陆用户阅读,可以用文本编辑器打开当前主题目录下的single.php,查找:the_content,可以找到类似代码:the_content(...),(注:...表示未知内容,不同主题不太一样),将其改成:

/**
 * 名称:WordPress某个分类/标签的文章只允许登陆用户阅读
 * 作者:露兜
 * 博客:https://www.ludou.org/
 * 最后修改:2010年12月30日
 */

if( in_category( array( 'music', 'news' ) ) ) {
    if(is_user_logged_in())
        // 注意把下面的...改成你的主题中代码,不要照抄
        the_content(...);
    else
        echo '请登陆后阅读本文!';
}
else {
    // 注意把下面的...改成你的主题中代码,不要照抄
    the_content(...);
}

这样分类别名或名称为 music 和 post 的分类下的文章内容就只对登陆用户开放了,游客将会看到提示"请登陆后阅读本文!",如果你想再添加一个分类images,可以将 array( 'music', 'post' ) 改成 array( 'music', 'post', 'images' ),更多依次类推;如果只限定一个分类music可以写成 in_category( 'music' ) 。如果是限定含有某些标签的文章只对登陆用户开放,可以将以上代码第 8 行改成:

if( has_tag( array( 'music', 'news' ) ) ) {

music和news为标签的名称或别名,多个标签的写法跟分类相同!



某个分类/标签的文章只允许特定角色的注册用户阅读

WordPress站点的注册用户还可以分三六九等,包括订阅者、投稿者、管理员等等,对于已经登陆的注册用户,同样可以根据用户的角色来决定是否有权阅读文章,在第一部分内容的基础上再加个限制条件就可以了,将第一部分代码的第 9 行改成:

/**
 * 名称:WordPress某个分类/标签的文章只允许特定角色的注册用户阅读
 * 作者:露兜
 * 博客:https://www.ludou.org/
 * 最后修改:2010年12月30日
 */

    global $current_user;
    get_currentuserinfo();
	
    if(is_user_logged_in() && $current_user->user_level > 3)

这样等级小于 3 的注册用户将无权阅读分类music和news下的文章,文章标签的限定类似,详见第一部分的说明。WordPress注册用户的等级参见以下说明:

  • 0 级对应 订阅者
  • 1 级对应 投稿者
  • 2 – 4 级对应 作者
  • 5 – 7 级对应 编辑
  • 8 – 10 级对应 管理员

某个分类/标签的文章只允许知道密码的用户阅读

如果你想给某个分类或标签下的文章全部添加密码,只有知道密码的用户才能阅读这些文章,你可以使用我写的WordPress插件:Post Encryption And Decryption,或者看这篇教程操作:WordPress加密某个分类的所有文章

搜索引擎收录说明

按照以上各方法修改后,搜索引擎将无法收录这些文章,如果你希望搜索引擎收录这些文章同时又限定用户范围,可以再添加一个限定条件,将第一部分代码的第 9 行改成:

function is_se() {
   $u_agent = $_SERVER['HTTP_USER_AGENT'];
   $spiders = '/(spider|bot|slurp|Mediapartners|crawl)/i';
	
   if ( preg_match($spiders, $u_agent) )
      return 1;
   else
      return 0;
}
	
if(is_user_logged_in() || is_se())

限制标签、用户等级等的修改方式一样!另外,如果你的Feed是全文输出的话,其他用户还是可以通过订阅看到相关的内容的!最后一点,以上所做的修改不是完全隐藏文章,所有用户都可以看到文章的标题,如果你想让未授权的用户连标题都看不到,请自行解决,或者可以参考下文:WordPress技巧: 对游客隐藏部分文章

回复或登录可见

如果你想隐藏文章的部分内容(如猜谜游戏的谜底),让读者登录后才可查看隐藏的内容,可以使用这款插件:Login to view all。如果你是想让读者回复后才可以阅读隐藏的内容,可以用这款插件:Easy2hide

-- 完 --

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

业余编程爱好者。

87 条留言

点此留言
1 2 180
  1. doo

    你好,这个代码很好用,非常感谢!

    还有个小问题请教,就是在文章里的开头有图片,想让文章显示那个图片而不是隐藏所有的内容怎么做?
    是不是需要做个调用? 请指教,谢谢。

  2. odmin odmin

    为什么替换后全部文章内容均为代码 ???

  3. odmin odmin

    为什么我感觉加了这段代码后页面反正明显慢了好多呢 = =

    • 番号姐姐

      @odmin 几个判断条件而已…. 这都能慢, 明显不科学呀.

  4. 番号姐姐

    第一次在前辈的网站留言.
    我使用了前辈的登录可见,评论可见,分享可见插件都非常的棒! 爱不释手.
    网站不断发展,有了新的需求.
    根据这篇文章中的介绍,我对代码进行了修改,但是和我的需求差一点点.
    我想实现限制用户角色,部分内容 可见.
    文章里的方法是所有内容都看不见了.

    求前辈指导下思路.
    或者有类似插件就更好啦.

    • 露兜

      @番号姐姐 没有类似插件。如需帮助,请提供你写的代码。

      • 番号姐姐

        @露兜 已经搞定了,我修改了您的登录可见插件中的判断条件.
        保留登录可见的功能的同时,增加了用户角色的判断.
        万分感谢露兜前辈.

        此中,发现一个问题,我修改.po文件里的文字,但是并没有起作用. 为快速看到效果,直接把.php文件中的提示信息写死了.
        另外一个.mo文件,打开全是二进制乱码.
        我要怎么修改才能起作用呢?

        • 露兜

          @番号姐姐 用poedit来修改po文件,直接修改po文件不行。

        • 哈哈哈

          @番号姐姐 @番号姐姐,
          “保留登录可见的功能的同时,增加了用户角色的判断”我也急需这样的功能。@番号姐姐@露兜能分享一下实现这个功能代码吗?

        • 哈哈哈

          @番号姐姐 我也是用了@露兜登录可见插件。

  5. odmin odmin

    T.T 大神 为什么用这个代码蜘蛛模拟时候只能搜到登陆可见啊 文章内容没有 才发现希望解答
    <!– 分类文章登陆可见 –>
    <?php
    if( in_category( array( 'mh', 'yx','dh','sjyx','zxmh' ) ) ) {

    function is_se() {
    $u_agent = $_SERVER['HTTP_USER_AGENT'];
    $spiders = '/(spider|bot|slurp|Mediapartners|crawl)/i';

    if ( preg_match($spiders, $u_agent) )
    return 1;
    else
    return 0;
    }

    if(is_user_logged_in() || is_se())

    the_content();
    else
    echo '<center><h2>请<a href="/wp-login.php">登陆</a>后阅读本文!</h2></center>';
    echo '<br><br><br><br>';
    }
    else {
    the_content();
    }

    ?>

    • 露兜

      @odmin 先看看你的模拟蜘蛛的Agent是什么,Agent中出现关键字spider|bot|slurp|Mediapartners|craw才会被判断成蜘蛛,才会显示文章内容。

    • 露兜

      @odmin 方法是打印Agent,在你的代码第一个<?php 下面添加:
      echo '我是蜘蛛:'.$_SERVER['HTTP_USER_AGENT'];

      模拟蜘蛛刷新一下页面,看是什么内容

      • odmin odmin

        @露兜 : 我是蜘蛛:Mozilla/5.0 (Macintosh; Intel Mac OS X 10.10; rv:36.0) Gecko/20100101 Firefox/36.0请登陆后阅读本文! 经典 除特别注明外,本站所有文章均为 文章抓不倒

      • odmin odmin

        @露兜 T.T 痘痘哥

        • 露兜

          @odmin 你模拟的不是蜘蛛,是普通的使用Mac的访客

          • odmin odmin

            @露兜 是这样的 我用站长工具里的蜘蛛模拟 抓取被我加入代码的页面 抓取结果是哪个 = =

  6. 风笛

    在single.php怎么找不到the_content这个代码的?

  7. rik rik

    可以实现完全对游客隐藏部分文章吗,就是让游客浏览博客时隐藏的文章完全不出现在博客列表里,而不是提示要求登入后查看。但登入后隐藏的文章会显示出来。请问怎样实现或者有这样的插件吗?

    • 露兜

      @rik https://www.ludou.org/wordpress-hide-post-for-not-login-in-user.html

  8. 木木

    大神
    自定义栏目只允许登陆用户阅读的代码可以怎么写,我是代码盲

  9. 烂番茄 烂番茄

    好文章哈哈哈。。

  10. hantianyu

    搜索引擎收录说明哪里,将第一部分代码的第 9 行改成:
    ”function is_se() {
    $u_agent = $_SERVER['HTTP_USER_AGENT'];
    $spiders = '/(spider|bot|slurp|Mediapartners|crawl)/i';

    if ( preg_match($spiders, $u_agent) )
    return 1;
    else
    return 0;
    }

    if(is_user_logged_in() || is_se())“

    第九行,到底是那段代码?不懂请教!

  11. 超级一只菠

    请问有没有办法 让一篇文章限时、限次阅读呢? 就是一个用户阅读3次之后就没有权限了 或者24小时之后就隐藏了

  12. pinkwall

    “注意把下面的…改成你的主题中代码,不要照抄 the_content(…);”这个主题代码应该写什么啊,请教一下

  13. 小样 小样

    你这个功能是怎么实现的呢?可以教我一下吗?拜托了!

  14. HD2010

    在single.php怎么找不到the_content这个代码怎么办?

    • 露兜

      @HD2010 如果找不到the_content,那么你可以查找:get_template_part,可找到类似代码:<?php get_template_part( 'content', 'page' ); ?>,将content-page.php中的所有代码替换这部分代码即可。再用代码替换<?php the_content(); ?>

1 2

发表留言