WordPress特定文章对搜索引擎隐藏或只允许搜索引擎查看


Posted in PHP onDecember 31, 2015

对搜索引擎隐藏特定的文章
这个问题的来源是这样的:

众所周知,随着搜索引擎的改良,会越来越排斥采集和伪原创,尤其是百度还推出了起源算法,对采集站进行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编码另存为):

// 需要说明的是,如果你的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后台文章和页面的编辑页面,右边栏底部我们可以看到这样的选框:

WordPress特定文章对搜索引擎隐藏或只允许搜索引擎查看

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

status_header(404);
exit;

改成:

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

再将:

add_action('wp', 'do_ludou_allow_se');

改成:

add_action('wp_head', 'do_ludou_allow_se');

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

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

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

wp_head();

设置文章只允许搜索引擎查看
有些文章只是为了SEO才发布的,想让这些文章只允许搜索引擎抓取,普通的访客无法查看,在WordPress中如何做到?

实现代码

如果你的WordPress站点未开启页面缓存,这个需求也不难实现,我们可以参考上面对搜索引擎隐藏特定的文章中的代码,稍作修改即可。在当前主题的functions.php中添加以下php代码,用UTF8编码保存:

// 给文章和页面的编辑页添加选项
function ludouseo_add_custom_box() {  
 add_meta_box('ludou_se_only', '搜索引擎专属', 'ludou_se_only', 'post', 'side', 'low');
 add_meta_box('ludou_se_only', '搜索引擎专属', 'ludou_se_only', 'page', 'side', 'low');
}
add_action('add_meta_boxes', 'ludouseo_add_custom_box');

function ludou_se_only() {
 global $post;
 
 //添加验证字段
 wp_nonce_field('ludou_se_only', 'ludou_se_only_nonce');
 
 $meta_value = get_post_meta($post->ID, 'ludou_se_only', true);
 if($meta_value)
  echo '<input name="ludou-se-only" type="checkbox" checked="checked" value="1" /> 只允许搜索引擎查看';
 else
  echo '<input name="ludou-se-only" type="checkbox" value="1" /> 只允许搜索引擎查看';
}

// 保存选项设置
function ludouseo_save_postdata($post_id) {
 // 验证
 if ( !isset( $_POST['ludou_se_only_nonce']))
  return $post_id;
 $nonce = $_POST['ludou_se_only_nonce'];
 
 // 验证字段是否合法
 if (!wp_verify_nonce( $nonce, 'ludou_se_only'))
  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-se-only']))
  update_post_meta($post_id, 'ludou_se_only', '1');
 else
  delete_post_meta($post_id, 'ludou_se_only');
}
add_action('save_post', 'ludouseo_save_postdata');

function do_ludou_se_only() {
 // 本功能只对文章和页面有效
 if(is_singular()) {
  global $post;
  $is_robots = 0;
  $ludou_se_only = get_post_meta($post->ID, 'ludou_se_only', true);
  
  if(!empty($ludou_se_only)) {
   // 下面是搜索引擎Agent判断关键字数组
   // 有点简单,自己优化一下吧
   $bots = array(
      'spider',
      'bot',
      'crawl',
      'Slurp',
      'yahoo-blogs',
      'Yandex',
      'Yeti',
      'blogsearch',
      'ia_archive',
      'Google'
      );
  
   $useragent = $_SERVER['HTTP_USER_AGENT'];
  
   if(!empty($useragent)) {
    foreach ($bots as $lookfor) {
     if (stristr($useragent, $lookfor) !== false) {
      $is_robots = 1;
      break;
     }
    }
   }
   
   // 如果不是搜索引擎,就显示错误信息
   // 已登录的用户不受影响
   if(!$is_robots && !is_user_logged_in()) {
    wp_die('您无权查看此文!');
   }
  }
 }
}
add_action('wp', 'do_ludou_se_only');

使用方法

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

WordPress特定文章对搜索引擎隐藏或只允许搜索引擎查看

如果当前文章/页面需要禁止搜索引擎抓取,勾选即可。勾选后,当此文章/页面被普通访客访问时就会显示下面的错误信息(搜索引擎和已登录用户不受影响):

