web-dev-qa-db-ja.com

Wp_insert_postとwp_update_postによる無限ループ

URLを含む$unqiuesという配列があります。URLのタイトルを取得し、新しい投稿を挿入し、投稿メタを更新するには、以下のコードで配列をループ処理します。それから私は投稿のタイトルと名前をwp_insert_postによって返された$ pidに変更します。

これにより無限ループが発生しました。$ unique配列には約600以下のURLがあります。私はちょうど私のホスト上で1時間以内に75,000クエリをヒットし、制限がリセットされるまで1時間待たなければなりません。無限ループの原因は何ですか?このコードは、配列内の10個のURLでテストしたときに機能しました。

これをどのようにもっと効率的に書くことができるでしょうか。

ありがとう

foreach($uniques as $unique){
      $pagetitle = getTitle($unique);
      $new_post = array(
            'post_title' => $unique,
            'post_status'   => 'publish',
            'post_type' => 'websites'
        );
        $pid = wp_insert_post($new_post);

        update_post_meta($pid,'title', $pagetitle);
        update_post_meta($pid,'url',$unique);


          $my_post = array(
              'ID'           => $pid,
              'post_title' => $pid,
              'post_name' => $pid
          );

          wp_update_post( $my_post );
}
3
Anagio

確かにもっと効率的な方法で書くことができます(未テスト)。

$added = array();
global $wpdb;
foreach($uniques as $unique){
  $pagetitle = getTitle($unique);
  $new_post = array(
    'post_title' => $unique,
    'post_status' => 'publish',
    'post_type' => 'websites'
  );
  $pid = wp_insert_post($new_post);
  if ($pid) {
    $wpdb->query( $wpdb->prepare(
      "INSERT INTO $wpdb->postmeta (post_id, meta_key, meta_value) VALUES
       (%d, '%s', '%s'), (%d, '%s', '%s')",
       $pid, 'title', $pagetitle, $pid, 'url', $unique
    ) );
    $added[] = $pid;
  }
}
if ( ! empty($added) ) {
   $ids = implode(',', $added); 
   $wpdb->query("UPDATE $wpdb->posts SET `post_title` = `ID`, `post_name` = `ID` WHERE `ID` IN ($ids)");
}

600個のURLを使用すると、このコードの実行回数はあなたのものより1200回少なくなりますが、おそらく十分ではありません...

3
gmazzap