Wordpress更新帖子优化

时间:2018-01-16 15:30:40

标签: php mysql wordpress

背景

我有一个每24小时运行一次的cron作业,它通过特定帖子类型的每个帖子,并使用从api收集的新数据更新帖子。此时它正在运作。但那只是因为只有大约1500个帖子。但我知道这会增加到约40000-80000个职位。

目前运行更新大约需要20分钟(主要是因为api的请求限制为30个呼叫/分钟)。所以我无能为力。我在数据库中发布的帖子越多,就会花费更长的时间。

我也在使用ACF专业版为帖子类型添加字段。

但是我担心的是数据库会出错,因为sql调用很多而且很多。

今天看起来如何

目前的设置如下:

  • 服务器1:网络服务器
  • 服务器2:Mysql服务器

目前更新代码看起来像这样,我觉得必须有更好的方法来做到这一点。

public function updatePosts($apiPosts){

  /** Loop thru every post from the api, these are setup in another function */
  foreach($apiPosts as $post){
  /** Look to see if a post exist with the code */
     $args = [
       'post_type' => 'my_custom_post_type',
       'meta_key'  => 'code',
       'meta_value' => $post->code,
       'posts_per_page' => 1
     ];
     $post = get_posts($args);

     /** If no post was found, create a new post */
     if(!$post[0]){
       $newPost = [
          'post_title' => $post->title,
          'post_type'  => 'my_custom_post_type',
          'post_status' => 'publish'
       ]
       $post_id = wp_insert_post($newPost);
     }else{
       $post_id = $post[0]->ID
     }

     /** Update the acf fields on the post */
     update_field('field1', $post->field1, $post_id);
     update_field('field2', $post->field2, $post_id);
     update_field('field3', $post->field3, $post_id);
     update_field('field4', $post->field4, $post_id);
     update_field('field5', $post->field5, $post_id);
     update_field('field6', $post->field6, $post_id);
     update_field('field7', $post->field7, $post_id);
  }
}

我愿意接受你提出的所有建议。我有一种感觉,需要优化这一点。因为在那个循环中,如前所述,它可以很容易地通过循环播放40000个帖子。

1 个答案:

答案 0 :(得分:1)

我会将这些数据拆分为较小的部分,例如:

  1. 单独存储api数据(选项表中的某处)
  2. 将更新操作设置为更频繁地运行,WP最多可以每10分钟使用一次限制,但即使超时一分钟也会有效(但是,您需要调整cron_scheldules
  3. 将get_posts替换为查询到postmeta表中的db的查询,如果找到则仅返回帖子ID。
  4. 针对特定的帖子运行它。一旦执行了后检查(从api)执行从api队列删除帖子。
  5. 更新完成后(比如50个帖子),更新API队列。
  6. 我认为,更新不会总是更新帖子(比如信息没有改变),在运行更新之前找到检查这个的方法,你可以从队列中删除所有不会被更新的帖子(因此你的更新行动)。
  7. 更新

    1. 您还可以填充自定义字段信息一个fiels并存储其中的数组(稍后将反序列化并在前端使用)。只有这个操作才会减少sql查询(和缓存丢弃)数量减少7个查询。

      update_post_meta($ID, '_global_meta', $array_of_updated_data);