百度WordPress结构化数据插件会延长文章发布时间

日期: 标签:WordPress插件经验
如需帮忙改代码,或者WordPress二次开发、PHP网站建设等需求,可联系我购买付费服务:  点此联系我

之前百度推出了一款WordPress结构化数据插件,经使用感觉还不错。只是最近发现一个问题,在WordPress后台发布新文章时,点击发布后,要等很久页面才能提交成功,而且经常造成主机资源超限,出现500错误。

经排查,露兜发现此问题是由WordPress结构化数据插件造成的,它的publish_post执行函数耗时15秒!停用该插件后,文章发布就变得很快了。当然也有可能是这个插件跟我网站的某些代码不兼容造成。如果你的WordPress后台发布文章也要等很长时间,并且安装了这个插件,不妨用下面的方法排查一下,确定这段代码的执行时间是否过长:

用文本编辑器打开该插件目录下的main.php,即baidusubmit/main.php
查找:publishPost
可找到以下代码:

static function publishPost($postid)
{
    require_once dirname(__FILE__) . DIRECTORY_SEPARATOR . './inc/sitemap.php';
    $schema = BaidusubmitSitemap::genSchemaByPostId($postid, $xpost);
    if ('publish' != $xpost->post_status || '' != $xpost->post_password) {
        self::deletePost($postid);z
        return;
    }
    $xml = $schema->toXml();
    $content = BaidusubmitSitemap::genPostXml($xml);
    //file_put_contents('/home/work/baidusubmit.log',  date('[Y-m-d H:i:s]')."\n".$content, FILE_APPEND);
    $r = BaidusubmitSitemap::sendXml($content, 1);
    //file_put_contents('/home/work/baidusubmit.log', date('[Y-m-d H:i:s]')."\n".$r, FILE_APPEND);
}

改成以下代码,以便计算程序运行时间:

static function publishPost($postid)
{
    // 标记程序执行开始时间
    list($usec, $sec) = explode(" ",microtime());
    $time_start =  ((float)$usec + (float)$sec);

    require_once dirname(__FILE__) . DIRECTORY_SEPARATOR . './inc/sitemap.php';
    $schema = BaidusubmitSitemap::genSchemaByPostId($postid, $xpost);
    if ('publish' != $xpost->post_status || '' != $xpost->post_password) {
        self::deletePost($postid);z
        return;
    }
    $xml = $schema->toXml();
    $content = BaidusubmitSitemap::genPostXml($xml);
    //file_put_contents('/home/work/baidusubmit.log',  date('[Y-m-d H:i:s]')."\n".$content, FILE_APPEND);
    $r = BaidusubmitSitemap::sendXml($content, 1);
    //file_put_contents('/home/work/baidusubmit.log', date('[Y-m-d H:i:s]')."\n".$r, FILE_APPEND);

    // 标记程序执行结束时间
    list($usec, $sec) = explode(" ",microtime());
    $time_end =  ((float)$usec + (float)$sec);

    // 计算程序执行总用时
    $time = $time_end - $time_start;

    // 发送邮件,将ludou#ludou.org改成你的邮件地址
    wp_mail('ludou#ludou.org', '程序用时', '总时长(单位:秒):'.$time);
}

将代码中的 ludou#ludou.org 改成你的邮箱地址,然后上传到你的网站服务器,并在WordPress后台发布或更新一篇文章,这时你的邮箱中就会收到一封标题为 程序用时 的邮件,邮件内容中就会看到程序运行时长。我这里测试的运行时间是15秒,这样的时间实在没法忍受,不过看在它还有点用处的份上,还是忍忍吧。

最后,测试完毕,记得将代码还原到修改之前。

PS:小清新图片建议,关闭实时推送可以缓解这个问题。

另附正经解决方案:
修改一下第一段代码publishPost函数的运行机制,让实时推送只在第一次发布文章时进行,以后再继续修改文章就没那么慢了。修改后的代码看起来是这样的:

static function publishPost($postid)
{
   // 新增的代码
   if (wp_is_post_revision($postid) ||
       get_post_status($postid) != 'publish' ||
       $_POST['original_post_status'] == 'publish')
      return;
   
   // 后面的代码不变
   require_once dirname(__FILE__) . DIRECTORY_SEPARATOR . './inc/sitemap.php';

-- 完 --

本文采用 「CC BY-NC-SA 4.0」创作共享协议,转载请标注以下信息:
原文出处:露兜即刻 https://www.ludou.org/baidu-submit-take-long-time-to-publish-post.html
露兜
kaapass@outlook.com  QQ 825533758

业余编程爱好者。

37 条留言

点此留言
1 2 711
  1. 汉克博客

    百度新出的实时推送不知道露兜有没去研究呢

  2. 狂族晨曦 狂族晨曦

    我发现百度sitemap把我的一些文章的修订链接都提交了,整的在百度站长看到抓取异常里找不到页面净是404,赶紧把启用关了

1 2

发表留言