WordPress特定文章对搜索引擎隐藏或只允许搜索引擎查看

PHP 相关文章推荐
php设计模式 State (状态模式)
Jun 26 PHP
php报表之jpgraph柱状图实例代码
Aug 22 PHP
php漏洞之跨网站请求伪造与防止伪造方法
Aug 15 PHP
php获取表单中多个同名input元素的值
Mar 20 PHP
分享一段php获取linux服务器状态的代码
May 27 PHP
PHP类中的魔术方法(Magic Method)简明总结
Jul 08 PHP
9个经典的PHP代码片段分享
Dec 18 PHP
Redis使用Eval多个键值自增的操作实例
Nov 04 PHP
PHP实现文件上传功能实例代码
May 18 PHP
Laravel ORM 数据model操作教程
Oct 21 PHP
php 下 html5 XHR2 + FormData + File API 上传文件操作实例分析
Feb 28 PHP
PHP 图片处理
Sep 16 PHP
详解Window7 下开发php扩展
Dec 31 #PHP
WordPress用户登录框密码的隐藏与部分显示技巧
Dec 31 #PHP
php+jQuery+Ajax实现点赞效果的方法(附源码下载)
Jul 21 #PHP
WordPress中限制非管理员用户在文章后只能评论一次
Dec 31 #PHP
php实现微信公众号主动推送消息
Dec 31 #PHP
php创建桌面快捷方式实现方法
Dec 31 #PHP
开启PHP的伪静态模式
Dec 31 #PHP
You might like
分享一下贝贝成长进度的php代码
2012/09/14 PHP
php获取远程图片体积大小的实例
2013/11/12 PHP
PHP批量检测并去除文件BOM头代码实例
2014/05/08 PHP
php+mysqli使用面向对象方式更新数据库实例
2015/01/29 PHP
php实现文本数据导入SQL SERVER
2015/05/17 PHP
Zend Framework开发入门经典教程
2016/03/23 PHP
JS操作Cookie写入和读取实例代码
2013/10/20 Javascript
javascript作用域和闭包使用详解
2014/04/25 Javascript
JavaScript实现跑马灯抽奖活动实例代码解析与优化(一)
2016/02/16 Javascript
详谈javascript异步编程
2016/02/21 Javascript
jQuery移动端图片上传组件
2016/06/12 Javascript
AngularJS入门教程引导程序
2016/08/18 Javascript
NodeJS配置HTTPS服务实例分享
2017/02/19 NodeJs
nodejs个人博客开发第一步 准备工作
2017/04/12 NodeJs
微信小程序 空白页重定向解决办法
2017/06/27 Javascript
Angular 4中如何显示内容的CSS样式示例代码
2017/11/06 Javascript
基于JavaScript实现单例模式
2019/10/30 Javascript
Angular进行简单单元测试的实现方法实例
2020/08/16 Javascript
[54:45]2018DOTA2亚洲邀请赛 4.1 小组赛 A组 Optic vs OG
2018/04/02 DOTA
[48:37]EG vs OG 2018国际邀请赛小组赛BO2 第一场 8.17
2018/08/18 DOTA
Python实现3行代码解简单的一元一次方程
2014/08/18 Python
Python函数式编程指南(二):从函数开始
2015/06/24 Python
python 文件操作删除某行的实例
2017/09/04 Python
python字典操作实例详解
2017/11/16 Python
解决Pandas to_json()中文乱码,转化为json数组的问题
2018/05/10 Python
详解python tkinter教程-事件绑定
2019/03/28 Python
python把ipynb文件转换成pdf文件过程详解
2019/07/09 Python
Python GUI编程学习笔记之tkinter界面布局显示详解
2020/03/30 Python
HTML5新增的8类INPUT输入类型介绍
2015/07/06 HTML / CSS
美国女士泳装店:Swimsuits For All
2017/03/02 全球购物
大学生党员承诺书
2014/05/20 职场文书
文明家庭事迹材料
2014/12/20 职场文书
2015年双拥工作总结
2015/04/08 职场文书
运动会开幕式新闻稿
2015/07/17 职场文书
社区志愿者服务心得体会
2016/01/22 职场文书
浅谈python中的多态
2021/06/15 Python