השם "WP-Cron" מטעה - זה לא cron במובן של Linux cron. אין לו לוח זמנים מובטח, אין לו thread רקע, ואין לו אמינות. הוא מסתמך על בקשות HTTP מגולשים אמיתיים שמפעילים את הבדיקה. באתר עם תנועה נמוכה זה משבר את כל מערכת המשימות.
למה זה משנה
כשגולש מבקש דף, וורדפרס מתחיל לעבד את התשובה ובסוף שולח אותה. אחרי השליחה הוא בודק אם יש משימה ש-next_run שלה כבר עבר, ומריץ אותה. זה דמוי-cron אבל לא cron אמיתי. ההשלכות:
- אתרים עם תנועה נמוכה (פחות מבקשה כל 15 דקות) - משימות שתוזמנו ל-03:00 בלילה ירוצו רק ב-08:00 בבוקר כשהגולש הראשון יגיע, אם בכלל. גיבוי שתוזמן ל-04:00 - אותו דבר.
- אתרים עם cache מאסיבי - דפים מוגשים מ-cache בלי להגיע ל-PHP, ולכן WP-Cron לא מופעל בכלל. ראינו אתרים שמ-95% מהבקשות מוגשות מ-Varnish/Cloudflare ו-WP-Cron כמעט אף פעם לא רץ.
- עומס נוסף על כל בקשה - WP-Cron מבצע
wp_remote_post()ל-wp-cron.phpבכל בקשה (loopback HTTP). זה מוסיף 100-300ms של השהיה ראשונית. - ריבוי תהליכים מקבילים בעומסים גבוהים - שני גולשים שמגיעים בו זמנית עלולים להריץ את אותה משימה פעמיים.
הפתרון הבריא ל-production הוא לכבות את WP-Cron הפנימי ולהגדיר system cron אמיתי שרץ בזמנים קבועים.
איך לזהות
גש ל-Site Health (Tools > Site Health) - וורדפרס מסמן אם WP-Cron לא הצליח לרוץ. דרך WP-CLI:
wp cron event list --fields=hook,next_run_relativeאם יש hooks עם next_run_relative שלילי משמעותי - לא רץ. RankPlus בודק את DISABLE_WP_CRON ב-wp-config.php, ואת זמן ההרצה האחרון של hooks קריטיים.
איך לתקן
- שלב 1 - כבה WP-Cron הפנימי: ערוך את
wp-config.phpוהוסף לפני השורה/* That's all, stop editing! */:define( 'DISABLE_WP_CRON', true ); - שלב 2 - הגדר system cron. ב-cPanel: Cron Jobs > Add new cron job. ב-Plesk: Tools & Settings > Scheduled Tasks. בשרת VPS דרך SSH:
crontab -e. - הוסף את הפקודה:
החלף*/5 * * * * wget -q -O - https://example.com/wp-cron.php?doing_wp_cron > /dev/null 2>&1example.comבכתובת האתר שלך. ה-*/5אומר "כל 5 דקות". - לאתרים פעילים מאוד (WooCommerce עם הזמנות בלייב, מערכת ניהול תורים) - השתמש ב-
*/1(כל דקה). - חלופה אם השרת לא תומך ב-cron: שירותי web cron כמו cron-job.org או EasyCron מבצעים HTTP GET ל-URL בתדירות שתבחר. חינמי לרוב.
- חלופה ב-WP-CLI שמדויקת יותר (לא דרך HTTP):
*/5 * * * * cd /var/www/html && wp cron event run --due-now --allow-root. - בדוק שעובד: התקן WP Crontrol (חינמי) > Tools > Cron Events. תראה את הזמן האחרון שכל hook רץ - אמור להתעדכן כל 5 דקות.
טעויות נפוצות
- כיבוי WP-Cron בלי הגדרת תחליף: שום משימה לא תרוץ לעולם. גיבויים, מיילים, סטטוס הזמנות - הכל קופא.
- cron כל דקה באתר shared hosting: ספקים מסוימים מגבילים תדירות cron. *
/5 או */10בטוחים יותר. - שימוש ב-curl במקום wget בלי הגדרות:
curl https://...בלי-s -o /dev/nullשולח את ה-output למייל root, מציף את ה-mailbox. - אי בדיקה אחרי השינוי: זה לא תמיד עובד מהפעם הראשונה. ודא ש-WP Crontrol מראה הרצה תוך 10 דקות.
- cron לכתובת HTTP כש-HTTPS חובה: ה-cron יקבל הפניית 301 ולא יבצע GET. תמיד השתמש בכתובת HTTPS המלאה.
בדיקה לאחר תיקון
חכה 10 דקות אחרי הגדרת ה-cron. ב-WP Crontrol > Cron Events, ה-next_run של hooks אקטיביים צריך להיות בעוד פחות מ-5 דקות. תזמן פוסט לעוד 5 דקות וחכה - הוא צריך לפרסם בזמן. ב-RankPlus הסטטוס יחזור לירוק. אם יש בעיה, בדוק את הלוג של ה-cron של השרת (/var/log/syslog או cPanel > Cron Email).
/wp-cron.php - אחרת ה-cron עלול להגיע ל-cache hit ולא להפעיל PHP בפועל.