程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> 網頁編程 >> PHP編程 >> PHP綜合 >> WordPress特定文章對搜索引擎隱藏或只允許搜索引擎查看

WordPress特定文章對搜索引擎隱藏或只允許搜索引擎查看

編輯:PHP綜合

對搜索引擎隱藏特定的文章
這個問題的來源是這樣的:

眾所周知,隨著搜索引擎的改良,會越來越排斥采集和偽原創,尤其是百度還推出了起源算法,對采集站進行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後台文章和頁面的編輯頁面,右邊欄底部我們可以看到這樣的選框:

20151231152053845.png (287×82)

如果當前文章/頁面需要禁止搜索引擎抓取,勾選即可。勾選後,當此文章/頁面被搜索引擎訪問時就會返回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後台文章和頁面的編輯頁面,右邊欄底部我們可以看到這樣的選框:

20151231152211569.png (290×79)

如果當前文章/頁面需要禁止搜索引擎抓取,勾選即可。勾選後,當此文章/頁面被普通訪客訪問時就會顯示下面的錯誤信息(搜索引擎和已登錄用戶不受影響):

20151231152234095.png (443×260)

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved