工作實在太忙,也沒時間打理網站。最近公司額外交待了一些網站 SEO 方面的優化任務讓我關注(這就是啥都要會、啥都要做的苦逼運維的真實寫照了...)。
於是抽空看了下百度站長平台,至少看到了2個新消息:
①、百度已全面支持https網站,並倡導說使用https會優先收錄;
②、主動推送將逐步取代實時推送,實時向百度推送新數據。
對於第一點,個人認為現階段https不管是從兼容性還是從速度上還是差強人意的。尤其是一些免費的SSL證書,雖然可以讓我等屌絲網站瞬間提高逼格,營造一種高大上的趕腳。但是國內其他幾家搜索引擎貌似還不能支持https的收錄,所以我個人建議可以暫時先觀望一下,等技術和時機成熟再來實現整站https。
對於第二點,我第一時間想到的就是百度WordPress數據化結構插件—baidusubmit可以刪除,但后面發現其實這2個機制是可以共存的,不過依過往經驗來看,如果同時使用,我個人建議關閉百度的數據化結構插件的實時推送功能,避免重復推送通知,造成收錄困擾!
一、主動推送
先來看下百度對於主動推送的一些說明:
主動推送:最為快速的提交方式,建議您將站點當天新產出鏈接立即通過此方式推送給百度,以保證新鏈接可以及時被百度收錄。
主動推送支持多種途徑:比如curl 、post、php以及ruby等。而且支持一次性提交多條網站頁面地址,不過每個站點每天可推送的次數暫時限制在50次。
使用主動推送功能會達到怎樣效果?①、及時發現:可以縮短百度爬蟲發現您站點新鏈接的時間,使新發布的頁面可以在第一時間被百度收錄②、保護原創:對於網站的最新原創內容,使用主動推送功能可以快速通知到百度,使內容可以在轉發之前被百度發現——摘自百度官方:原文地址
二、PHP代碼
①、WrodPress 通用方式【推薦使用】
補充於2015-07-03:不經意看到張戈博客之前寫的發布文章同步新浪微博的代碼,突然發現原來都可以更簡單!因為 WordPress 本來就存在支持 POST 或 GET 方法的 WP_Http 類,這樣一來媽媽再也不用擔心我的主機是否支持這個支持那個了!
先摘一段來自魚叔的相關描述:
在 PHP 中發起 HTTP 請求並不是很難,有很多種方法:使用
fopen()
函數,使用 CURL 擴展,使用文件操作函數如fsockopen()
和fwrite()
等,但是問題是各種方法所依賴的服務器的配置把不同,有些服務器可能無法支持,不過 WordPress 自身開發了新的 API WP_Http 使得 WordPress 在所有環境下都非常容易發起 HTTP Request。PHP 類:WP_Http
WordPress 2.7 開始引入了一個新的 PHP Class:WP_Http(在 wp-includes 目錄 http.php 文件中)。這個 Class 的強大之處是它會檢測服務器的情況,選擇最好的方法去實現 HTTP 請求,所以我們自己無須去檢測 HTTP 擴展,
fopen()
,是否存在curl_init()
函數,這個 Class 都會包辦這些檢測。-------摘自我愛水煮魚《使用 WP_Http 在 WordPress 中發起 HTTP Request》
簡單的修改一下之前的代碼,即可輕松搞定:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
|
/**
* WordPress發布文章主動推送到百度,加快收錄保護原創【WordPress通用方式】
* 文章地址:http://zhangge.net/5041.html
*/
if(!function_exists('Baidu_Submit')){
function Baidu_Submit($post_ID) {
$WEB_TOKEN = 'xxxxxxxxxxx'; //這里請換成你的網站的百度主動推送的token值
$WEB_DOMAIN = get_option('home');
//已成功推送的文章不再推送
if(get_post_meta($post_ID,'Baidusubmit',true) == 1) return;
$url = get_permalink($post_ID);
$api = 'http://data.zz.baidu.com/urls?site='.$WEB_DOMAIN.'&token='.$WEB_TOKEN;
$request = new WP_Http;
$result = $request->request( $api , array( 'method' => 'POST', 'body' => $url , 'headers' => 'Content-Type: text/plain') );
$result = json_decode($result['body'],true);
//如果推送成功則在文章新增自定義欄目Baidusubmit,值為1
if (array_key_exists('success',$result)) {
add_post_meta($post_ID, 'Baidusubmit', 1, true);
}
}
add_action('publish_post', 'Baidu_Submit', 0);
}
|
②、curl_init 方式
WordPress發布文章主動推送到百度的代碼非常簡單,只要稍微修改一下張戈博客之前分享的《WordPress發布文章自動同步到新浪微博(帶特色圖片)》中的代碼即可搞定:
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
|
/**
* WordPress發布文章主動推送到百度,加快收錄保護原創【curl_init方式】
* 文章地址:http://zhangge.net/5041.html
*/
if(!function_exists('Baidu_Submit') && function_exists('curl_init')) {
function Baidu_Submit($post_ID) {
$WEB_TOKEN='xxxxxxxxx'; //這里換成你的網站的百度主動推送的token值
$WEB_DOMAIN=get_option('home');
//已成功推送的文章不再推送
if(get_post_meta($post_ID,'Baidusubmit',true) == 1) return;
$url = get_permalink($post_ID);
$api = 'http://data.zz.baidu.com/urls?site='.$WEB_DOMAIN.'&token='.$WEB_TOKEN;
$ch = curl_init();
$options = array(
CURLOPT_URL => $api,
CURLOPT_POST => true,
CURLOPT_RETURNTRANSFER => true,
CURLOPT_POSTFIELDS => $url,
CURLOPT_HTTPHEADER => array('Content-Type: text/plain'),
);
curl_setopt_array($ch, $options);
$result = json_decode(curl_exec($ch),true);
//如果推送成功則在文章新增自定義欄目Baidusubmit,值為1
if (array_key_exists('success',$result)) {
add_post_meta($post_ID, 'Baidusubmit', 1, true);
}
}
add_action('publish_post', 'Baidu_Submit', 0);
}
|
③、file_get_contents 方式
鑒於有個別站長反饋代碼添加后,發布或更新文章,自定義欄目中都不會出現我們期望的baidusubmit,我要他們檢查 token 和域名,也反饋是正確的,直到我親自給一個站長 Debug 時才發現是他主機的 curl_exec()函數被禁用了!既然這個函數都不能用了,那代碼也肯定無法正常推送了!
於是,我額外寫了一個普遍支持的 file_get_contents 方式,代碼如下:
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
|
/**
* WordPress發布文章主動推送到百度,加快收錄保護原創【file_get_contents方式】
* 文章地址:http://zhangge.net/5041.html
*/
if(!function_exists('Baidu_Submit')) {
function Baidu_Submit($post_ID) {
$WEB_TOKEN='xxxxxxxxx'; //這里換成你的網站的百度主動推送的token值
$WEB_DOMAIN=get_option('home');
//已成功推送的文章不再推送
if(get_post_meta($post_ID,'Baidusubmit',true) == 1) return;
$url = get_permalink($post_ID);
$api = 'http://data.zz.baidu.com/urls?site='.$WEB_DOMAIN.'&token='.$WEB_TOKEN;
$data = array (
'http' => array (
'method' => 'POST',
'header'=> "Content-Type: text/plain",
"Content-Length: ".strlen($url)."rn",
'content' => $url
)
);
$data = stream_context_create($data);
$result = file_get_contents($api, false, $data);
$result = json_decode($result,true);
//如果推送成功則在文章新增自定義欄目Baidusubmit,值為1
if (array_key_exists('success',$result)) {
add_post_meta($post_ID, 'Baidusubmit', 1, true);
}
}
add_action('publish_post', 'Baidu_Submit', 0);
}
|
Ps:file_get_contents 的運行效率應該是略低於curl的,不過就推送一條數據,就基本沒有差別啦!如果你使用第一種方式沒有成功,那么就試試 file_get_contents 方式吧!
③、代碼部署
從上面選好合適的代碼后(推薦①),先打開百度官方頁面:http://zhanzhang.baidu.com/linksubmit/index,獲取你網站的專屬的 token 值,替換到代碼中的 "xxxxxxxxx"(Ps:域名已更新為動態變量,無需另外更改)。
最后將修改后的代碼添加到主題目錄下的 functions.php 函數模板並保存。
現在發布新文章,文章地址將會被主動推送到百度。被成功推送的文章,將自動出現如下自定義欄目:
從而避免代碼重復推送的尷尬,如果你需要更新文章再次推送數據,那么刪除或修改這個自定義欄目即可再次被推送。
Ps:雖然,主動推送的各種方法都支持一次推送多條數據,從我個人的經驗來看,對於老文章沒必要再次推送,頻繁推送容易導致百度“翻臉”!
三、其他說明
用心思考的童鞋,應該可以看出百度的目的應該是為了獲取文章准確的發布時間,這一項改進很明顯就是為了配合之前百度取消快照之后,新增的“文章發布時間"的改動:
我個人認為,之前百度應該是通過分析文章中的時間戳來確認原創文章的發布時間。但是時間戳是可以作弊的,而百度蜘蛛的抓取也不是及時的,這樣就帶來了文章是否真實原創的爭議!比如張戈博客發布一篇文章,蜘蛛還沒來得及抓取,就被大站轉走而且還不帶來源鏈接,就會出現一種情況:大站的蜘蛛抓取頻繁,第一時間就抓到了轉載的文章,認為是原創,而真正的原創卻由於后抓取被蜘蛛認為是偽原創!是個人都要吐血了吧?
現在有了主動推送就好多了,高質量原創文章發布,第一時間就會推送到百度,從而告知了最准確的原創來源,從而杜絕了抄襲者和原創者出現角色互換的尷尬!還在使用老版 baidusubmit 插件的朋友,可以趕緊試試張戈寫的代碼了!
最新補充:早上不經意看到百度官方推薦文章,果然不出我所料:
新的主動推送工具最大的亮點就是“快”。
這個工具直接將鏈接推送給百度,而原來的工具推送的是結構化數據,需要百度進一步解析和內部排序。天下功夫,唯快不破。高手對決中,1微秒決定勝負。快速推送帶來的好處是兩方面的:一是及時發現,可以縮短百度爬蟲發現您站點新鏈接的時間,使新發布的頁面可以在第一時間被百度收錄;二是保護原創,對於網站的最新原創內容,使用主動推送功能可以快速通知到百度,使內容可以在轉發之前被百度發現。新的主動推送工具第二個特點就是“人性化”。
首先是密匙的人性化,同一個帳號下所有站點的密匙相同。這一點對於一個綁定了多個子域名的大站來說,是個福音,不用為每個子域名寫個推送程序,節省時間成本和技術成本。第二個人性化是返回數據人性化,返回數據包含返回碼和message,推送完后能立即知道推送結果,而老的工具推送后要登錄后台才能查看推送結果。另外,使用這個插件時必須確保推送的是最新、高質量的網頁鏈接。
剛才說新工具的最大亮點是快,之所以能快,是因為跳過了正常抓取時的好幾個步驟。百度這樣做,是希望能更加快速的抓取到高質量的網頁。如果一個網站經常推送一些老的、垃圾頁面的鏈接,百度會很生氣的,會認為網站辜負了他的信任,直接后果是百度不再信任這個網站的推送,導致工具失效,是否有其它更惡劣的后果,比如降低網站評價,這個還有待進一步觀察。所以,使用這個工具時一定要注意,老的、低質量的網頁鏈接不要推送了。(Ps:為了測試我的代碼,我連續推送了十幾次老文章,也是醉了。。。)
不久,我又在百度官方WIKI看到了相關文章,已更新到上文當中 。