在functions.php中使用如下代码
if(!function_exists('Baidu_Submit')){
function Baidu_Submit($post_ID) {
$WEB_TOKEN = 'si045I28ApcqUyrN'; //这里请换成你的网站的百度主动推送的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);
}
案例
先摘一段来自鱼叔的相关描述:
在 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 插件的朋友,可以赶紧试试张戈写的代码了!
Comments | NOTHING