
导读:关注 SEO、关注收录的站长,应该都知道百度搜索提供了一段自动推送的 js 代码,可将任意网页推送到搜索引擎,加快收录。但是,这段代码并不是简单的增加到网页中万事大吉了!百度埋坑技术,你我都懂的!本文主要分享埋坑之自动推送 JS 代码的优化...
一、问题描述
百度近些年推出过多种收录推送工具,比如结构化数据插件、主动推送、自动推送 js 等等。每一次张戈都会对这些东西进行优化处理,主要是因为这些工具都会出现重复推送的弊病!虽然百度并没有申明重复推送会带来什么副作用。但根据我个人的经验,同一篇文章,如果重复推送,可能会让百度蜘蛛认为你这文章更新频繁,不稳定从而进入收录沙盒短期内不会展示!
这一点,在以往的文章中我都反复提出过:
BaiduSubmit:百度 WordPress 结构化数据插件(改进版)
对于百度最新推出的自动推送 JS 代码,通过站长平台的反馈来看,依然存在重复推送的坑:
Ps:看到这个回复,其实我是打心底鄙视了百度一把!这 js 只需要添加到新页面?那新页面收录之后,我们再去删除 js 代码?那我还要经常关注页面是不是被收录?那几万个页面的网站还得靠工具检测咯?
重复推送到底有没有副作用,百度并没有给我明确的答复。不过管理员明确回复,无需添加主动推送,就算是没有副作用,已收录的页面也添加自动推送 js 代码,也会浪费每天的可推送额度( 当天剩余的可推送 url 条数)!
另外,我们知道,很多时候多个 url 地址其实是同一个页面内容,比如:
https://zhang.ge/liuyan.html https://zhang.ge/liuyan.html/comment-page-34/#comments
而且,当我们给页面带上查询参数,显示的依然是同一个页面内容,但是 Url 地址变了!!那么自动推送 js 获取到的 Url 也变了!它就会将这个 Url 推送到搜索引擎!实际上,这些相同内容的页面我们并不希望重复抓取和收录!
二、问题解决
根据上面的分析,这类自动推送 js 代码就不能整站添加,而是只需添加到未收录且正规 Url 的页面。
比如:
https://zhang.ge/5093.html 百度已收录,这种页面不添加
https://zhang.ge/5096.html 百度未收录,这种页面要添加
https://zhang.ge/5096.html?from_weixin 百度未收录,但属于重复内容页面,所以不添加
已收录、未收录的判断,关注张戈博客的朋友肯定记得我之前在博客分享过百度是否收录的插件和代码吧!而对于是否是正规页面,也只需要添加一个简单判断。
/** * WordPress 百度搜索自动推送、主动收录 JS 优化 By 张戈博客 * 文章地址:https://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' && !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>"; } } }
如上 PHP 代码,添加到主题 functions.php 即可。当页面未被百度收录,且被访问的页面地址等于 WordPress 唯一页面地址时,将会输出百度自动推送 js 代码,不符合条件的页面则不会输出。
2016 年 5 月 31 日更新说明:有朋友反馈收录判断不准确,花时间 DEBUG 看了下,发现抓取到的百度搜索结果可能是空白内容等错误内容,导致判断为已收录!
所以,上述代码加入百度搜索结果必要关键词【百度为您找到相关结果】的条件判断,目前来看应该比较准确了,已在使用的朋友请更新到最新代码。
三、其他说明
和以前分享的百度是否收录代码一样的工作原理,文章加载时,会在百度搜索当前文章的 url 地址,如果百度未收录,查询结果中会匹配到【没有找到该 URL。您可以直接访问】或【很抱歉,没有找到与】文字内容。当代码确认页面已收录时,将会在文章中添加一个值为 1 的 baidu_record 自定义栏目。
只有当 baidu_record 这个自定义栏目的值不存在时,代码才会去百度查询收录结果。并且在确认未收录之后,才会在网页 footer 中输出自动推送 js 代码。
这样就规避了已收录页面重复推送和百度实时查询导致加载慢两个问题!
另外,其实还有另一个值得关注的坑:百度统计代码也会自动推送,是否也存在本文提到的问题,就不得而知了。
最后,顺便说明一下,360 搜索也推出了主动收录 js 代码,喜欢折腾的朋友可以参考本文进行优化。
效果补充:实施后,自动推送数量以从 200+降为 20+,说明已收录的文章不会重复推送了。
preg_match_all() expects at least 3 parameters, 2 given in加了后在页末提示这个是什么意思
php版本问题吧,preg_match_all 需要3个参数,但是第三个参数是可选。。
不过,文章代码已经更新为3个参数,你可以替换下试试。
:?: 张哥,如果是360的自动推送,又该怎么来处理才好呢?
:wink: 张哥,啥时候能够再把360的也整合进去就更好了,咱表示期待中!
boke112导航已经分享过了
早就试用过了他那给出的代码,新发布的文章在网页源代码里只能看到百度的,而360的推送代码却显示不了。
preg_match_all() expects at least 3 parameters, 2 given in加入代码后 页末显示这个 是什么情况
请问提交的网址是填写网站地址吗? 还有百度为您找到的相关结果是填写什么? 还是这两处不用填写
if(!preg_match_all('/提交网址/u',$rs,$matches) && preg_match_all('/百度为您找到相关结果/u',$rs, $matc
if(!preg_match_all('/提交网址/u',$rs,$matches) && preg_match_all('/百度为您找到相关结果/u',$rs, $matc
请问这段IF里面的提交的网址是指的什么网址,然后百度为您找到的相关结果是说指的是谁?
是需要更改成自己的还是仅需要默认极客!
不想整来整去,原来怎样就让它保持怎样吧。
之前貌似说百度统计也有推送功能,按此理解,也有重复可能
:arrow: 的确,这还真是个令人纠结的问题!
成功添加 谢谢
原来用的那个主动推送,好像收录的话baidu_record的值为0,现在这个baidu_record的值为1,两者是否会冲突?还是只使用一种推送方法就行?
用一种就好了
刚才我添加文中代码后,测试发现每一篇文章都显示已收录,哪怕是一个不存在的链接地址,如把文章ID多加几个数字,查询出来的结果依然是已收录,不知道怎么解决
只能把抓取的内容打印出来分析了
谢谢分享!!!!!!!!!!!!!!!!!!!!!!!!!!!!
成功了,谢谢楼主。
请问本文的代码是不是替换https://zhang.ge/5041.html 中的代码,还是累加上去?
选择其一即可
wordpress新版在php7.0 用了代码后,没效果,php有报错:$post_id 未定义变量,$_SERVER['HTTPS'未定义指标
您好,我是Winter,专注简历设计,从小白开始学习编程,辛辛苦3个月,看Jager博客学编程,每天睡觉不到六个小时,建立星愿简历网 ,谢谢。
:mrgreen: 一直在用,但是有个迷糊一直忘了问。如果之前使用了【百度是否收录】的代码,现在是否需要替换掉它,换成这个教程的。
Jager你好,我网站的百度收录提示的不作用了,不论有没收录,都显示已收录。
代码是配置正确的,在本地phpstudy环境下测试正确,但是放在服务器上就全部显示已生效(实际上并没有收录),怎么处理呢?
服务器用的oneinstack的一键包,lnmpa环境
签到成功!签到时间:11:16:47,每日签到,生活更精彩哦~1
学习了 :cool:
张先森,帮我推荐一个可显示wp内容里图片的exif信息的办法,最好不是插件 :grin: 3q
参考:
https://github.com/bobholt/exif-reader
http://www.jb51.net/article/52088.htm
大神能不能整一个asp脚本的
已和主动推送一起使用,暂时不知道效果.
请教一个问题,百度是确实有新站考核期的吗?
小站刚建没几天,在站长工具看每天有提交数量,但是百度site:查询,一个都没放出来
代码已经失效。百度增加了“安全检查”。所以 $rs 的地址会跳到中间页进行安全检查,人工需要滑锁的那种,才能到 http://www.baidu.com/s?wd='.$url 这个最终网址。所以抓取不到 【百度为您找到相关结果】、【提交网址】这些内容。无论如何, return 的结果总是 0。
那没办法了