php - Woocommerce 插件 - 更新库存

标签 php mysql wordpress csv woocommerce

我创建了 WordPress 插件,从 csv 自定义文件添加新产品和类别。它工作正常,在 time_limit (60 秒)内,我的脚本将 4500 个产品添加到“wp_posts”,并将大约 90k 行添加到“wp_postmeta”。

现在,当我尝试从 csv 更新(更新或删除 + 插入)该产品的库存时,在大约 1k 行后脚本停止(超时)。

你知道有什么更好的方法(比'$wpdb->query'和php循环更好)来更新这个股票吗?

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>';
        }
    }
}

最佳答案

  1. 在数据库中创建一个临时表,其结构与 csv 文件中的数据相同。

  2. 使用 load data infile 将 csv 文件的内容导入到临时表中命令。

  3. 使用 insert ... on duplicate key update ...语句(如果您定义了适当的唯一索引或主键),或使用带有子查询和 insert ... select ... 的删除。更新数据的语句。

    --删除匹配记录 从 wp_postmeta 中删除 在 wp_postmeta.meta_value=#your_temp_table.second_column_name 上使用 wp_postmeta 内部联接 #your_temp_table

    --插入临时表中的数据 插入 wp_postmeta select * -- 如果临时表中的字段顺序与 wp_postmeta 表中的字段顺序不同,则列出字段 来自#your_temp_table

  4. 删除临时表。

这样就不需要在 php.ini 中使用任何循环了。 Load data infile经过优化,可快速将大量数据加载到MySQL中。

如果您想保留循环,即使这样也不要在每个循环中准备删除语句。您只需准备一次,然后将其与不同的参数一起使用。这就是准备好的陈述的主要用途。另外,在循环中创建批量插入语句,以在 1 个 SQL 查询中插入多条记录。

关于php - Woocommerce 插件 - 更新库存,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38978278/

相关文章:

php - 用于 WordPress 中非唯一列更新的 MySQL 重复条目

php - 时间数组找到一个比设定时间早 15 分钟的时间

PHP - 图像输出 : strange string

mysql - 锁的数据库列与 native 锁定函数

html - 需要 wordpress 插件

css - 向右移动重力提交按钮

php - 无法从 Bigcommerce API 获取访问 token ,客户端 ID 无效

php - 在 View 中管理表中过多的列数据

Mysql恢复数据库过程中语法错误

mysql - 获取 MySQL 服务器时间作为 Sequelize findOne() 查询的一部分