工做實在太忙,也沒時間打理網站。最近公司額外交待了一些網站 SEO 方面的優化任務讓我關注(這就是啥都要會、啥都要作的苦逼運維的真實寫照了...)。php
因而抽空看了下百度站長平臺,至少看到了2個新消息:html
①、百度已全面支持https網站,並倡導說使用https會優先收錄;json
②、主動推送將逐步取代實時推送,實時向百度推送新數據。api
對於第一點,我的認爲現階段https無論是從兼容性仍是從速度上仍是差強人意的。尤爲是一些免費的SSL證書,雖然可讓我等屌絲網站瞬間提升逼格,營造一種高大上的趕腳。可是國內其餘幾家搜索引擎貌似還不能支持https的收錄,因此我我的建議能夠暫時先觀望一下,等技術和時機成熟再來實現整站https。ruby
對於第二點,我第一時間想到的就是百度WordPress數據化結構插件—baidusubmit能夠刪除,但後面發現其實這2個機制是能夠共存的,不過依過往經驗來看,若是同時使用,我我的建議關閉百度的數據化結構插件的實時推送功能,避免重複推送通知,形成收錄困擾!服務器
先來看下百度對於主動推送的一些說明:運維
主動推送:最爲快速的提交方式,建議您將站點當天新產出連接當即經過此方式推送給百度,以保證新連接能夠及時被百度收錄。curl
主動推送支持多種途徑:好比curl 、post、php以及ruby等。並且支持一次性提交多條網站頁面地址,不過每一個站點天天可推送的次數暫時限制在50次。ide
使用主動推送功能會達到怎樣效果?①、及時發現:能夠縮短百度爬蟲發現您站點新連接的時間,使新發布的頁面能夠在第一時間被百度收錄②、保護原創:對於網站的最新原創內容,使用主動推送功能能夠快速通知到百度,使內容能夠在轉發以前被百度發現——摘自百度官方:原文地址函數
補充於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);
}
|
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);
}
|
鑑於有個別站長反饋代碼添加後,發佈或更新文章,自定義欄目中都不會出現咱們指望的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看到了相關文章,已更新到上文當中 。