百度近些年推出过多种收录推送工具,比如结构化数据插件、主动推送、自动推送 js 等等。但这些工具都会出现重复推送的弊病,需要进一步优化!
虽然百度并没有申明重复推送会带来什么副作用。但个人觉得,同一篇文章,如果重复推送,可能会让百度蜘蛛认为你这文章更新频繁,不稳定从而进入收录沙盒短期内不会展示;再者,已收录的页面也添加自动推送 js 代码,也会浪费每天的可推送额度( 当天剩余的可推送 url 条数)!
另外,我们知道,很多时候多个 url 地址其实是同一个页面内容,比如:
www.ilxtx.com/the-ending-song-of-ludingji-of-handong-version.html
www.ilxtx.com/the-ending-song-of-ludingji-of-handong-version.html/comment-page-1/#comments
而且,当我们给页面带上查询参数,显示的依然是同一个页面内容,但是 Url 地址变了!那么自动推送 js 获取到的 Url 也变了!它就会将这个 Url 推送到搜索引擎!实际上,这些相同内容的页面我们并不希望重复抓取和收录!
根据上面的分析,这类自动推送 js 代码就不能整站添加,而是只需添加到未收录且正规 Url 的页面。
比如:
https://www.ilxtx.com/dw-question-answer.html 百度已收录,这种页面不添加
https://www.ilxtx.com/automatically-fill-in-personal-information.html 百度未收录,这种页面要添加
https://www.ilxtx.com/automatically-fill-in-personal-information.html/comment-page-1/#comments 百度未收录,但属于重复内容页面,所以不添加
下面就给出 @张戈 的解决方法:
/**
* WordPress 百度搜索自动推送、主动收录 JS 优化 By 张戈博客
* 文章地址:http://zhangge.net/5100.html
* 转载请保留出处,谢谢合作!
**/
add_action( 'wp_footer', 'bdPushData', 999);
if(!function_exists('baidu_check_record')){
function baidu_check_record($url,$post_id){
$baidu_record = get_post_meta($post_id,'baidu_record',true);
if( $baidu_record != 1){
$url='http://www.baidu.com/s?wd='.$url;
$curl=curl_init();
curl_setopt($curl,CURLOPT_URL,$url);
curl_setopt($curl,CURLOPT_RETURNTRANSFER,1);
$rs=curl_exec($curl);
curl_close($curl);
if( BD_PUSH == 'yes' && !preg_match_all('/提交网址/u',$rs) && preg_match_all('/百度为您找到相关结果/u',$rs)){
update_post_meta($post_id, 'baidu_record', 1) || add_post_meta($post_id, 'baidu_record', 1, true);
return 1;
} else {
return 0;
}
} else {
return 1;
}
}
}
if(!function_exists('bdPushData')){
function bdPushData() {
global $wpdb;
$post_id = ( null === $post_id ) ? get_the_ID() : $post_id;
$currentUrl = home_url(add_query_arg(array()));
//这里修改了下:给 get_permalink 指定了文章 ID
if(baidu_check_record(get_permalink($post_id), $post_id) == 0 && $currentUrl == get_permalink($post_id)) {
echo "<script>(function(){
var bp = document.createElement('script');
var curProtocol = window.location.protocol.split(':')[0];
if (curProtocol === 'https') {
bp.src = 'https://zz.bdstatic.com/linksubmit/push.js';
} else {
bp.src = 'http://push.zhanzhang.baidu.com/push.js';
}
var s = document.getElementsByTagName('script')[0];
s.parentNode.insertBefore(bp, s);
})();
(function(){
var src = (document.location.protocol == 'http:') ? 'http://js.passport.qihucdn.com/11.0.1.js?af9e600e6a4ba6d33cd7f1b088210cf7':'https://jspassport.ssl.qhimg.com/11.0.1.js?af9e600e6a4ba6d33cd7f1b088210cf7';
document.write('<script src=\"' + src + '\" id=\"sozz\"><\/script>');
})();</script>";
}
}
}
工作原理:
- 文章加载时,会在百度搜索当前文章的 url 地址,如果百度未收录,查询结果中会匹配到【没有找到该 URL。您可以直接访问】或【很抱歉,没有找到与】文字内容。当代码确认页面已收录时,将会在文章中添加一个值为 1 的 baidu_record 自定义栏目。
- 只有当 baidu_record 这个自定义栏目的值不存在时,代码才会去百度查询收录结果。并且在确认未收录之后,且被访问的页面地址等于 WordPress 唯一页面地址时,才会在网页 footer 中输出自动推送 js 代码。
- 这样就规避了已收录页面重复推送和百度实时查询导致加载慢两个问题!
可能在使用上述代码时,会出现不正常的情况,比如:使用上述代码时,我通过echo
,得到的get_permalink()
为每个页面中最后一篇文章的地址链接......
可能原因:
get_permalink() 函数在文章型页面(文章索引、存档等)的主循环外使用时,如果没有指定 ID 参数,将返回循环中最后一篇文章的 URL,而不是当前页面的固定链接。
经过一番折腾,龙笑天下将上述代码做了一点点修改后,终于正常了,具体代码如下:
/**
* WordPress 百度自动推送 JS 优化重复推送问题(龙笑天下修改版)
* https://www.ilxtx.com/baidu-auto-pushdata-js.html
* 原作者:张戈
*/
add_action( 'wp_head', 'bdPushData', 999);
//检查百度是否已收录最新改进版本
if(!function_exists('baidu_check_record')){
function baidu_check_record($url){
global $wpdb;
$post_id = ( null === $post_id ) ? get_the_ID() : $post_id;
$baidu_record = get_post_meta($post_id,'baidu_record',true);
if( $baidu_record != 1){
$url='http://www.baidu.com/s?wd='.$url;
$curl=curl_init();
curl_setopt($curl,CURLOPT_URL,$url);
curl_setopt($curl,CURLOPT_RETURNTRANSFER,1);
$rs=curl_exec($curl);
curl_close($curl);
//如果抓取到的百度结果中不存在【提交网址】这个关键词,则认为该页面已被百度收录
if(!preg_match_all('/提交网址/u',$rs) && preg_match_all('/百度为您找到相关结果/u',$rs)){
if( $baidu_record == 0){
update_post_meta($post_id, 'baidu_record', 1);
} else {
add_post_meta($post_id, 'baidu_record', 1, true);
}
return 1;
} else {
if( $baidu_record == false){
add_post_meta($post_id, 'baidu_record', 0, true);
}
return 0;
}
} else {
return 1;
}
}
}
//输出百度自动推送 js 代码
if(!function_exists('bdPushData')){
function bdPushData() {
$currentUrl = home_url(add_query_arg(array())); //wordpress 原生的方法获取当前页面的地址,注意:固定链接不是默认的形式,且首页形式是 www.ilxtx.com;否则请注释掉此行,启用下面 5 行
// if ($_SERVER['HTTPS'] != "on") {
// $currentUrl = 'http://'.$_SERVER['HTTP_HOST'].$_SERVER["REQUEST_URI"];
// } else {
// $currentUrl = 'https://'.$_SERVER['HTTP_HOST'].$_SERVER["REQUEST_URI"];
// }
//判断是否是未收录页面,并且当前页面是否等于正规 url 地址(get_premalink)
if(baidu_check_record(get_permalink()) == 0 && $currentUrl == get_permalink()) {
echo "<script>(function(){
var bp = document.createElement('script');
var curProtocol = window.location.protocol.split(':')[0];
if (curProtocol === 'https') {
bp.src = 'https://zz.bdstatic.com/linksubmit/push.js';
} else {
bp.src = 'http://push.zhanzhang.baidu.com/push.js';
}
var s = document.getElementsByTagName('script')[0];
s.parentNode.insertBefore(bp, s);
})();</script>";
}
}
}
工作原理和上面的一样,只有 2 点不同:这段代码是加载在头部的;如果文章未收录,则会给文章增一个自定义栏目 baidu_record 为 0。
20170828:终于弄清楚原因了,主题的底部通栏文章列表小工具使用了
WP_Query
,然而竟然没有使用wp_reset_postdata()
来重置获取的文章数据...
不知道什么原因,需在头部加载才能正确获取页面的固定链接...求大神告知!
上面 2 段代码请选择合适的添加到主题的 functions.php 中!
另外,其实还有另一个值得关注的坑:百度统计代码也会自动推送,是否也存在本文提到的问题,就不得而知了。
最后,顺便说明一下,360 搜索也推出了主动收录 js 代码,希望有朋友能参考着优化下。
还没有人赞赏,快来当第一个赞赏的人吧!
声明:本文为原创文章,版权归龙笑天下所有,欢迎分享本文,转载请保留出处!