WordPress百度自动推送JS优化(规避错误、重复推送问题)
关注SEO、关注收录的站长,应该都知道百度搜索提供了一段自动推送的js代码,可将任意网页推送到搜索引擎,加快收录。但是,这段代码并不是简单的增加到网页中万事大吉了!百度埋坑技术,你我都懂的!本文主要分享埋坑之自动推送JS代码的优化。
一、问题描述
百度近些年推出过多种收录推送工具,比如结构化数据插件、主动推送、自动推送js等等。每一次张戈都会对这些东西进行优化处理,主要是因为这些工具都会出现重复推送的弊病!虽然百度并没有申明重复推送会带来什么副作用。但根据我个人的经验,同一篇文章,如果重复推送,可能会让百度蜘蛛认为你这文章更新频繁,不稳定从而进入收录沙盒短期内不会展示!
重复推送到底有没有副作用,百度并没有给我明确的答复。不过管理员明确回复,无需添加主动推送,就算是没有副作用,已收录的页面也添加自动推送js代码,也会浪费每天的可推送额度( 当天剩余的可推送url条数)!
另外,我们知道,很多时候多个url地址其实是同一个页面内容,比如:
http://www.xxx.com/liuyan.html
http://www.xxx.com/liuyan.html/comment-page-34/#comments
而且,当我们给页面带上查询参数,显示的依然是同一个页面内容,但是Url地址变了!那么自动推送js获取到的Url也变了!它就会将这个 Url 推送到搜索引擎!实际上,这些相同内容的页面我们并不希望重复抓取和收录!
二、问题解决
根据上面的分析,这类自动推送js代码就不能整站添加,而是只需添加到未收录且正规Url的页面。
比如:
http://www.xxx.com/1.html 百度已收录,这种页面不添加
http://www.xxx.com/2.html 百度未收录,这种页面要添加
http://www.xxx.com/2.html?from_weixin 百度未收录,但属于重复内容页面,所以不添加
已收录、未收录的判断,关注的朋友肯定记得我之前在博客分享过百度是否收录的插件和代码吧!而对于是否是正规页面,也只需要添加一个简单判断。
/**
* 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){
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='/d/file/img/2020/0305/ydtuxing.html
$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)){
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;
}
}
}
//输出百度自动推送js代码
if(!function_exists('bdPushData')){
function bdPushData() {
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 = '/d/file/img/2020/0305/yderror.html
}
var s = document.getElementsByTagName('script')[0];
s.parentNode.insertBefore(bp, s);
})();</script>";
}
}
}
如上PHP代码,添加到主题functions.php即可。当页面未被百度收录,且被访问的页面地址等于WordPress唯一页面地址时,将会输出百度自动推送js代码,不符合条件的页面则不会输出。
2016年5月31日更新说明:有朋友反馈收录判断不准确,花时间DEBUG看了下,发现抓取到的百度搜索结果可能是空白内容等错误内容,导致判断为已收录!
所以,上述代码加入百度搜索结果必要关键词【百度为您找到相关结果】的条件判断,目前来看应该比较准确了,已在使用的朋友请更新到最新代码。
三、其他说明
和以前分享的百度是否收录代码一样的工作原理,文章加载时,会在百度搜索当前文章的url地址,如果百度未收录,查询结果中会匹配到【没有找到该URL。您可以直接访问】或【很抱歉,没有找到与】文字内容。当代码确认页面已收录时,将会在文章中添加一个值为1的 baidu_record 自定义栏目。
只有当 baidu_record 这个自定义栏目的值不存在时,代码才会去百度查询收录结果。并且在确认未收录之后,才会在网页 footer 中输出自动推送js代码。
这样就规避了已收录页面重复推送和百度实时查询导致加载慢两个问题!另外,其实还有另一个值得关注的坑:百度统计代码也会自动推送,是否也存在本文提到的问题,就不得而知了。
最后,顺便说明一下,360搜索也推出了主动收录js代码,喜欢折腾的朋友可以参考本文进行优化。