如何通过SQL将70万条CSV商品数据导入WooCommerce?
直接导入CSV到WooCommerce数据库的实操方案
完全可以直接通过SQL导入CSV数据到WooCommerce核心表,这比后台CSV导入效率高得多,尤其适合70万条这种大规模数据。以下是严格对应你提供的CSV字段的实操步骤:
一、前置准备
- 必须先备份数据库,大规模数据操作一旦出错,备份是唯一的补救方式
- 把CSV转成UTF-8编码,清理数据:确保价格列是纯数字(去掉$、逗号等符号),SKU无重复,制造商名称统一格式(比如避免"ABC"和"abc"并存)
- 先拿10条测试数据跑完全流程,确认没问题再批量处理70万条
二、导入wp_posts表
每条商品对应wp_posts的一条记录,核心字段对应关系:
post_title= CSV里的Part Namepost_type= 'product'(固定值)post_status= 'publish'(直接上架,也可设为'draft'后续批量修改)post_author= 你的管理员ID(一般是1,可从wp_users表查询)post_date/post_date_gmt= 当前时间(比如NOW())- 其他字段(post_content、post_excerpt等)可留空
用MySQL的LOAD DATA INFILE命令批量导入,示例代码(替换你的表前缀和CSV路径):
LOAD DATA INFILE '/path/to/your/products.csv' INTO TABLE wp_posts FIELDS TERMINATED BY ',' ENCLOSED BY '"' LINES TERMINATED BY '\n' IGNORE 1 ROWS (post_title, @dummy, @dummy, @dummy, @dummy) SET post_type = 'product', post_status = 'publish', post_author = 1, post_date = NOW(), post_date_gmt = NOW(), comment_status = 'closed', ping_status = 'closed';
注:@dummy用来占位CSV里的其他列(SKU、制造商、价格),这些字段要放到wp_postmeta里,这里只处理post_title
为了后续关联数据更方便,建议先把CSV导入一个临时表:
CREATE TEMPORARY TABLE temp_products ( sku VARCHAR(255), post_title VARCHAR(255), manufacturer VARCHAR(255), sale_price DECIMAL(10,2), regular_price DECIMAL(10,2) ); LOAD DATA INFILE '/path/to/your/products.csv' INTO TABLE temp_products FIELDS TERMINATED BY ',' ENCLOSED BY '"' LINES TERMINATED BY '\n' IGNORE 1 ROWS;
三、导入wp_postmeta表
WooCommerce用wp_postmeta存储商品的SKU、价格等元数据,需要插入以下核心字段:
_sku:对应CSV的Part Number_regular_price:对应Regular Price_sale_price:对应Sale Price_price:显示价格,优先取sale_price,无则取regular_price_visibility:固定为'visible'(商品可见)_stock_status:固定为'instock'(默认有货,可根据需求修改)
用关联临时表的方式批量插入:
-- 插入SKU INSERT INTO wp_postmeta (post_id, meta_key, meta_value) SELECT p.ID, '_sku', t.sku FROM wp_posts p JOIN temp_products t ON p.post_title = t.post_title; -- 插入常规价格 INSERT INTO wp_postmeta (post_id, meta_key, meta_value) SELECT p.ID, '_regular_price', t.regular_price FROM wp_posts p JOIN temp_products t ON p.post_title = t.post_title; -- 插入促销价格(仅当有值时) INSERT INTO wp_postmeta (post_id, meta_key, meta_value) SELECT p.ID, '_sale_price', t.sale_price FROM wp_posts p JOIN temp_products t ON p.post_title = t.post_title WHERE t.sale_price IS NOT NULL AND t.sale_price > 0; -- 插入显示价格 INSERT INTO wp_postmeta (post_id, meta_key, meta_value) SELECT p.ID, '_price', CASE WHEN t.sale_price IS NOT NULL AND t.sale_price > 0 THEN t.sale_price ELSE t.regular_price END FROM wp_posts p JOIN temp_products t ON p.post_title = t.post_title; -- 插入可见性和库存状态 INSERT INTO wp_postmeta (post_id, meta_key, meta_value) SELECT ID, '_visibility', 'visible' FROM wp_posts WHERE post_type = 'product'; INSERT INTO wp_postmeta (post_id, meta_key, meta_value) SELECT ID, '_stock_status', 'instock' FROM wp_posts WHERE post_type = 'product';
四、处理Manufacturer分类
如果你的Manufacturer是WooCommerce的自定义分类法(taxonomy:manufacturer),需要同步到分类表:
- 先插入唯一的制造商到wp_terms和wp_term_taxonomy:
-- 插入制造商到wp_terms(自动去重) INSERT IGNORE INTO wp_terms (name, slug) SELECT DISTINCT manufacturer, REPLACE(LOWER(manufacturer), ' ', '-') FROM temp_products; -- 关联到manufacturer分类法 INSERT IGNORE INTO wp_term_taxonomy (term_id, taxonomy, description, parent, count) SELECT t.term_id, 'manufacturer', '', 0, 0 FROM wp_terms t JOIN temp_products tp ON t.name = tp.manufacturer;
- 关联商品和制造商分类:
INSERT INTO wp_term_relationships (object_id, term_taxonomy_id) SELECT p.ID, tt.term_taxonomy_id FROM wp_posts p JOIN temp_products tp ON p.post_title = tp.post_title JOIN wp_terms t ON t.name = tp.manufacturer JOIN wp_term_taxonomy tt ON tt.term_id = t.term_id AND tt.taxonomy = 'manufacturer';
五、注意事项
- 70万条数据建议分批次导入,比如每次导入1万条,避免数据库超时(可拆分CSV或修改SQL的LIMIT参数)
- 导入前关闭WooCommerce的缓存、自动更新插件,减少数据库负载
- 导入完成后,重建WooCommerce产品索引:可以用WP CLI命令
wp wc product resync --all,或者后台进入「WooCommerce > 状态 > 工具」点击「重建产品查找表」
内容的提问来源于stack exchange,提问作者GuestofHonor
相关产品推荐
相关产品推荐

