贝壳之家

WordPress 对搜索引擎隐藏特定的文章

评分 8, 满分 10 分 (12 票)
Loading...
文章目录

以下是 jeff网友的留言 所描述的具体需求内容:

这个问题的来源是这样的:

众所周知,随着搜索引擎的改良,会越来越排斥采集和伪原创,尤其是百度还推出了起源算法,对采集站进行K站等措施。如果被贴上采集站的标签,所有的努力可能付诸东流。

相信很多站长,也想多一些原创内容,并不想全部靠采集别人的文章。然而一个新站,尤其是个人站长,其内容的充实速度一定很慢,我们做站不仅要讨好搜索引擎,更要讨好读者。如果读者不能在你的站内得到比较充实丰富的信息,那体验肯定不好。其实各大名站老站,一样有相当比例的采集或改编内容,这符合互联网的共享精神。各大电视台和报纸也大部分是转载和文摘,只要摘得好符合了特定需求的内容需要,就是有价值的。

关键在于:不要用采集的文章来为自己的网站骗取搜索流量。这应该是符合互联网道德规范和共识的。如果只让原创的内容参与搜索引擎的游戏规则,而非原创部分屏蔽搜索引擎。这样就能平称地满足搜索引擎、网站主、用户三者的利益。

于是问题归结于一点:如何有效地、可靠地让“部分文章屏蔽搜索引擎”?

我不知道这是不是一个比较共性的问题,如果一个网站,既希望通过丰富的文章来满足受众,但又怕被搜索引擎判断为采集站,那这个就是一个真真切切要面对的、关键的、核心的、关系到网站生存发展的大问题。

最近也一直在学习相关方面的知识,以个人浅见,屏蔽搜索引擎有几类方式:
一、用robots.txt
二、WP的站可以判断用户特征(看了你这篇博文后想到的)
三、通过JS封装链接
四、通过重定向,比如短链接、PHP后台重定向等

对比以上几种方式,
第一种方法:robots.txt好比在门上贴了封条:“嘿,蛛蛛,我这儿有些内容是不让你检索的”。这是所谓君子协定,搜索引擎一定有能力去看你贴着封条门内的东西,只是它不收录罢了。为了判断一个站是否有大量的采集内容,蛛蛛或许会有窥探的动机。

这种方法技术实现的成本最低,也应该能满足大多数情况。好象百度在这方面的操守还是可以放心的,比如不索引淘宝的内容,而且也很痛恨360对百度内容的索引。

这个方法进一步的问题是:
在WP建的站中,如何可以高效率地让“部分文章屏蔽搜索引擎”?
1、文章标题加特征:比如每篇文章的标题中加一个特殊字符,这个方法可行吗,robots.txt用disallow:*特殊字条*就可以吗?
2、文章的标签识别:这个在操作层面好象是最最方便的,可是标签似乎是动态的标记,无法在robotx.txt中筛选?
3、文章放进特定的目录:这个robots.txt比较好写的,然而在WP文章内容管理时如何简易地操作?

第二种方法:好比是查看进门者的身份证,如果访问者是搜索引擎,那么就禁止通行。这种方法是对WP专用的,然后它的好处是可以非常详细地区别对待,比如百度对采集的态度比较紧,而GOOGLE不太一样,那有些文章就可以对百度关门而对谷歌开门。另外一个比较大的优点是,可以把判断集成在WP环境中,比如通过插件或主题让操作自动化。

第三种方法:好比是在门上换了一个门牌,搜索引擎只知道机械地去跟踪门牌上的号码,而浏览器却通过JS把门牌指向到另一个正确的入口了。然而:搜索引擎对JS的分析能力可能越来越强了,而且从谷歌的某些声明中来看,搜索引擎也不太喜欢你的内容对人和搜索引擎不一样。
这个方法大量地用在淘宝客链接的隐藏方面,这个方法的有效期估计不太长,而且操作比较麻烦,比较适合静态的单独页面,不太适合WP这样的数据库组织文章的架构。

第四种方法:好比是给门牌号加了密,只有你敲门(点击)了,才给你换成正确的门牌号。一般的访问者一定会点击,而搜索引擎不会模拟点击这个动作。
这种方法相对彻底和“安全”,缺点是:
1、和第三方法一样操作有些复杂,适合静态的单独页面,或页面中局部的链接,不太适合WP的环境。
2、过多的重定向,应该会消耗服务器的运算资源,积少成多,如果大量的文章都要进行一次重定向,服务器可能会不堪重负。

实现代码

具体怎么实现WordPress 对搜索引擎隐藏特定的文章呢?废话不多说,直接上PHP代码,放到当前主题的functions.php中即可使用(用UTF-8编码另存为):

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
// 需要说明的是,如果你的WordPress站点开启了页面缓存,此功能无效

function ludouse_add_custom_box() {
  if (function_exists('add_meta_box')) {    
    add_meta_box('ludou_allow_se', '搜索引擎', 'ludou_allow_se', 'post', 'side', 'low');
    add_meta_box('ludou_allow_se', '搜索引擎', 'ludou_allow_se', 'page', 'side', 'low');
  }
}
add_action('add_meta_boxes', 'ludouse_add_custom_box');

