2016-08-16 7 views
0

私は、csvカスタムファイルから新しい製品とカテゴリを追加してwordpressプラグインを作成しました。それはうまくいきます、time_limit(60s)で私のスクリプトは4500製品を 'wp_posts'に、90k行を 'wp_postmeta'に追加します。Woocommerceプラグイン - 更新在庫

今、約1k行のスクリプトが停止した後(タイムアウト)、csvからこの製品の在庫を更新(UPDATEまたはDELETE + INSERT)しようとします。

あなたはこの株を更新するための良い方法( '$ wpdb-> query'とphp loopよりも良い)を知っていますか?

if (isset($_POST['wool_stock_import_form_submitted'])) { 

    $hidden_field = esc_html($_POST['woostol_stock_import_form_submitted']); 

    if ($hidden_field == 'Y') { 

     // Prepare csv file 

     $addlist = $_FILES['addlist']; 

     $addlist_tmp_name = $_FILES['addlist']['tmp_name']; 
     $addlist_name  = $_FILES['addlist']['name']; 
     $addlist_size  = $_FILES['addlist']['size']; 
     $addlist_type  = $_FILES['addlist']['type']; 
     $addlist_error  = $_FILES['addlist']['error']; 

     $addlist_array = array(); 
    } 

     if ($_POST['submit']){ 
     $row = 1; 
     if (($handle_addlist = fopen($addlist_tmp_name, "r")) !== FALSE) { 
      while (($data = fgetcsv($handle_addlist, 1000, ";")) !== FALSE) {   
       $row++;    
       $addlist_array_tmp = array(); 

        for ($i=0; $i < 99; $i++) { 

         if(!empty($data[$i])){ 
          array_push($addlist_array_tmp, $data[$i]); 
         } 
        } 
       array_push($addlist_array, $addlist_array_tmp); 
      } 
      fclose($handle_addlist); 
     } 
    } 

    foreach ($addlist_array as $stock) { 

     $results = $wpdb->get_var($wpdb->prepare( 
      " 
       SELECT post_id 
       FROM wp_postmeta 
       WHERE meta_value = %s 
      ", 
      $stock[0] 
     )); 

     /* $wpdb->update( 
      'wp_postmeta', 
      array( 
       'meta_value' => $stock[2] 
      ), 
      array(
       'post_id' => $results, 
       'meta_key' => '_stock' 
      ), 
      array( 
       '%s', 
      ), 
      array('%d','%s') 
     ); */ 


     if (!empty($results)) { 

      $wpdb->query( 
       $wpdb->prepare( 
        " 
        DELETE FROM wp_postmeta 
        WHERE post_id = %d 
        AND meta_key = %s 
        ", 
         $results, '_stock' 
        ) 
      ); 

      $wpdb->insert(
       'wp_postmeta', 
       array(
         'post_id' => $results, 
         'meta_key' => '_stock' 
        ), 
       array(
         '%d', 
         '%s' 
        ) 
      ); 


      $wpdb->show_errors(); 

      echo 'blabla ' . $stock[0] . ' OK ' . date('Y-m-d H:i:s') . '<br>'; 

     } else { 

      echo 'blabla ' . $stock[0] . ' ' . date('Y-m-d H:i:s') . '<br>'; 
     } 
    } 
} 

答えて

2
  1. csvファイルのデータと同じ構造を持つデータベース内の一時テーブルを作成します。

  2. load data infileコマンドを使用して、csvファイルの内容を一時テーブルにインポートします。

  3. insert ... on duplicate key update ...ステートメント(適切な一意のインデックスまたはプライマリキーが定義されている場合)を使用するか、サブクエリおよびinsert ... select ...ステートメントでdeleteを使用してデータを更新します。

    --delete matching records delete from wp_postmeta using wp_postmeta inner join #your_temp_table on wp_postmeta.meta_value=#your_temp_table.second_column_name

    --insert the data from the temp table insert into wp_postmeta select * -- if the fields are different order in your temp table than in the wp_postmeta table, then list the fields from #your_temp_table

  4. 一時テーブルをドロップします。

この方法では、PHP内でループを使用する必要はありません。 Load data infileは大量のデータをMySQLに素早くロードするように最適化されています。

ループを維持したい場合は、すべてのループでdelete文を準備しないでください。それを一度だけ準備してから、別のパラメータで使用することができます。それは準備された陳述が主にであるものです。また、1つのSQLクエリに複数のレコードを挿入するためにループに一括挿入ステートメントを作成します。

関連する問題