web-dev-qa-db-ja.com

一度に何百もの投稿を挿入する

Wp_insert_postとupdate_post_metaを実行する25フィールドの200k +行の配列を作成するプロジェクトがあります。それを開始するためにかなり速く処理するのは10kレコードかそこら後にかなり遅くなります。

これを行うより効率的な方法はありますか? SQLクエリを使用してこれらの投稿を直接作成してPHPをスキップできるようにするためのMySQLストアドプロシージャはありますか?

echo "get list of posts to be created in wordpress \n";
//RETURNS ALL OFFER DATA OF POSTS THAT NEED TO BE ADDED
$sql = "SELECT a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w,x,y,z FROM offer WHERE modified = '1';";
$rst = $wpdb->get_results($sql,ARRAY_N); //run query
if(is_null($rst)){
  echo mysql_error() . "\n";
}else{
  echo "done \n";
}
echo "creating posts \n";;
foreach($rst as $r){
  //print_r($r);
  $my_post = array(
       'post_title' => $r[0],
       'post_status' => 'publish',
       'post_author' => 72,
       'post_category' => array(16)
    );

  // Insert the post into the database
  $newOffer = wp_insert_post( $my_post );

  if(!$newOffer){
    echo "problem creating the post " . $r[0];
  }

  array_unshift($r,$newOffer); // so that the data positions matches when calling updateMetaData 

  if($newOffer){
    updateMetaData($newOffer,$r);
  }
}

function updateMetaData($id,$data){
  global $wpdb;
  $category = $wpdb->get_results('SELECT categoryName FROM category WHERE categoryIdentifier ="'.mysql_escape_string($data[8]).'"');
  if($category){
    wp_set_object_terms( $id, array($category[0]->categoryName,16), 'category');
  }

  update_post_meta($id,'a','yes');
  update_post_meta($id,'b',$data[1]);
  $year = substr($data[2],0, -4);
  $mon = substr($data[2], -4, 2);
  $day = substr($data[2], -2); 
  update_post_meta($id,'c',$mon."/".$day."/".$year." 12:00:00 AM");
  $year = substr($data[3],0, -4);
  $mon = substr($data[3], -4, 2);
  $day = substr($data[3], -2); 
  update_post_meta($id,'d',$mon."/".$day."/".$year." 12:00:00 AM");
  update_post_meta($id,'e',$data[4]);//description
  update_post_meta($id,'f',$data[5]);
  update_post_meta($id,'g',$data[6]);
  update_post_meta($id,'h',$data[7]);
  update_post_meta($id,'i',$data[8]);
  update_post_meta($id,'j',$data[9]);
  update_post_meta($id,'k',$data[10]);
  update_post_meta($id,'l',$data[11]);
  update_post_meta($id,'m',$data[12]);
  update_post_meta($id,'n',$data[13]);
  update_post_meta($id,'o',$data[14]);
  update_post_meta($id,'p',$data[15]);
  update_post_meta($id,'q',$data[16]);
  update_post_meta($id,'r',$data[17]);
  update_post_meta($id,'s',$data[18]);
  update_post_meta($id,'t',$data[19]);
  update_post_meta($id,'u',$data[20]);
  update_post_meta($id,'v',$data[21]);
  update_post_meta($id,'w',$data[22]);
  update_post_meta($id,'x',$data[23]);
  update_post_meta($id,'y',$data[24]);
  update_post_meta($id,'z',$data[25]);
  $year = null;
  $mon = null;
  $day = null;
  //echo "wordpress post meta updated.\n";
}
2
Depthless

私が考えることができる2つの理由がマイナスの影響を引き起こすかもしれないということです

  1. wp_insert_postは、書き込み後にDBから投稿を取得します。これは楽しいことではありませんが、一定の影響しか与えないはずなので、それはあなたの主な問題ではないと思います

  2. 各投稿はキャッシングプロセスの一部としてメモリに保存されています、そして最後にこれはあなたのサーバが物理的なメモリを使い果たしそしてスワップを開始するときに詰まらせます。スクリプトの最初でキャッシュを一時停止するwp_suspend_cache_additionを呼び出してみてください。

wp_suspend_cache_addition(true);

echo "get list of posts to be created in wordpress \n";
2
Mark Kaplun