function ludou_allow_se() {
  global $post;
 
  //添加验证字段
  wp_nonce_field('ludou_allow_se', 'ludou_allow_se_nonce');
 
  $meta_value = get_post_meta($post->ID, 'ludou_allow_se', true);
  if($meta_value)
    echo '<input name="ludou-allow-se" type="checkbox" checked="checked" value="1" /> 屏蔽搜索引擎';
  else
    echo '<input name="ludou-allow-se" type="checkbox" value="1" /> 屏蔽搜索引擎';
}

// 保存选项设置
function ludouse_save_postdata($post_id) {
  // 验证
  if ( !isset( $_POST['ludou_allow_se_nonce']))
    return $post_id;

  $nonce = $_POST['ludou_allow_se_nonce'];

  // 验证字段是否合法
  if (!wp_verify_nonce( $nonce, 'ludou_allow_se'))
    return $post_id;

  // 判断是否自动保存
  if (defined('DOING_AUTOSAVE') && DOING_AUTOSAVE)
      return $post_id;

  // 验证用户权限
  if ('page' == $_POST['post_type']) {
    if ( !current_user_can('edit_page', $post_id))
      return $post_id;
  }
  else {
    if (!current_user_can('edit_post', $post_id))
      return $post_id;
  }
 
  // 更新设置
  if(!empty($_POST['ludou-allow-se']))
    update_post_meta($post_id, 'ludou_allow_se', '1');
  else
    update_post_meta($post_id, 'ludou_allow_se', '0');
}
add_action('save_post', 'ludouse_save_postdata');

// 对于设置不允许抓取文章和页面
// 禁止搜索引擎抓取,返回404
function do_ludou_allow_se() {
  // 本功能只对文章和页面有效
  if(is_singular()) {
    global $post;
    $is_robots = 0;
    $ludou_allow_se = get_post_meta($post->ID, 'ludou_allow_se', true);

    if(!empty($ludou_allow_se)) {
      // 下面是爬虫Agent判断关键字数组
      // 有点简单,自己优化一下吧
      $bots = array(
            'spider',
            'bot',
            'crawl',
            'Slurp',
            'yahoo-blogs',
            'Yandex',
            'Yeti',
            'blogsearch',
            'ia_archive',
            'Google',
            'baidu'
            );
   
      $useragent = $_SERVER['HTTP_USER_AGENT'];
   
      if(!empty($useragent)) {
        foreach ($bots as $lookfor) {
          if (stristr($useragent, $lookfor) !== false) {
            $is_robots = 1;
            break;
          }
        }
      }

      // 如果当前文章/页面禁止搜索引擎抓取,返回404
      // 当然你可以改成403
      if($is_robots) {
        status_header(404);
        exit;
      }
    }
  }
}
add_action('wp', 'do_ludou_allow_se');

使用方法

成功添加以上代码到当前主题的functions.php后,我们就可以正常使用了,完全傻瓜式。在WordPress后台文章和页面的编辑页面,右边栏底部我们可以看到这样的选框:

如果当前文章/页面需要禁止搜索引擎抓取,勾选即可。勾选后,当此文章/页面被搜索引擎访问时就会返回404状态,无任何内容。如果你不喜欢给搜索引擎返回404,担心死链太多影响SEO,可以将代码中的:

1
2
status_header(404);
exit;

改成:

1
echo "<meta name="robots" content="noindex,noarchive" />\n";

再将:

1
add_action('wp', 'do_ludou_allow_se');

改成:

1
add_action('wp_head', 'do_ludou_allow_se');

这样就直接在网页的head部分添加meta声明:

1
<meta name="robots" content="noindex,noarchive" />

告诉搜索引擎不要索引本页面、不要显示快照。需要注意的是,你的主题目录下的header.php中必须有以下代码:

1
wp_head();
露兜
ourwindow@163.com

业余编程爱好者。

标签: WordPress
我要提问

53 条评论

