WooCommerce:从CSV文件批量删除指定ID的商品及关联内容
批量删除WooCommerce商品及关联内容的可行方案
针对你需要批量删除12000个WooCommerce商品(含所有关联内容)的需求,我整理了几个经过验证的方案,你可以根据自己的技术能力选择:
一、自定义PHP脚本(最安全可控,推荐)
这个方案利用WooCommerce原生函数处理删除逻辑,能自动清理商品的关联元数据、分类关联等内容,还能避免一次性处理过多数据导致超时。
步骤如下:
- 准备商品ID列表:把CSV里的商品ID提取出来,转成数组格式(比如
$product_ids = [1001,1002,1003,...]),如果ID数量多,也可以在脚本里直接读取CSV文件。 - 创建脚本文件:在你的WordPress根目录新建一个
bulk-delete-products.php文件,内容如下:
<?php // 加载WordPress环境 require_once('wp-load.php'); // 提高执行时间和内存限制,避免中途中断 set_time_limit(0); ini_set('memory_limit', '256M'); // 替换成你的商品ID列表,或者编写CSV读取逻辑 $product_ids = [1001, 1002, 1003]; // 示例ID,替换为实际ID $batch_size = 100; // 每批处理的商品数量,可根据服务器性能调整 // 分批处理商品删除 for ($i = 0; $i < count($product_ids); $i += $batch_size) { $batch = array_slice($product_ids, $i, $batch_size); foreach ($batch as $product_id) { // 先校验商品是否存在 $product = wc_get_product($product_id); if ($product) { // 用WooCommerce原生函数删除,自动清理关联的元数据、分类等 wc_delete_product($product_id); echo "已删除商品ID: {$product_id}<br>"; } else { echo "商品ID: {$product_id} 不存在,跳过<br>"; } } // 每批处理后休眠2秒,减轻服务器压力 sleep(2); } echo "批量删除任务完成!"; ?>
- 执行脚本:通过浏览器访问
你的域名/bulk-delete-products.php,等待执行完成。 - 清理脚本:执行完毕后务必删除这个脚本文件,避免安全风险。
注意:如果你的商品包含变种(product_variation类型),需要把变种ID也加入到ID列表中,或者在脚本里添加逻辑,先查询父商品的所有变种ID再批量删除。
二、SQL查询(适合有数据库操作经验的用户)
直接操作数据库效率最高,但风险也大,务必先完整备份数据库,并且先用少量ID测试验证逻辑。
假设你的WordPress数据库前缀是wp_,按顺序执行以下SQL语句:
- 删除商品关联的元数据:
DELETE FROM wp_postmeta WHERE post_id IN (你的商品ID列表,用逗号分隔);
- 删除商品的分类/标签关联:
DELETE FROM wp_term_relationships WHERE object_id IN (你的商品ID列表);
- 删除WooCommerce商品元数据查找表的记录:
DELETE FROM wp_woocommerce_product_meta_lookup WHERE product_id IN (你的商品ID列表);
- 最后删除商品本身(同时处理主商品和变种):
DELETE FROM wp_posts WHERE ID IN (你的商品ID列表) AND post_type IN ('product', 'product_variation');
如果需要删除订单中关联的商品项(谨慎操作,订单记录通常建议保留),可以执行:
DELETE oi, oim FROM wp_woocommerce_order_items oi JOIN wp_woocommerce_order_itemmeta oim ON oi.order_item_id = oim.order_item_id WHERE oi.order_item_type = 'line_item' AND oim.meta_key = '_product_id' AND oim.meta_value IN (你的商品ID列表);
三、优化现有旧插件
你提到的那款旧插件运行不佳,大概率是因为没有做分批处理,导致超时或内存不足。可以尝试修改插件代码:
- 找到插件中处理批量删除的核心函数,添加分批处理逻辑(类似上面脚本的
batch_size设置)。 - 在函数开头添加执行时间和内存限制:
set_time_limit(0); ini_set('memory_limit', '256M');
- 每次处理一批后添加短暂休眠,减轻服务器压力。
通用注意事项
- 备份优先:无论用哪个方案,都要先备份网站文件和数据库,避免数据丢失。
- 先测试:先用少量商品ID测试删除逻辑,确认关联内容都被正确清理后再批量操作。
- 服务器限制:如果服务器有严格的执行时间限制,分批处理是必须的,避免脚本中途中断。
内容的提问来源于stack exchange,提问作者Huluti




