[英]Woocommerce plugin - update stock
我创建了wordpress插件,并通过csv自定义文件添加了新产品和类别。 它工作得很好,在time_limit(60s)中,我的脚本在'wp_posts'中添加了4500个产品,在'wp_postmeta'中添加了约9万行。
现在,当我尝试从csv更新此产品的库存(更新或DELETE + INSERT)时,大约一千行脚本停止(超时)。
您是否知道任何更好的方式(比“ $ 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>';
}
}
}
在数据库中创建一个临时表,其结构与csv文件中的数据相同。
使用load data infile命令将csv文件的内容导入到临时表中。
在重复键更新...语句上使用insert ...语句(如果定义了适当的唯一索引或主键),或者对子查询和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
删除临时表。
这样就无需在php中使用任何循环。 优化Load data infile
以将大量数据快速加载到MySQL中。
如果您想保留循环,即使如此,也不要在每个循环中准备delete语句。 您只能准备一次,然后将其与其他参数一起使用。 这就是准备好的语句的主要用途。 另外,在循环中创建大容量插入语句以在1个sql查询中插入多个记录。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.