导读:关注 SEO、关注收录的站长,应该都知道百度搜索提供了一段自动推送的 js 代码,可将任意网页推送到搜索引擎,加快收录。但是,这段代码并不是简单的增加到网页中万事大吉了!百度埋坑技术,你我都懂的!本文主要分享埋坑之自动推送 JS 代码的优化…
一、问题描述
百度近些年推出过多种收录推送工具,比如结构化数据插件、主动推送、自动推送 js 等等。每一次张戈都会对这些东西进行优化处理,主要是因为这些工具都会出现重复推送的弊病!虽然百度并没有申明重复推送会带来什么副作用。但根据我个人的经验,同一篇文章,如果重复推送,可能会让百度蜘蛛认为你这文章更新频繁,不稳定从而进入收录沙盒短期内不会展示!
这一点,在以往的文章中我都反复提出过:
BaiduSubmit:百度 WordPress 结构化数据插件(改进版)
对于百度最新推出的自动推送 JS 代码,通过站长平台的反馈来看,依然存在重复推送的坑:

Ps:看到这个回复,其实我是打心底鄙视了百度一把!这 js 只需要添加到新页面?那新页面收录之后,我们再去删除 js 代码?那我还要经常关注页面是不是被收录?那几万个页面的网站还得靠工具检测咯?
重复推送到底有没有副作用,百度并没有给我明确的答复。不过管理员明确回复,无需添加主动推送,就算是没有副作用,已收录的页面也添加自动推送 js 代码,也会浪费每天的可推送额度( 当天剩余的可推送 url 条数)!
另外,我们知道,很多时候多个 url 地址其实是同一个页面内容,比如:
1 2 | http://zhang.ge/liuyan.html http://zhang.ge/liuyan.html/comment-page-34/#comments |
而且,当我们给页面带上查询参数,显示的依然是同一个页面内容,但是 Url 地址变了!!那么自动推送 js 获取到的 Url 也变了!它就会将这个 Url 推送到搜索引擎!实际上,这些相同内容的页面我们并不希望重复抓取和收录!
二、问题解决
根据上面的分析,这类自动推送 js 代码就不能整站添加,而是只需添加到未收录且正规 Url 的页面。
比如:
http://zhang.ge/5093.html 百度已收录,这种页面不添加
http://zhang.ge/5096.html 百度未收录,这种页面要添加
http://zhang.ge/5096.html?from_weixin 百度未收录,但属于重复内容页面,所以不添加
已收录、未收录的判断,关注张戈博客的朋友肯定记得我之前在博客分享过百度是否收录的插件和代码吧!而对于是否是正规页面,也只需要添加一个简单判断。
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 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 | /** * WordPress百度搜索自动推送、主动收录JS优化 By 张戈博客 * 文章地址:http://zhang.ge/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’%20<span%20class=”crayon-o”>&& !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=”‘%20<span%20class=”crayon-o”>+ src + ‘” id=”sozz”></script>’); })();</script>“; } } } |
如上 PHP 代码,添加到主题 functions.php 即可。当页面未被百度收录,且被访问的页面地址等于 WordPress 唯一页面地址时,将会输出百度自动推送 js 代码,不符合条件的页面则不会输出。
2016 年 5 月 31 日更新说明:有朋友反馈收录判断不准确,花时间 DEBUG 看了下,发现抓取到的百度搜索结果可能是空白内容等错误内容,导致判断为已收录!
所以,上述代码加入百度搜索结果必要关键词【百度为您找到相关结果】的条件判断,目前来看应该比较准确了,已在使用的朋友请更新到最新代码。
三、其他说明
和以前分享的百度是否收录代码一样的工作原理,文章加载时,会在百度搜索当前文章的 url 地址,如果百度未收录,查询结果中会匹配到【没有找到该 URL。您可以直接访问】或【很抱歉,没有找到与】文字内容。当代码确认页面已收录时,将会在文章中添加一个值为 1 的 baidu_record 自定义栏目。
只有当 baidu_record 这个自定义栏目的值不存在时,代码才会去百度查询收录结果。并且在确认未收录之后,才会在网页 footer 中输出自动推送 js 代码。
这样就规避了已收录页面重复推送和百度实时查询导致加载慢两个问题!
另外,其实还有另一个值得关注的坑:百度统计代码也会自动推送,是否也存在本文提到的问题,就不得而知了。
最后,顺便说明一下,360 搜索也推出了主动收录 js 代码,喜欢折腾的朋友可以参考本文进行优化。
效果补充:实施后,自动推送数量以从 200+降为 20+,说明已收录的文章不会重复推送了。