网站建设

WordPress发布文章主动推送到百度,加快收录保护原创

Jager · 5月26日 · 2015年 · 18903次已读

工作实在太忙,也没时间打理网站。最近公司额外交待了一些网站 SEO 方面的优化任务让我关注(这就是啥都要会、啥都要做的苦逼运维的真实写照了...)。

于是抽空看了下百度站长平台,至少看到了 2 个新消息:

①、百度已全面支持 https 网站,并倡导说使用 https 会优先收录;

②、主动推送将逐步取代实时推送,实时向百度推送新数据。

WordPress发布文章主动推送到百度,加快收录保护原创

对于第一点,个人认为现阶段 https 不管是从兼容性还是从速度上还是差强人意的。尤其是一些免费的 SSL 证书,虽然可以让我等屌丝网站瞬间提高逼格,营造一种高大上的赶脚。但是国内其他几家搜索引擎貌似还不能支持 https 的收录,所以我个人建议可以暂时先观望一下,等技术和时机成熟再来实现整站 https。

对于第二点,我第一时间想到的就是百度 WordPress 数据化结构插件—baidusubmit 可以删除,但后面发现其实这 2 个机制是可以共存的,不过依过往经验来看,如果同时使用,我个人建议关闭百度的数据化结构插件的实时推送功能,避免重复推送通知,造成收录困扰!

一、主动推送

先来看下百度对于主动推送的一些说明:

主动推送:最为快速的提交方式,建议您将站点当天新产出链接立即通过此方式推送给百度,以保证新链接可以及时被百度收录。

主动推送支持多种途径:比如 curl 、post、php 以及 ruby 等。而且支持一次性提交多条网站页面地址,不过每个站点每天可推送的次数暂时限制在 50 次。

使用主动推送功能会达到怎样效果?
①、及时发现:可以缩短百度爬虫发现您站点新链接的时间,使新发布的页面可以在第一时间被百度收录
②、保护原创:对于网站的最新原创内容,使用主动推送功能可以快速通知到百度,使内容可以在转发之前被百度发现

——摘自百度官方:原文地址

二、PHP 代码

①、WrodPress 通用方式【推荐使用

补充于 2015-07-03:不经意看到张戈博客之前写的发布文章同步新浪微博的代码,突然发现原来都可以更简单!因为 WordPress 本来就存在支持 POST 或 GET 方法的 WP_Http 类,这样一来妈妈再也不用担心我的主机是否支持这个支持那个了!

先摘一段来自鱼叔的相关描述:

在 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

简单的修改一下之前的代码,即可轻松搞定:

