ลดความยุ่งยากในการใช้คลาวด์ พูดคุยกับเจ้าหน้าที่

ปรับ WooCommerce ให้เร็วขึ้นเมื่อสินค้าและออเดอร์เยอะ
Home ปรับ WooCommerce ให้เร็วขึ้นเมื่อสินค้าและออเดอร์เยอะ

ปรับ 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/

ผู้ให้บริการคลาวด์ไทย
เพื่อธุรกิจของคนไทย

"มุ่งมั่น" และ "มั่นคง"
พร้อมรับมือทุกการเติบโต
Trust Cloud
คลาว์ที่ปลอดภัย
คือรากฐานที่มั่นคง
cloud security