ปรับ 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;
}
ทดสอบเสมอ เปิดหน้าร้านในโหมดไม่ระบุตัวตน ใส่สินค้าลงตะกร้า แล้วเปิดเบราว์เซอร์อื่นดูว่าตะกร้าว่างหรือไม่ หากเห็นสินค้าของคนแรกแปลว่าแคชผิด ต้องแก้ทันที
ขั้นตอนที่ 5: ปิดฟีเจอร์ที่ไม่ได้ใช้
// เพิ่มใน functions.php ของ child theme หรือปลั๊กอินเฉพาะกิจ
// ปิดการนับสต็อกแบบเรียลไทม์บนหน้ารายการสินค้า หากไม่ได้แสดง
add_filter('woocommerce_product_get_stock_quantity', function($qty, $product) {
if (is_product_category() || is_shop()) return null;
return $qty;
}, 10, 2);
// ปิด cart fragments บนหน้าที่ไม่มีตะกร้า ลดคำขอ AJAX ทุกหน้า
add_action('wp_enqueue_scripts', function () {
if (is_front_page() || is_singular('post')) {
wp_dequeue_script('wc-cart-fragments');
}
}, 20);
สคริปต์ wc-cart-fragments ยิงคำขอ AJAX ทุกครั้งที่โหลดหน้า ซึ่งข้ามแคชเสมอและเป็นสาเหตุที่หน้าเว็บดูช้าแม้จะมีแคชแล้ว
ขั้นตอนที่ 6: เพิ่ม Index ที่จำเป็น
-- ตาราง postmeta เป็นคอขวดในร้านที่ยังไม่ได้เปิด HPOS
SHOW INDEX FROM wp_postmeta;
-- Index ที่ช่วยการค้นหาสินค้าตามคุณสมบัติ
CREATE INDEX idx_meta_key_value ON wp_postmeta (meta_key(32), meta_value(64));
ตรวจขนาดตารางก่อนสร้าง Index บนตารางที่ใหญ่มาก และทำในช่วงที่มีผู้ใช้น้อย
wp db query "SELECT table_name, ROUND(data_length/1024/1024) AS mb, table_rows
FROM information_schema.tables WHERE table_schema = DATABASE()
ORDER BY data_length DESC LIMIT 10;"
ขั้นตอนที่ 7: จัดการงานเบื้องหลัง
WooCommerce ใช้ Action Scheduler ซึ่งสะสมงานที่ทำเสร็จแล้วไว้จำนวนมาก
wp action-scheduler run
wp db query "SELECT status, COUNT(*) FROM wp_actionscheduler_actions GROUP BY status;"
# ล้างงานที่เสร็จแล้วเกิน 30 วัน
wp action-scheduler clean --before='30 days ago'
ปิด WP-Cron ที่ทำงานตอนมีคนเข้าเว็บ แล้วเปลี่ยนไปใช้ Cron จริงของระบบ
// wp-config.php
define('DISABLE_WP_CRON', true);
# ตั้งใน crontab
*/5 * * * * cd /var/www/example.com && /usr/bin/php wp-cron.php >/dev/null 2>&1
ขั้นตอนที่ 8: เปิด Object Cache
ลดจำนวน Query ที่ซ้ำกันในคำขอเดียวและข้ามคำขอ เห็นผลชัดเจนมากกับ WooCommerce
sudo apt install -y redis-server php8.3-redis
sudo systemctl enable --now redis-server
wp plugin install redis-cache --activate
wp redis enable
wp redis status
// wp-config.php
define('WP_REDIS_HOST', '127.0.0.1');
define('WP_REDIS_PORT', 6379);
define('WP_REDIS_DATABASE', 0);
define('WP_CACHE_KEY_SALT', 'example.com:');
WP_CACHE_KEY_SALT จำเป็นเมื่อมีหลายเว็บใช้ Redis เครื่องเดียวกัน ไม่เช่นนั้นข้อมูลจะปนกัน
ปัญหาที่พบบ่อย
ลูกค้าเห็นตะกร้าของคนอื่น
เกิดจากการแคชหน้าที่ไม่ควรแคช ปิดแคชทั้งหมดทันที แล้วตั้งข้อยกเว้นตามขั้นตอนที่ 4 ให้ครบก่อนเปิดใหม่ และทดสอบด้วยสองเบราว์เซอร์เสมอ
หน้าหลังบ้านช้ามาก
มักเป็นตาราง wp_options ที่บวมหรือปลั๊กอินที่เรียก API ภายนอกทุกครั้งที่โหลดหน้า ใช้ Query Monitor ดูที่แท็บ HTTP API Calls
ค้นหาสินค้าช้า
การค้นหาเริ่มต้นของ WordPress ใช้ LIKE '%คำค้น%' ซึ่งใช้ Index ไม่ได้เลย พิจารณาใช้ปลั๊กอินค้นหาที่สร้างดัชนีแยก หรือเชื่อมกับ Elasticsearch สำหรับร้านที่มีสินค้าหลายหมื่นรายการ
ออเดอร์หายหลังเปิด HPOS
ยังซิงก์ข้อมูลไม่เสร็จ รัน wp wc hpos sync จนจบ และตรวจว่าตั้งค่าโหมดซิงก์สองทางไว้ระหว่างช่วงเปลี่ยนผ่าน
ต้องการโฮสติ้งที่ปรับจูนมาสำหรับร้านค้าออนไลน์โดยเฉพาะ ติดต่อ THAI DATA CLOUD ได้ที่ https://thaidata.cloud/contact/
- Categories:
- Cloud
- Tags:
- Cloud
- Cloud Server
Related Posts
หมวดหมู่ที่น่าสนใจ
- Account Settings
- AD Server
- AI
- Alibaba Cloud
- Anti-Spam Gateway
- AWS Amazon Web Services
- Campaign
- CentOS/AlmaLinux
- Cloud
- Cloud Backup
- Cloud Communication
- Cloud Migration
- Cloud Security
- Cloud Server Management
- Cloud Solution
- Cloud Solution for Government
- Cloud Solutions by Industry
- Cloud Storage
- Cloud VPS App Plus +
- Cloud VPS DirectAdmin
- Cloud VPS Plesk
- CSR
- Cyber Security
- Cybersecurity
- Data Sovereignty
- Database Server
- DDoS
- Digital Tranformation
- Digital Transformation
- Direct Mail
- Directadmin
- Domainname
- Ecommerce
- ERP
- Generative AI
- Getting Started
- Google Cloud
- Google G Suite
- Huawei Cloud
- IT News
- Linux Server
- Managed Cloud Services
- Managed Service Provider
- Manual
- Microsoft
- Microsoft 365
- Microsoft Azure
- News
- On-premise
- Private Mail Server
- Promotion
- Recommend Solution (Enterprise)
- Server
- Sovereign Cloud
- THAI DATA CLOUD Platform
- Ubuntu
- Ubuntu
- Uncategorized
- VMware
- VPS Server
- Web Design
- Web Hosting
- Web Hosting (DirectAdmin)
- Web Hosting (Plesk)
- Web Technologies
- Windows Server
- Wordpress
- Zimbra
- เรื่องราวความประทับใจ
- โซลูชันสำหรับธุรกิจการผลิตและยานยนต์
- โซลูชันสำหรับธุรกิจการศึกษา
- โซลูชันสำหรับธุรกิจการเงิน
- โซลูชันสำหรับธุรกิจขนส่งและกระจายสินค้า
- โซลูชันสำหรับธุรกิจค้าปลีก
- โซลูชันสำหรับธุรกิจท่องเที่ยว
- โซลูชันสำหรับธุรกิจบริการสุขภาพและโรงพยาบาล
- โซลูชันสำหรับธุรกิจประกันภัย
- โซลูชันสำหรับธุรกิจพลังงานและสาธารณูปโภค
- โซลูชันสำหรับธุรกิจสื่อสารมวลชนและเอ็นเตอร์เทนเมนท์
- โซลูชันสำหรับธุรกิจอสังหาริมทรัพย์
- โซลูชันสำหรับธุรกิจเทคโนโลยี