/**
* WordPress 发布文章主动推送到百度,加快收录保护原创【WordPress 通用方式】
* 文章地址:https://zhang.ge/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 发布文章自动同步到新浪微博(带特色图片)》中的代码即可搞定:

/**
* WordPress 发布文章主动推送到百度,加快收录保护原创【curl_init 方式】
* 文章地址:https://zhang.ge/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 方式,代码如下:

/**
* WordPress 发布文章主动推送到百度,加快收录保护原创【file_get_contents 方式】
* 文章地址:https://zhang.ge/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:域名已更新为动态变量,无需另外更改)。

WordPress发布文章主动推送到百度,加快收录保护原创

最后将修改后的代码添加到主题目录下的 functions.php 函数模板并保存。

现在发布新文章,文章地址将会被主动推送到百度。被成功推送的文章,将自动出现如下自定义栏目:

WordPress发布文章主动推送到百度,加快收录保护原创

从而避免代码重复推送的尴尬,如果你需要更新文章再次推送数据,那么删除或修改这个自定义栏目即可再次被推送。

Ps:虽然,主动推送的各种方法都支持一次推送多条数据,从我个人的经验来看,对于老文章没必要再次推送,频繁推送容易导致百度“翻脸”!

三、其他说明

用心思考的童鞋,应该可以看出百度的目的应该是为了获取文章准确的发布时间,这一项改进很明显就是为了配合之前百度取消快照之后,新增的“文章发布时间"的改动:

WordPress发布文章主动推送到百度,加快收录保护原创

我个人认为,之前百度应该是通过分析文章中的时间戳来确认原创文章的发布时间。但是时间戳是可以作弊的,而百度蜘蛛的抓取也不是及时的,这样就带来了文章是否真实原创的争议!比如张戈博客发布一篇文章,蜘蛛还没来得及抓取,就被大站转走而且还不带来源链接,就会出现一种情况:大站的蜘蛛抓取频繁,第一时间就抓到了转载的文章,认为是原创,而真正的原创却由于后抓取被蜘蛛认为是伪原创!是个人都要吐血了吧?

现在有了主动推送就好多了,高质量原创文章发布,第一时间就会推送到百度,从而告知了最准确的原创来源,从而杜绝了抄袭者和原创者出现角色互换的尴尬!还在使用老版 baidusubmit 插件的朋友,可以赶紧试试张戈写的代码了!

最新补充:早上不经意看到百度官方推荐文章,果然不出我所料:

新的主动推送工具最大的亮点就是“快”。
这个工具直接将链接推送给百度,而原来的工具推送的是结构化数据,需要百度进一步解析和内部排序。天下功夫,唯快不破。高手对决中,1 微秒决定胜负。快速推送带来的好处是两方面的:一是及时发现,可以缩短百度爬虫发现您站点新链接的时间,使新发布的页面可以在第一时间被百度收录;二是保护原创,对于网站的最新原创内容,使用主动推送功能可以快速通知到百度,使内容可以在转发之前被百度发现。

新的主动推送工具第二个特点就是“人性化”。
首先是密匙的人性化,同一个帐号下所有站点的密匙相同。这一点对于一个绑定了多个子域名的大站来说,是个福音,不用为每个子域名写个推送程序,节省时间成本和技术成本。第二个人性化是返回数据人性化,返回数据包含返回码和 message,推送完后能立即知道推送结果,而老的工具推送后要登录后台才能查看推送结果。

另外,使用这个插件时必须确保推送的是最新、高质量的网页链接。
  刚才说新工具的最大亮点是快,之所以能快,是因为跳过了正常抓取时的好几个步骤。百度这样做,是希望能更加快速的抓取到高质量的网页。如果一个网站经常推送一些老的、垃圾页面的链接,百度会很生气的,会认为网站辜负了他的信任,直接后果是百度不再信任这个网站的推送,导致工具失效,是否有其它更恶劣的后果,比如降低网站评价,这个还有待进一步观察。所以,使用这个工具时一定要注意,老的、低质量的网页链接不要推送了。(Ps:为了测试我的代码,我连续推送了十几次老文章,也是醉了。。。)

然后这位仁兄还给出了主动推送和实时推送的对比清单:WordPress发布文章主动推送到百度,加快收录保护原创

不久,我又在百度官方 WIKI 看到了相关文章,已更新到上文当中 。

123 条回应
  1. 烂番茄 2015-9-26 · 0:36

    果然还是厉害啊~

  2. 大飞 2015-10-29 · 23:30

    张大哥,使用方法1后提示发布文章提示错误,错误信息显示是这行出错。
    $result = json_decode($result['body'],true);
    求解答!

  3. 语墨部落 2015-11-28 · 13:31

    哈,来学习了 八错

  4. 帅气小琦琦 2015-12-4 · 23:41

    之前有这个效果,但是现在貌似失效了,文章发布之后,没有自定义项目,证明没有推送成功

  5. 学以致用方能为你所用 2015-12-6 · 12:09

    有帮助!谢谢了

  6. Era 2015-12-21 · 21:52

    新建的分类目录 应该不会推送吧?

  7. 网上兼职吧 2015-12-26 · 14:00

    你好,上面几种代码都试了,自定义栏目里还是没有

  8. juar 2016-1-21 · 20:18

    请教下,我的网站有自定义文章分类,按照教程用了你的三种代码都只有默认分类文章可以自动推送,而自定义的分类都不行,请问下是不是要改function Baidu_Submit($post_ID)这行。我的网站是www.juar.net,有空的话给看一眼,谢谢了。

    • avatar
      Jager 2016-1-21 · 23:11

      这个代码应该不管分类的,你可以试下官方出的插件。

      • juar 2016-1-26 · 12:52

        谢谢您的答复,我上次的描述可能不准确,我的文章有自定义类型,不是自定义分类,就如同post和page的区别。现在用你的代码只能推送post类型文章,而不能推送其他的。我不懂代码,所以请教下,如果要推送其他类型的文章是不是改成下面的形式:
        if(!function_exists('Baidu_Submit')){
        function Baidu_Submit($post_ID) {
        'post_type'= array( 'post','自定义类型1','自定义类型2',……);
        ……

        • mimi 2016-6-11 · 14:45

          我也是有这个问题,如何解决的? function Baidu_Submit($post_ID) {在自定义文章类型中,
          这里页面直接不会执行,只有POST 文章类型才会执行。

  9. Licoy 2016-1-28 · 6:44

    博主请问一下,上面的第一条代码放在什么位置,是不是放在http.php那个文件中?

  10. 画情 2016-2-8 · 20:20

    签到成功!签到时间:下午7:24:15,每日签到,生活更精彩哦~
    张哥,我用代码可以推送,但是用你的百度推送插件就推送不了~~~~我也不知道怎么会这样!
    祝张歌新年快乐,恭喜发财~~~

  11. Qa 2016-2-11 · 0:16

    新年快乐!
    自从为了满足需求弄了个自动采集的资讯板块就没用主动推送了,用的PHP判断分类然后输出js推送代码。
    这个主动推送可以实现判断文章分类再决定是否推送呢。

  12. Qa 2016-2-11 · 2:07

    已解决,指定分类不进行推送。

    //已成功推送的文章不再推送
    这句下添加
    if( in_category(array( '分类ID' )) ) return;

    • Qa 2016-2-19 · 2:18

      好像这个办法不太好使,还是托送了。 :???: 博主有啥办法没?

  13. 电影天堂迅雷下载 2016-6-7 · 8:53

    好文章 对seo太有用了

  14. 强强 2016-6-18 · 15:17

    张大侠,我现在加入代码后,我网站主页底部出现乱码,这是什么原因?

    • avatar
      Jager 2016-6-19 · 11:26

      具体情况得具体分析。

  15. 好人好报 2016-7-21 · 18:37

    第一段代码,在PHP7中测试有错误。不过提交还是成功的

  16. isher 2016-8-10 · 21:34

    你好,师兄,这三段代码,我分别都加入了function,也发布了新的文章,但是貌似没用,后台也看不到新的自定义栏目,请问这个现在还有用吗?

  17. Submit 2017-4-25 · 7:27

    博主你好!
    php7.1.4
    nginx/1.12.0
    wp4.7.4
    使用以上代码,发布文章后后台显示500错误,前台文章显示发布成功,点编辑发布的文章看自定义栏无Baidu_Submit。
    以前用php7.1.3 nginx/1.10.3 正常,感觉是环境更新后特性变化问题,请指点一下,可以继续使用这段推送代码。期待,感谢~~

    • avatar
      Jager 2017-4-26 · 12:06

      可能php又改了什么特性,你可以把php错误日志打开,然后看看具体报了什么错误。

  18. 郑智仁博客 2017-6-17 · 10:51

    张哥 您好 您的博客对我很受用 这个推送我发布文章后Baidusubmit会显示1 但是第二天从百度站长平台看链接提交 依然没提交 三种代码我都试了还是不行

    • avatar
      Jager 2017-6-25 · 22:25

      不会吧,百度返回了success,代码才会判断为成功的,你可以尝试把百度返回值记录到日志文件,查看下是什么结果。

      • 郑智仁博客 2017-7-10 · 18:08

        呜呜 新手不会搞 但还是感谢了

  19. 搬瓦工中文网 2017-12-17 · 22:48

    网站启用了HTTPS,WordPress4.9.1版本,最近发布文章时报错500错误。
    php错误信息最后定位在下面这一行:

    $result = json_decode($result['body'],true);

    请教博主,有什么解决办法吗? :?:

    • avatar
      Jager 2018-1-30 · 13:13

      错误信息贴一下?

    • Stanley 2020-10-30 · 23:39

      因为这程序需要提交信息到百度的服务器再返回结果,有时候可能会遇到网络或服务器问题导致提交不成功,那么 $result 的结果就不是一个数组,所以 json_decode 就会出错,我得到的错误信息是:Uncaught Error: Cannot use object of type WP_Error as array。

      所以,在 decode 之前要做一个判断,我修改了一下代码(才疏学浅,如有错误请指正),希望能帮助到遇到一样问题的同学,同时也感谢张戈,获益良多。

      加上判断后,如果百度没返回 seccess,自定义字段 Baidusubmit 也不会显示 1,再尝试提交就是了。

      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') );
      if (!is_wp_error($result)) {
      $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);
      }

  20. 亦可 2019-1-3 · 12:47

    博主好,老文章更新了一点内容也会自动推送吗?

  21. Happyboy 2019-6-28 · 21:37

    博主你好,一直用着你的代码,非常不错~~但是貌似从五月份开始,推送成功(自定义栏目里成功添加了Baidusubmit的值),但是在百度站长平台里,链接提交主动推送里显示的一直是0~~不知道其他人有这种情况吗?什么原因造成的~

  22. 小兽医 2019-8-22 · 10:59

    前辈,咨询一下配置完代码后,说的推送成功后,“自定义栏目”显示数字“1”,我没找到自定义栏目在哪。麻烦指导一下