WordPress มาพร้อมกับระบบ WP-Cron ที่จัดการงานตามกำหนดเวลา เช่น การเผยแพร่ Scheduled Post ส่งอีเมลแจ้งเตือน ตรวจสอบอัปเดต Plugin และทำความสะอาด Session Logs แต่ WP-Cron มีจุดอ่อนใหญ่หลวงคือ — มันทำงานเฉพาะ เมื่อมีผู้เข้าชมเว็บ หากเว็บไซต์มีทราฟฟิกน้อย งานเหล่านี้อาจไม่ทำงานตรงเวลาเลย
บน Cloud VPS ของ de.co.th คุณสามารถใช้ System Cron ของ Linux แทน WP-Cron ได้ ทำให้งานทุกอย่างรันตรงเวลาอย่างแม่นยำ ไม่ว่าจะมีคนเข้าเว็บหรือไม่ก็ตาม
ปัญหาของ WP-Cron คืออะไร?
WP-Cron ทำงานโดยอาศัย HTTP Request ทุกครั้งที่มีผู้เยี่ยมชมเว็บ WordPress จะตรวจสอบว่ามี Cron Event ที่ค้างอยู่หรือไม่ แล้วรันพร้อมกับ Page Request นั้น ซึ่งก่อให้เกิดปัญหาหลายอย่าง:
- ไม่แม่นยำ — งานที่ตั้งไว้ตี 2 อาจรันตอนตี 3 หรือตี 4 ถ้าไม่มีคนเข้าเว็บ
- Scheduled Post ล่าช้า — โพสต์ที่ตั้งเวลาเผยแพร่ไว้ไม่ปรากฏตามเวลาที่กำหนด
- Backup ไม่รัน — Plugin Backup เช่น UpdraftPlus อาจข้ามรอบได้
- เพิ่มภาระ Server — ทุก HTTP Request ต้องโหลด WordPress และตรวจสอบ Cron เพิ่มเติม
- เว็บโหลดช้าลง — เมื่อ Cron Job ที่ค้างสะสมมาก จะรันพร้อมกันทีเดียว ทำให้เว็บค้าง
ขั้นตอนที่ 1: ปิด WP-Cron ใน wp-config.php
เปิดไฟล์ wp-config.php ผ่าน SSH หรือ File Manager:
nano /var/www/html/wp-config.php
เพิ่มบรรทัดนี้ก่อนบรรทัด /* That's all, stop editing! */:
// ปิด WP-Cron เพื่อใช้ System Cron แทน
define('DISABLE_WP_CRON', true);
การตั้งค่านี้จะหยุดไม่ให้ WordPress ตรวจสอบ Cron ทุกครั้งที่มี Page Load ช่วยลดภาระ Server ได้ทันที
ขั้นตอนที่ 2: ตั้งค่า System Cron Job
เข้า VPS ผ่าน SSH แล้วเปิด Crontab Editor ของ User ที่รัน Webserver (เช่น www-data หรือ root):
# เปิด Crontab Editor
crontab -e
Option A: ใช้ curl (ง่าย ไม่ต้องติดตั้งอะไรเพิ่ม)
# รัน WordPress Cron ทุก 5 นาที
*/5 * * * * curl -s --max-time 30 "https://yourdomain.com/wp-cron.php?doing_wp_cron" > /dev/null 2>&1
Option B: ใช้ WP-CLI (แนะนำ — เร็วและประหยัด Resource กว่า)
# ติดตั้ง WP-CLI ก่อน (ถ้ายังไม่มี)
curl -O https://raw.githubusercontent.com/wp-cli/builds/gh-pages/phar/wp-cli.phar
chmod +x wp-cli.phar
sudo mv wp-cli.phar /usr/local/bin/wp
# ทดสอบ
wp --info
# เพิ่มใน Crontab: รัน WP Cron ทุก 5 นาทีด้วย WP-CLI
*/5 * * * * /usr/local/bin/wp cron event run --due-now --path=/var/www/html --quiet
WP-CLI ดีกว่า curl เพราะรัน PHP โดยตรงโดยไม่ต้องผ่าน HTTP Request ซึ่งเร็วกว่าและใช้ Memory น้อยกว่า
ทำความเข้าใจ Cron Syntax
# Format: นาที ชั่วโมง วันในเดือน เดือน วันในสัปดาห์
# * = ทุกค่า
# */5 = ทุก 5 หน่วย
# 0 = 0 / ค่าที่กำหนด
*/5 * * * * # ทุก 5 นาที
*/1 * * * * # ทุก 1 นาที
0 * * * * # ทุกชั่วโมง
0 2 * * * # ทุกวันตอนตี 2
0 2 * * 0 # ทุกวันอาทิตย์ตอนตี 2
ขั้นตอนที่ 3: ตรวจสอบการทำงาน
# ดูรายการ Cron Job ที่ตั้งไว้ทั้งหมด
crontab -l
# ดู Cron Event ที่รอทำงานใน WordPress (ต้องใช้ WP-CLI)
wp cron event list --path=/var/www/html
# ดู Log ของ Cron (Ubuntu/Debian)
grep CRON /var/log/syslog | tail -20
# ทดสอบรัน Cron ทันที
wp cron event run --due-now --path=/var/www/html
การตั้งค่าบน Plesk
หากใช้ Plesk บน Cloud VPS ของ de.co.th สามารถตั้ง Cron Job ผ่าน GUI ได้โดยไม่ต้องแก้ไข Crontab ผ่าน SSH:
- เข้า Plesk > เลือก Domain > Scheduled Tasks
- คลิก Add Task
- ตั้งเวลา: ทุก 5 นาที
- Command:
/usr/local/bin/wp cron event run --due-now --path=/var/www/html - บันทึก
Troubleshooting ปัญหาที่พบบ่อย
Scheduled Post ยังไม่เผยแพร่
# ตรวจสอบว่า DISABLE_WP_CRON ถูกตั้งค่าแล้ว
grep DISABLE_WP_CRON /var/www/html/wp-config.php
# ดู Missed Scheduled Events
wp cron event list --path=/var/www/html | grep missed
# บังคับรัน Cron ทันที
wp cron event run --due-now --path=/var/www/html
Cron ไม่รันเพราะ Permission
# ตรวจสอบว่า WP-CLI ใช้ User ที่ถูกต้อง
whoami
# รัน WP-CLI ด้วย User เดียวกับ Web Server
sudo -u www-data wp cron event run --due-now --path=/var/www/html --allow-root
สรุป
การเปลี่ยนจาก WP-Cron มาใช้ System Cron บน Cloud VPS เป็นการปรับแต่งที่คุ้มค่ามาก ทั้งลดภาระ Server ทำให้ Scheduled Post เผยแพร่ตรงเวลา และ Plugin Backup ทำงานได้แม่นยำ แนะนำให้ทำเป็นลำดับแรกเมื่อตั้งค่า WordPress ใหม่บน Cloud VPS ของ de.co.th

