in Technology

Fix WordPress Missed Schedule

รัน WordPress มาหลายเว็บ เพิ่งมาเจอปัญหากับเว็บนี้ markpeak.net ว่าตั้งเวลาโพสต์ล่วงหน้าแล้วมักโพสต์ไม่ออกอยู่บ่อยครั้งๆ (ขึ้นว่า missed schedule)

ปัญหาไม่ร้ายแรงนัก เพราะไม่ได้ใช้โพสต์ล่วงหน้าบ่อย แต่เจอหลายทีเข้าก็รำคาญเหมือนกัน เลยต้องมานั่งสาเหตุและวิธีแก้ไข ตอนนี้แก้ได้แล้วก็มาบันทึกไว้

สาเหตุ

อย่างแรกเลยคือ ระบบการตั้งเวลาของ WordPress ใช้แนวคิดเดียวกับ cron (เซอร์วิสตั้งเวลาของ Unix) แต่เนื่องจาก WordPress เป็นเว็บแอปพลิเคชันที่ไม่ได้รัน cron จริงๆ จึงต้องใช้วิธีสร้าง cron ปลอมของตัวเองขึ้นมา โดยใช้ “คนเข้าเว็บ” เป็นตัว trigger มาเช็คว่ามีงาน scheduled ต้องทำหรือไม่ (คนเข้าเว็บ 1 ครั้ง จะเรียกฐานข้อมูลมาดูว่ามีอะไรต้องรันไหม ถ้าไม่มีคนเข้าเว็บช่วงนั้น ก็จะไม่มี trigger นี้ เป็นเหตุให้ scheduled ไม่ทำงาน)

ดังนั้น ในกรณีที่เป็นเว็บเล็กๆ ทราฟฟิกน้อย และตั้งเวลาโพสต์ในช่วงที่คนเข้าน้อยพอดี (เช่น ตอนเช้า) ก็มีโอกาสที่ missed schedule ได้ง่าย

ทางแก้ไข #1 ตั้ง cron จริงๆ

วิธีแก้ไขที่ตรงไปตรงมาที่สุดคือ ถ้า cron ปลอมไม่รัน เราก็ไปตั้งค่า cron จริงๆ ในเซิร์ฟเวอร์ซะเลยสิ

วิธีการนี้จำเป็นต้องมีสิทธิการเข้าถึงระดับโฮสต์ด้วย (ถ้าไม่มีก็ต้องแก้แบบ #2) ซึ่งแต่ละโฮสต์มีวิธีทำแตกต่างกันไป

โฮสต์ที่ผมใช้งานนั้นใช้ซอฟต์แวร์ Plesk บริหารจัดการ วิธีตั้งค่า cron คือเข้าไปที่ Domain > เลือกโดเมนที่ต้องการ แล้วคลิกที่เมนู Scheduled Tasks ด้านขวามือ

กดปุ่ม Add Task จะเจอหน้าจอดังภาพ สิ่งสำคัญคือเราต้องระบุในช่อง Command ว่าจะรันอะไร ให้ใส่ตามนี้ ก็คือบอกว่าให้เซิร์ฟเวอร์รันคำสั่ง cron ของ WordPress ให้หน่อยนะ (แก้ตรงโดเมนเนมให้เป็นเว็บของเรา)

Wget -O /dev/null https://domain.com/wp-cron.php?doing_wp_cron

ส่วนตรง Run ให้ระบุความถี่ อันนี้ขึ้นกับว่าต้องการถี่แค่ไหน กรณีของผมที่ใช้ไม่บ่อย คิดว่าชั่วโมงละครั้งก็พอเพียง (ถ้าอยากให้ละเอียดขึ้น เช่น ทุก 5 นาทีหรือ 15 นาที เขียนเป็น crontab ได้)

ตั้งค่า cron ของเซิร์ฟเวอร์เสร็จแล้ว ให้ไปปิด cron ปลอมของ WordPress ด้วย จะได้ไม่ตีกัน

วิธีการคือเข้าไปแก้ไฟล์ wp-config.php ใน File Manager ของโฮสต์ (อยู่ในโฟลเดอร์ด้านนอกสุด) แล้วเพิ่มค่านี้ไปที่บรรทัดสุดท้าย

define(‘DISABLE_WP_CRON’, true);

เท่านี้ก็เรียบร้อย ลองตั้งเวลาโพสต์แล้วน่าจะใช้งานได้ไม่มีปัญหาแล้ว

ทางแก้ #2 ใช้ปลั๊กอินช่วย

แต่ถ้าใช้โฮสต์ที่เข้าไม่ถึงสิทธิหลังบ้านแบบทางแก้ #1 ก็มีทางเลือกอื่นๆ คือใช้ปลั๊กอินช่วย การทำงานของมันคือ ใช้การเข้าเว็บเป็น trigger แต่จะเช็คอีกรอบว่ามี missed schedule ค้างอยู่หรือไม่ (ซึ่ง WordPress ปกติจะเช็คแค่ว่ามี scheduled หรือไม่ ถ้าพลาดแล้วคือพลาดเลย ไม่กลับมาเช็คซ้ำให้)

ปลั๊กอินตัวนี้คือ Scheduled Post Trigger วิธีนี้ผมไม่ได้ลอง เลยไม่สามารถเล่าได้ว่าผลเป็นอย่างไร

ข้อมูลอ้างอิงจาก BetterStudio