WP-Cron הוא בלבול שמי: זה לא Cron אמיתי כמו זה של Linux, אלא מנגנון פנימי של WordPress שבודק בכל בקשת HTTP אם יש משימות שעבר זמנן ומריץ אותן באותו תהליך PHP. במילים אחרות: אם אף אחד לא מבקר באתר במשך שעה, אף משימה מתוזמנת לא רצה במשך אותה שעה. זה גרוע במיוחד באתרים בעלי תנועה נמוכה, באתרי ייצור עם תהליכים קריטיים (גיבוי, שליחת דוחות, ניהול מנויים), ובאתרים מאחורי page cache שלא מעוררים PHP בכל בקשה.
למה זה משנה
תהליכים שתלויים ב-WP-Cron כוללים: פרסום פוסטים מתוזמנים (מאמר ב-9:00 שעולה ב-9:47 בגלל שאף אחד לא ביקר), שליחת מיילים מ-WooCommerce (אישור הזמנה שמגיע באיחור של שעה), גיבויים יומיים של UpdraftPlus שלא מתבצעים בכלל, ניקוי transients ש-DB מתנפח בלעדיו, ובדיקות עדכון של תוספים שלא רצות בזמן.
בנוסף, יש פגיעה ביצועית: כל מבקר ה"מקריב" משלם את העלות של משימות מתוזמנות שצריכות לרוץ - הוא מקבל TTFB של 2-3 שניות במקום 200ms. אתר עם action_scheduler של WooCommerce שמצטבר אלפי משימות יכול לתת חוויה איטית באקראי לגולשים תמימים. system cron מעביר את העלות הזו לתהליך נפרד שלא משפיע על מבקרים.
איך לזהות
התקן Query Monitor או WP Crontrol - שניהם מציגים רשימה של משימות מתוזמנות. בעמוד Tools > Cron Events של WP Crontrol, אם יש משימה עם Next Run בעבר, זה אומר שהיא לא רצה בזמן. אפשר גם לראות את הזמן שעבר מאז ה-cron האחרון רץ עם:
echo human_time_diff(get_option('cron_last_run', 0));סימן נוסף: ב-Site Health (Tools > Site Health) מופיע "A scheduled event has failed" - זה כמעט תמיד WP-Cron שלא רץ.
איך לתקן
שלב ראשון: כבה את WP-Cron האוטומטי. הוסף ל-wp-config.php לפני השורה /* That's all, stop editing! */:
define('DISABLE_WP_CRON', true);שלב שני: הגדר system cron של השרת. ב-cPanel: עבור ל-"Cron Jobs". ב-Plesk: "Scheduled Tasks". בלוח Hostinger/SiteGround: יש ממשק ייעודי. הוסף משימה שרצה כל 5 דקות:
*/5 * * * * wget -q -O - https://example.com/wp-cron.php?doing_wp_cron > /dev/null 2>&1או אם wget לא זמין:
*/5 * * * * curl -s https://example.com/wp-cron.php?doing_wp_cron > /dev/null 2>&1אם יש לך גישה ל-SSH ו-WP-CLI, הגרסה הנקייה ביותר היא:
*/5 * * * * cd /var/www/html && /usr/local/bin/wp cron event run --due-now > /dev/null 2>&1ל-WooCommerce עם הרבה action scheduler, מומלץ לרוץ כל דקה במקום כל 5.
טעויות נפוצות
הטעות הראשונה: לכבות את DISABLE_WP_CRON אבל לא להגדיר system cron - האתר נשאר בלי שום cron בכלל. בדוק את שני הצדדים. הטעות השנייה: לקרוא ל-wp-cron.php בלי הפרמטר doing_wp_cron - חלק מתוספי אבטחה חוסמים בקשות ישירות ל-wp-cron.php כדי למנוע הפעלה מבחוץ. הטעות השלישית: להגדיר interval של 1 דקה באתר עם cron כבד שלא מסיים תוך דקה - שני תהליכים נפרדים של cron מתחילים לרוץ במקביל ויוצרים race conditions, רושמים כפול, או נועלים זה את זה ב-DB. שמור על interval של 5 דקות לפחות אם בעיה.
בדיקה לאחר תיקון
חכה 10 דקות אחרי ההגדרה. ב-WP Crontrol, בדוק שהזמן "Last Ran" של משימות התעדכן. שלח פוסט מתוזמן ל-2 דקות מעכשיו ובדוק שהוא עולה בזמן. ב-cPanel, רוב הלוחות מציגים "Last Run" של ה-cron עצמו - ודא שהוא רץ. אם לא רץ - בדוק שהנתיב לאתר נכון, שאין SSL חסר (https שלא קיים), ושאין basic auth שחוסם.
wp cron event run --due-now דרך WP-CLI על SSH. היא מהירה יותר מ-wget (לא טוענת את כל ה-frontend), לא חוסמת על cache, ולא יוצאת ברשת.