Bulk add 1.000 SKU cho lần mở shop mới, mass update giá theo phần trăm khi chạy sale, hay đồng bộ tồn kho hàng ngày từ Excel kế toán — ba use case này nuốt 40-80 giờ thao tác tay nếu add từng product qua wp-admin. CSV import của WooCommerce rút thời gian xuống 30-60 phút.
Bài này bóc 60+ cột CSV chuẩn, pattern variation phức tạp nhất, image bulk + tránh hotlink, edge case decimal locale, và workflow CLI cho shop 10k+ SKU.
Khi nào CSV thắng manual và khi nào không
Add product manual qua wp-admin còn hợp lý khi dưới 20 SKU và mỗi product cần tinh chỉnh image gallery + description riêng. Trên ngưỡng đó, mỗi product mất trung bình 90-120 giây ngay cả khi đã quen thao tác.
CSV bù lại với batch — 1.000 dòng import 5-15 phút trên hosting tầm trung. Trade-off: tốn 30-60 phút prep CSV và verify cột, nhưng lợi suất gấp 30-50 lần với volume từ 50 SKU trở lên.
Bảng so sánh use case
| Use case | Volume | Method | Thời gian |
|---|---|---|---|
| Add 5-10 SKU mới | 5-10 | Manual wp-admin | 15-30 phút |
| Mở shop mới scratch | 50-500 | CSV import | 2-4 giờ |
| Mass update giá flash sale | Toàn bộ catalogue | Export → Excel → import | 30-60 phút |
| Re-organize category | 100-2.000 | CSV column Categories | 1-2 giờ |
| Sync ERP daily | 5.000+ | WP-CLI hoặc REST API batch | Auto cron 15-30 phút |
Ngưỡng nên chuyển CSV sang REST API
CSV import qua wp-admin chạm trần ở 5.000 SKU trên hosting shared do PHP memory_limit và max_execution_time. Vượt ngưỡng đó, import treo giữa chừng, một phần product đã ghi DB, phần còn lại mất.
- 5.000-10.000 SKU: split CSV thành chunks 1.500 dòng, import lần lượt. Mỗi chunk verify count trước khi import chunk tiếp theo.
- 10.000+ SKU: chuyển sang WP-CLI
wp wc product createhoặc REST API endpointPOST /wc/v3/products/batch— nhanh hơn CSV web 5-10 lần. - Sync continuous từ ERP: cron job đọc CSV từ FTP server, gọi REST API batch 100 product/request. Không nên đi qua UI vì timeout request.
Bước 1 — Export CSV chuẩn từ shop hiện có
WooCommerce có built-in export tại Products → Export. Workflow này phù hợp cho mass update giá, backup catalogue trước migrate, hoặc tạo template để add product mới với cấu trúc identical.
5 thao tác cần làm khi export
- Vào Products → Export, chọn “Export all columns” cho lần đầu để có CSV reference đầy đủ.
- Filter theo Product type nếu chỉ cần subset (simple, variable, grouped, external).
- Filter theo Category khi cần export 1 nhóm để mass edit giá riêng.
- Tick “Export custom meta” nếu shop có ACF hoặc Carbon Fields cần preserve.
- Generate CSV và download — file output UTF-8, mở được trong Excel và Google Sheets.
60+ cột CSV cốt lõi cần nắm
# Cột bắt buộc và quan trọng nhất
ID # Empty cho new product, có giá trị = update existing
SKU # Unique identifier — duplicate sẽ overwrite
Name # Tên product (required)
Type # simple, variable, grouped, external, variation
Published # 1 = published, 0 = draft, -1 = private
Visibility in catalog # visible, hidden, search, catalog
Short description # Excerpt hiển thị shop archive
Description # Full description (HTML allowed)
Tax status # taxable, shipping, none
Tax class # standard, reduced-rate, zero-rate
In stock? # 1 = yes, 0 = no
Stock # Integer
Backorders allowed? # 1, 0, notify
Sold individually? # 1 = chỉ bán 1 đơn vị mỗi order
Weight (kg) # 0.5
Length (cm) # 20
Width (cm) # 15
Height (cm) # 10
Allow customer reviews? # 1, 0
Purchase note # Note gửi customer sau khi mua
Sale price # Giá khuyến mãi
Regular price # Giá thường
Categories # "Áo > Áo thun, Bestseller" — phân cấp bằng >
Tags # "tag1, tag2, tag3"
Shipping class # standard, fragile
Images # URL full, phân tách bằng comma
Position # Order trong category
Parent # SKU parent (cho variation)
Attribute 1 name # Color, Size — đến Attribute 10
Attribute 1 value(s) # "Đỏ | Xanh | Đen" (pipe phân tách)
Attribute 1 visible # 1, 0
Attribute 1 global # 1 = global attribute, 0 = local
Bước 2 — Pattern variation phức tạp nhất trong CSV
Variation product (áo có size + màu, điện thoại có dung lượng + màu) là phần dễ sai nhất khi import CSV. Cấu trúc yêu cầu 1 row parent và N row con cho mỗi tổ hợp attribute.
Cấu trúc CSV cho variable product
# Ví dụ áo thun có 2 attribute: Size (S, M, L) + Color (Đen, Trắng)
# Tổng: 1 parent + 6 variation = 7 row
Type | SKU | Name | Parent | Attribute 1 name | Attribute 1 value(s) | Attribute 2 name | Attribute 2 value(s) | Regular price
----------|-----------|----------------|-----------|------------------|----------------------|------------------|----------------------|---------------
variable | AOTHUN-01 | Áo thun basic | | Size | S | M | L | Color | Đen | Trắng |
variation | AOTHUN-01-S-DEN | | id:AOTHUN-01 | Size | S | Color | Đen | 199000
variation | AOTHUN-01-S-TRANG | | id:AOTHUN-01 | Size | S | Color | Trắng | 199000
variation | AOTHUN-01-M-DEN | | id:AOTHUN-01 | Size | M | Color | Đen | 199000
variation | AOTHUN-01-M-TRANG | | id:AOTHUN-01 | Size | M | Color | Trắng | 199000
variation | AOTHUN-01-L-DEN | | id:AOTHUN-01 | Size | L | Color | Đen | 219000
variation | AOTHUN-01-L-TRANG | | id:AOTHUN-01 | Size | L | Color | Trắng | 219000
4 lỗi variation phổ biến nhất
- Quên row parent type=variable: CSV chỉ có row variation → import báo “parent not found”, toàn bộ variation fail. Luôn đặt parent ở row trên cùng cluster.
- Attribute name khác nhau giữa parent và variation: parent “Size” với chữ S hoa, variation “size” thường → không match, variation không attach vào parent.
Copy-paste để đồng nhất.
- Parent SKU trong cột Parent không đúng format: phải là
id:SKUchứ không phảiSKUtrần. Format sai = variation thành simple product độc lập. - Variation thiếu Regular price: WooCommerce kế thừa từ parent nếu empty, nhưng UI shop không hiển thị nút “Add to cart” cho variation có price 0.
Bước 3 — Image bulk và tránh hotlink
Cột Images chấp nhận URL phân tách bằng comma, image đầu tiên auto thành featured image, các image sau vào product gallery.
WooCommerce sẽ download từ URL về uploads folder local khi import.
3 cách bulk upload image
- URL public trên CDN tạm: upload ảnh lên Cloudinary hoặc S3 bucket public, paste URL vào CSV. WooCommerce download về local khi import — tốn 1-3 giây mỗi image, phù hợp dưới 500 SKU.
- Upload trực tiếp vào uploads folder: SFTP toàn bộ image vào
wp-content/uploads/2026/05/, dùng URL localhttps://shop.vn/wp-content/uploads/2026/05/sku-01.webptrong CSV. Nhanh hơn 5-10 lần vì skip download step. - Plugin “Real Media Library” hoặc “WP All Import”: map image qua filename matching SKU, không cần URL trong CSV. Phù hợp với 5.000+ image phải organize theo cấu trúc folder.
Vì sao không nên hotlink từ CDN platform cũ
Khi migrate từ Shopify hoặc Haravan, nhiều shop tiết kiệm bằng cách giữ image URL trỏ về CDN cũ — sai lầm lớn về cả SEO và rủi ro mất ảnh.
- Shopify CDN block external request: sau khi shop đóng plan, CDN trả 403 hoặc redirect về Shopify homepage — ảnh shop mới mất hết sau 1-2 tháng.
- Mất control image SEO: alt text, image sitemap, image search ranking đều bị cắt khi domain image khác domain shop. Google ưu tiên image cùng domain.
- Page speed bị bottleneck: mỗi image cần DNS lookup + TLS handshake riêng tới domain CDN cũ — thêm 100-300ms mỗi lần khách load shop mới.
Bước 4 — Encoding tiếng Việt và decimal locale
Hai pain point lớn nhất với CSV WooCommerce VN: tiếng Việt lỗi hiển thị thành ký tự lạ, và giá tiền dùng dấu phẩy thay dấu chấm khiến WooCommerce parse sai.
Fix encoding UTF-8 cho Excel
# Excel Windows default save CSV với ANSI/CP1252 — sai cho tiếng Việt
# 3 cách fix:
# Cách 1 — Save As với encoding UTF-8 (Excel 2016+):
File → Save As → File Format → "CSV UTF-8 (Comma delimited) (*.csv)"
# Cách 2 — Google Sheets (khuyến nghị):
Upload Excel lên Drive → mở bằng Google Sheets → File → Download → CSV
Output default UTF-8, không cần config thêm
# Cách 3 — Verify encoding bằng terminal:
file -i products.csv
# Expected: products.csv: text/plain; charset=utf-8
# Convert nếu encoding sai:
iconv -f WINDOWS-1252 -t UTF-8 products.csv -o products_utf8.csv
Decimal locale — dấu chấm hay dấu phẩy
Excel cài đặt tiếng Việt mặc định coi dấu phẩy là decimal separator (1,5 = một phẩy năm). WooCommerce yêu cầu dấu chấm theo chuẩn US locale (1.5).
- Giá tiền VND: CSV phải ghi
199000(integer, không decimal, không separator) chứ không phải199,000hay199.000— WooCommerce sẽ format hiển thị thành 199.000đ theo cài đặt currency của shop. - Weight, dimension: dùng dấu chấm cho decimal —
0.5kg chứ không0,5. Lỗi này phá tính phí ship cho mọi đơn nếu shop dùng table rate shipping theo weight. - Settings → Advanced → WooCommerce: verify thousand separator và decimal separator của shop trước khi prep CSV, để format số trong CSV match.
Bước 5 — Mass update giá theo % discount
Use case lặp lại nhiều nhất: shop chạy flash sale 20% off toàn bộ catalogue, hoặc tăng giá 5% sau đợt nhập hàng. Manual edit từng product tốn 4-8 giờ với shop 500 SKU.
CSV làm trong 30 phút.
Workflow 6 bước mass update giá
# Step 1 — Export catalogue hiện tại
Admin → Products → Export → All columns
Save as products_current.csv
# Step 2 — Mở trong Google Sheets (an toàn encoding hơn Excel)
File → Import → Upload products_current.csv
# Step 3 — Add formula cho Sale price
# Cột Sale price = Regular price * 0.8 (giảm đáng kể)
# Round về 1.000đ gần nhất cho giá đẹp VND:
=ROUND(Z2 * 0.8, -3)
# Z2 là cell Regular price, -3 = round về nghìn
# Step 4 — Set Sale date (optional, cho flash sale)
# Cột "Date sale price starts": 2026-05-22
# Cột "Date sale price ends": 2026-05-29
# Step 5 — Download CSV (UTF-8 mặc định từ Google Sheets)
File → Download → Comma Separated Values (.csv)
# Step 6 — Import lại
Admin → Products → Import → Choose CSV
Tick "Update existing products" ✓
Tick "Skip" cho column ID + SKU để giữ nguyên
Click "Run the importer"
# Result: mọi product có Sale price = 80% Regular price
# WooCommerce auto hiển thị "Sale!" badge + giá gạch ngang
Chiến lược giá phổ biến cho shop VN
- Sale 20-30% theo category: filter export theo Category, edit Sale price riêng cho từng nhóm — áo 30%, quần 20%, phụ kiện 15%.
- Pricing tier theo volume: add custom meta
wholesale_price_50vàwholesale_price_100cho khách mua sỉ — dùng plugin Wholesale Suite để render khi khách đủ điều kiện. - Dynamic pricing theo nhập hàng: ERP push CSV mới mỗi tuần với cost price update — script cron tính sale price = cost * markup, tự import.
5 lỗi phổ biến khi import CSV và cách fix
- Tiếng Việt biến thành ký tự lạ: nguyên nhân encoding không phải UTF-8. Re-save bằng Google Sheets hoặc Excel option “CSV UTF-8 (Comma delimited)”.
- Image không hiện sau import: URL trong cột Images không accessible từ server WooCommerce (firewall block, CDN cũ trả 403).
Upload image lên uploads folder trước, dùng URL local.
- Variation import flat thành simple: CSV thiếu row parent type=variable, hoặc cột Parent không có format
id:SKU. Sửa cấu trúc CSV theo pattern parent + N row. - Category mới không tự tạo: default WooCommerce skip category chưa exist.
Tạo category trước qua Products → Categories, hoặc tick option “Create new categories” trong import wizard.
- Memory limit timeout với CSV lớn: hosting shared chạm trần ở 500-1.000 row. Split CSV thành chunks 300-500 row, import từng chunk.
Hoặc tăng
memory_limittrong php.ini lên 512MB.
Workflow CLI cho shop 10k+ SKU
Khi catalogue vượt 5.000 SKU, CSV import qua wp-admin trở thành điểm nghẽn — timeout, memory issue, không có log chi tiết khi fail. WP-CLI giải quyết với log đầy đủ, batch control, và ability to resume từ điểm fail.
Pattern WP-CLI import 10k+ product
# Cần SSH vào server có WP-CLI installed
# WP-CLI có command native cho WooCommerce import:
wp wc product create --user=admin
--name="Áo thun basic"
--type=simple
--regular_price=199000
--sku="AOTHUN-01"
# Cho bulk import từ CSV custom, viết script shell:
#!/bin/bash
while IFS=',' read -r sku name price stock; do
wp wc product create --user=admin
--sku="$sku"
--name="$name"
--regular_price="$price"
--manage_stock=true
--stock_quantity="$stock"
--type=simple
echo "Created: $sku"
done < products.csv
# Log output ra file để track progress:
./bulk-import.sh > import.log 2>&1
tail -f import.log # watch real-time
# Resume từ row N nếu script fail giữa chừng:
tail -n +500 products.csv > products_resume.csv
./bulk-import.sh < products_resume.csv
Bài liên quan trong cụm WooCommerce migration
Hoàn thiện kiến thức migrate WooCommerce với các bài chuyên sâu khác cùng cluster:
- Migrate đơn hàng cũ sang WooCommerce: schema + script + validation — bài đôi của bài này, focus order data thay vì product data.
- SEO redirect 301 khi migrate platform: chiến lược + implement + recovery — sau khi product + order đã sang, redirect URL là bước SEO bắt buộc.
- Migrate từ Shopify sang WooCommerce: 7 bước an toàn — workflow tổng thể bao gồm cả product CSV này.
- Migrate Haravan sang WooCommerce: API + CSV + verify — pattern tương tự cho platform Haravan.
- Dịch vụ thiết kế website WooCommerce chuyên nghiệp — gói thi công shop WooCommerce trọn gói cho shop Việt.
Câu hỏi thường gặp
WooCommerce built-in import có giới hạn gì so với plugin paid?
Built-in free đủ cho 90% case: simple product, variation cơ bản, image qua URL, custom meta. Hạn chế ở variation phức tạp (10+ attribute), scheduled import định kỳ, và import từ FTP/HTTP source remote.
Plugin “WooCommerce Product CSV Import Suite” (79 USD) hoặc “WP All Import Pro” (199 USD/năm) thêm các tính năng này. Shop dưới 1.000 SKU built-in đủ.
Shop có ERP đẩy CSV daily nên invest plugin để tự động hoá cron job.
Import variation luôn fail — có cách nào dễ hơn không?
Pattern parent + N row khá phức tạp nếu prep tay. Hai cách dễ hơn: dùng Google Sheets template có sẵn từ docs.woocommerce.com với formula auto generate variation row, hoặc dùng plugin “WooCommerce Bulk Variations” với UI grid để tạo variation rồi export ra CSV chuẩn.
Pattern thay thế: import variable product không có variation, sau đó vào edit product manual để thêm variation qua UI Variations tab — phù hợp khi chỉ có 5-20 variable product.
Sync hàng ngày từ ERP MISA hoặc Bravo có khả thi không?
Khả thi với 2 architecture. Cách 1: ERP export CSV cuối ngày lên FTP server, cron WordPress đọc + import qua WP All Import Pro scheduled task.
Cách 2: viết middleware Node.js hoặc PHP đọc REST API ERP, transform format, push qua WooCommerce REST API POST /wc/v3/products/batch.
Cách 1 setup nhanh (1-2 ngày dev), giới hạn ở 1.000-5.000 product/sync. Cách 2 scale lên 50.000+ product/sync, trade-off mất 5-10 ngày dev middleware và monitor.
Bulk delete product qua CSV có rủi ro gì?
WooCommerce hỗ trợ delete qua import với option “Delete existing products” hoặc cột meta _force_delete=1. Rủi ro chính: xoá nhầm product có order history → order hiển thị “Product no longer exists”, customer support phải lookup manual.
Workflow an toàn: backup DB qua UpdraftPlus, export full catalogue làm reference, chạy delete trên staging environment trước, verify product không có active order chưa hoàn thành, rồi mới chạy trên production.
CSV import có preserve được product review và rating không?
Built-in CSV import KHÔNG cover product review — review nằm trong table wp_comments với comment_type=review, không nằm trong product post. Cần migrate riêng qua SQL dump hoặc plugin “WooCommerce Customer/Order/Coupon Export”.
Cho shop migrate từ Shopify hoặc Haravan, review thường mất khi chuyển platform vì khác schema. Plugin “Reviews Importer for WooCommerce” hỗ trợ import review từ CSV với schema riêng — backup được rating trung bình và review text, nhưng mất user avatar và verified badge.
Triển khai shop WooCommerce trọn gói cho team Việt
CSV import giải quyết phần thao tác — nhưng setup shop WooCommerce production cần thêm theme, payment VN, ship VN, SEO foundation, performance tuning. Team Web22 thi công full feature từ scratch hoặc migrate từ Shopify, Haravan, Sapo sang WooCommerce theo gói cố định, không phát sinh sau ký hợp đồng.
Dịch vụ thiết kế WooCommerce trọn gói tại Web22 — báo giá rõ ràng theo phạm vi scope, bao gồm setup CSV import workflow + sync ERP nếu shop có nhu cầu.


