ตั้งค่า Cron Job สำหรับ WordPress บน Cloud VPS — ทำงานอัตโนมัติแม่นยำกว่า WP-Cron

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