คำตอบสั้น ๆ: แก้จุดที่ทำให้ร้านค้า WooCommerce ช้าเมื่อข้อมูลโต ทั้งตาราง wp_options ที่บวม การแคชที่ต้องยกเว้นหน้าตะกร้า และการจัดการ Query ที่หนัก
คู่มือนี้อธิบาย WooCommerce ทีละขั้นตอน พร้อมคำสั่งที่ใช้ได้จริงและปัญหาที่พบบ่อย
ร้านค้า WooCommerce ที่เปิดใหม่มักเร็วดี แต่เมื่อมีสินค้าหลายพันรายการและออเดอร์สะสมหลายหมื่น ความเร็วจะลดลงอย่างชัดเจน สาเหตุไม่ใช่เรื่องเดียว แต่เป็นหลายอย่างสะสมกัน
คู่มือนี้ไล่แก้ตามลำดับที่ให้ผลมากที่สุดก่อน เริ่มจากฐานข้อมูลที่บวม ไปจนถึงการตั้งแคชที่ต้องระวังเป็นพิเศษ เพราะการแคชหน้าตะกร้าผิดจะทำให้ลูกค้าเห็นตะกร้าของคนอื่น
สิ่งที่ต้องเตรียม
- สิทธิ์ผู้ดูแล WordPress และเข้าถึงฐานข้อมูลได้
- WP-CLI หากเข้า SSH ได้ จะทำงานได้เร็วกว่ามาก
- สำรองข้อมูลก่อนเสมอ ทั้งไฟล์และฐานข้อมูล
ขั้นตอนที่ 1: วัดก่อนว่าช้าตรงไหน
wp --info
wp db size --tables --human-readable | head -20
ติดตั้งปลั๊กอิน Query Monitor แล้วเปิดหน้าที่ช้า ดูสามอย่าง จำนวน Query ทั้งหมด เวลารวมที่ใช้กับฐานข้อมูล และรายการ Query ที่ช้าที่สุด หน้าร้านที่ปกติควรใช้ไม่เกิน 60-80 Query หากเห็นหลักหลายร้อยแปลว่ามีปลั๊กอินที่ทำงานหนักเกินไป
ขั้นตอนที่ 2: ล้างตาราง wp_options ที่บวม
นี่คือสาเหตุอันดับหนึ่งที่มักถูกมองข้าม ตาราง wp_options ถูกโหลดเกือบทั้งตารางในทุกคำขอสำหรับแถวที่ตั้ง autoload = yes
-- ดูขนาดรวมของข้อมูลที่โหลดทุกครั้ง
SELECT ROUND(SUM(LENGTH(option_value))/1024/1024, 2) AS autoload_mb
FROM wp_options WHERE autoload = 'yes';
-- หาแถวที่ใหญ่ที่สุด
SELECT option_name, ROUND(LENGTH(option_value)/1024, 1) AS kb, autoload
FROM wp_options ORDER BY LENGTH(option_value) DESC LIMIT 20;
ค่า autoload_mb ที่ดีคือต่ำกว่า 1 MB หากเกิน 3 MB จะเห็นผลชัดเจน
-- นับ transient ที่หมดอายุแล้วแต่ยังค้างอยู่
SELECT COUNT(*) FROM wp_options WHERE option_name LIKE '\_transient\_%';
# ล้างด้วย WP-CLI ซึ่งปลอดภัยกว่าการลบด้วย SQL เอง
wp transient delete --expired
wp transient delete --all
wp db optimize
หากพบแถวขนาดใหญ่ที่เป็นของปลั๊กอินที่ถอนไปแล้ว ให้ลบทิ้งได้
wp option delete ชื่อ_option_ที่ไม่ใช้แล้ว
ขั้นตอนที่ 3: เปิด HPOS สำหรับตารางออเดอร์
WooCommerce รุ่นใหม่เก็บออเดอร์ในตารางของตัวเองแทนการเก็บใน wp_posts และ wp_postmeta ซึ่งเร็วกว่ามากเมื่อมีออเดอร์จำนวนมาก
ไปที่ WooCommerce แล้ว Settings แล้ว Advanced แล้ว Features เลือก High-performance order storage
# ตรวจสถานะ
wp option get woocommerce_custom_orders_table_enabled
# ซิงก์ข้อมูลเดิม
wp wc hpos sync
ก่อนเปิด ต้องตรวจว่าปลั๊กอินทุกตัวที่ใช้รองรับ HPOS แล้ว ระบบจะแสดงรายการที่ยังไม่รองรับให้เห็นในหน้าเดียวกัน หากมีตัวที่ไม่รองรับ อย่าเพิ่งเปิด
ขั้นตอนที่ 4: ตั้งแคชโดยยกเว้นหน้าที่ต้องยกเว้น
นี่คือจุดที่พลาดแล้วเสียหายหนักที่สุด หน้าเหล่านี้ห้ามแคชเด็ดขาด
/cart/ตะกร้าสินค้า/checkout/หน้าชำระเงิน/my-account/หน้าบัญชีลูกค้า- URL ที่มี
?add-to-cart= - URL ที่มี
wc-apiสำหรับการแจ้งผลจากระบบชำระเงิน
และต้องยกเว้นการแคชสำหรับผู้ที่มีคุกกี้เหล่านี้
woocommerce_items_in_cart
woocommerce_cart_hash
wp_woocommerce_session_
wordpress_logged_in_
หากใช้ Nginx เป็น Reverse Proxy ตั้งเงื่อนไขข้ามแคช
map $http_cookie $skip_cache {
default 0;
~*wordpress_logged_in 1;
~*woocommerce_items_in_cart 1;
~*wp_woocommerce_session_ 1;
}
map $request_uri $skip_cache_uri {
default 0;
~*/(cart|checkout|my-account)/ 1;
~*add-to-cart= 1;
~*wc-api 1;
}
ทดสอบเสมอ เปิดหน้าร้านในโหมดไม่ระบุตัวตน ใส่สินค้าลงตะกร้า แล้วเปิดเบราว์เซอร์อื่นดูว่าตะกร้าว่างหรือไม่ หากเห็นสินค้าของคนแรกแปลว่าแคชผิด ต้องแก้ทันที