点此留言
  1. 噜噜别跑

    老公,加油!!

  2. nero

    如果是目录下的静态页能不能用robots来禁止爬取呢?

    • Ludou

      @nero 具体搜索学习robots.txt的相关使用教程:
      http://zh.wikipedia.org/wiki/Robots.txt
      http://baike.baidu.com/view/9274458.htm

  3. jeff

    太厉害了!膜拜一下。
    啥时候也能学会这些就好了。
    先在自己网站里用起来,学习研究。
    多谢了!

  4. romfuns.com

    用这个会不会影响流量?屏蔽了,怎么搜出来我们的网站?

  5. 布八网

    博主你网站用了别人提供的插件没还是自己写的?

  6. 百哇商城

    有一个问题请教:增加的这个选项,存储到数据库了吗?我看了很久,或者功力不够,没看出来。

  7. 秋鸿冬雪

    写的不错。

  8. donghaichen

    wordpress博客首页显示置顶文章,但是控制不改变第一页文章数量

    比如设置了每页显示十篇文章,如果有置顶文章的话首页就显示十一骗文章了,第二页和之后的还是显示十篇 问题怎么才能让首页置顶文章和正常顺序的文章加起来一共十篇,

    换个简单的说法就是怎么才能让wordpress不会因为置顶文章而改变每页文章数

    希望能帮我解答,谢谢,发邮件和回复平路都可以噢,万分感谢,好人一生平安

  9. PC丶爱好者

    果断mark一下~~~

  10. 麦田一根葱

    牛 收藏一下

  11. WordPress主题

    太给力了。

  12. 心理软件

    很好的思路

  13. mushu

    这样做不好吧,如果返回404的话,搜索引擎会觉得你网站上很多链接都是无效的,那么更加影响权重。希望有解决办法。

    • Ludou

      @mushu 那你觉得怎样才好?

      • mushu

        @Ludou 可以不返回404,如果说识别是蜘蛛的话,可不可以include或者301重定向到网站另外一个页面,比如网站地图、关于作者之类的。这样从seo角度来说是比较友好的!

        • Ludou

          @mushu 想想还是在网页head中加入<meta name="robots" content="noindex,noarchive" />比较好

          • mushu

            @Ludou Good idea!

          • Ludou

            @mushu 代码已更新

  14. mushu

    博主的代码高亮用的什么插件?推荐一下呗!

  15. 斌果

    大大,PHP有没有办法可以获取一个函数每次调用所传递的参数?
    比如一个函数a($var)
    它被反复调用,我能不能一下在一个地方获取所有 $var 的值呢?

  16. 周良

    你好,请问我可否转载一下这篇文章?我觉得蛮有用的

  17. 分享好东西

    这代码的确不错~!

  18. ithomer

    好东西,值得分享,赞!

  19. 优享库

    很好,至少不需要使用插件了

  20. 薄荷美女

    这个代码很实用,有些情况下不需要向搜索引擎展示的内容就直接勾一个选项就行了,赞!

  21. ghost

    用了之后报错
    Parse error: syntax error, unexpected T_FUNCTION in /home/u75vq6auj7k5nv2q26/wwwroot/wp-includes/functions.php on line 110
    刚建站的小白实在弄不来…

  22. ghost

    重新折腾了一遍,现在在
    add_action("wp_head", function(){echo "<meta name=\"robots\" content=\"noindex,noarchive\" />\n";}, 10);
    报错,提示T_FUNCTTON

    • 露兜

      @ghost 文中代码已更新

      • ghost

        @露兜 然而网页的head里面依然没有变化是什么情况…

        • 露兜

          @ghost 估计的主题存在缺陷,header.php中没有添加wp_head(),具体添加方法:
          http://www.ludou.org/create-wordpress-themes-header.html#title-5

          • ghost

            @露兜 用的是自带的twentyfourteen主题,经查header.php中已经有<?php wp_head(); ?>这一行代码……

          • 露兜

            @ghost 文中的代码行数描述有误,是可以将代码中58至104行替换成:
            function ludou_add_robots() {

  23. Kelvin

    Hi,
    我添加你这个代码到function.php,前端所有页面都会出现<meta name="robots" content="noindex,noarchive" />,检查了下代码没拷贝错

    • 露兜

      @Kelvin 文中内容已经更新,最后一部分修改的代码有误。

  24. 张力博客

    博主,谢谢你的代码,拿这用来,但是发现一个问题,反馈给博主!
    在代码97行
    if($is_robots) {
    status_header(404);
    exit;
    }
    应该改成
    if($is_robots = 1) {
    status_header(404);
    exit;
    }
    因为上面做出了判断$is_robots = 0 时,不显示,当$is_robots = 1 时,才屏蔽蜘蛛抓取,显示下面的代码!

    • 露兜

      @张力博客 你这样修改的代码是错误的,= 是赋值运算符,并不是数学意义上的等号,在php中如果要判断等于,请用 ==
      另外,if($is_robots)已经实现了$is_robots为0时不执行,$is_robots为非0时执行括号中的代码。
      请翻阅PHP编程的相关基础知识。

      • 张力博客

        @露兜 但博主,我确实按你说的操作了,也加入了wp-head,但是前台始终不显示meta信息!

        • 露兜

          @张力博客 如果你用的是 if($is_robots = 1),它永远都会显示meta信息,不管是搜索引擎访问,还是正常的人类访问。
          之所以不显示,那是因为你用的是浏览器访问,代码判断你不是搜素引擎,当然不会显示meta。文中代码的设定是:当搜索引擎访问时才会显示meta

          如果你想测试一下效果,请将if($is_robots)改成if(!$is_robots),即可实现相反的效果,正常的人类访问会显示meta,搜索引擎访问不显示meta

          • 张力博客

            @露兜 刚去测试了一下,确实是这样,非常感谢博主的分享,自己也得去恶补一下php的知识了,o(∩_∩)o 哈哈!

  25. 张力博客

    原来是这样啊,搜索引擎访问时是加入meta信息的,当浏览器访问,查看代码时是不显示的,是这样吧!

发表评论

评分 8, 满分 10 分 (12 票)
Loading...