ליבת וורדפרס מגיעה עם ארבע תדירויות ל-WP-Cron: hourly, twicedaily, daily ו-weekly. אם אתם צריכים תדירות אחרת (למשל כל 5 דקות), הגדירו תדירות מותאמת עם הפילטר cron_schedules, ורק לאחר מכן תזמנו את האירוע עם wp_schedule_event().
הסדר חשוב. התדירות המותאמת חייבת להיות קיימת לפני שאתם מתזמנים אירוע שמשתמש בה, אחרת וורדפרס תדחה את האירוע.
הוספת תדירות Cron מותאמת
הוסיפו את הקוד הבא לקובץ functions.php של תבנית הבת שלכם או לתוסף. הוא רושם תדירות של 5 דקות, מתזמן באמצעותה אירוע חוזר אחד ומחבר אליו את המשימה.
// 1. Register the interval.
add_filter( 'cron_schedules', function ( $schedules ) {
$schedules['every_five_minutes'] = array(
'interval' => 5 * MINUTE_IN_SECONDS,
'display' => 'Every 5 Minutes',
);
return $schedules;
} );
// 2. Schedule the event once, if it isn't scheduled yet.
add_action( 'init', function () {
if ( ! wp_next_scheduled( 'my_custom_cron_event' ) ) {
wp_schedule_event( time(), 'every_five_minutes', 'my_custom_cron_event' );
}
} );
// 3. The task that runs on each interval.
add_action( 'my_custom_cron_event', function () {
// Your code here.
} );
כיצד זה עובד
הפילטר cron_schedules מאפשר לכם להוסיף רשומות לרשימת התדירויות. כל רשומה צריכה מפתח ייחודי, interval בשניות ותווית display שמוצגת בכלים כמו WP-CLI.
wp_schedule_event( $timestamp, $recurrence, $hook ) שומרת את האירוע. ההרצה הראשונה מתבצעת ב-$timestamp, ולאחר מכן בכל פעם שהתדירות שהגדרתם חולפת. הבדיקה wp_next_scheduled() מונעת יצירה של אירוע כפול בכל טעינת עמוד.
כשמגיע זמנו של האירוע, וורדפרס מפעילה את שם ההוק שהעברתם, כך שכל פונקציה שחיברתם אליו עם add_action() תרוץ. לרענון על actions ופילטרים, הציצו בפוסט הוקים ופילטרים בוורדפרס.
תדירויות ה-Cron המובנות בוורדפרס
התדירויות הבאות זמינות בלי להוסיף שום פילטר. התדירות weekly נוספה בוורדפרס 5.4.
| מפתח | תדירות (בשניות) | שם תצוגה |
|---|---|---|
hourly |
3600 | Once Hourly |
twicedaily |
43200 | Twice Daily |
daily |
86400 | Once Daily |
weekly |
604800 | Once Weekly |
כלומר, למשימה שבועית בוורדפרס 5.4 ומעלה, ותרו על הפילטר והעבירו ישירות את 'weekly', בדיוק כמו בניקוי שבועי של transients שפג תוקפם. שימו לב שגם אי אפשר להגדיר מחדש את ארבעת המפתחות הללו, מכיוון שברירות המחדל של הליבה גוברות על רשומות בפילטר עם אותו שם.
טעויות נפוצות
רוב הבעיות ב-WP-Cron עם תדירויות מותאמות נובעות מאחת הטעויות הבאות.
- תזמון לפני שהפילטר קיים. אם התדירות אינה רשומה ברגע ש-
wp_schedule_event()רצה, הפונקציה מחזירהfalse(אוWP_Errorעם הקודinvalid_scheduleכאשר אתם מעביריםtrueכארגומנט החמישי). - החלפת מפתח התדירות של האירוע. אם תשנו את
'every_five_minutes'בקריאה ל-wp_schedule_event(), האירוע הקיים ישמור על התדירות הישנה שלו, מכיוון ש-wp_next_scheduled()עדיין מוצאת אותו. הריצו פעם אחת אתwp_clear_scheduled_hook( 'my_custom_cron_event' )ותנו לקוד לתזמן אותו מחדש. - אי ניקוי בסיום. בתוסף, נקו את ההוק בזמן ההשבתה עם
register_deactivation_hook(), כדי שהאירוע לא ימשיך לרוץ לשווא. - ציפייה לתזמון מדויק. WP-Cron רץ רק כשמישהו מבקר באתר, כך שמשימה של 5 דקות באתר עם מעט תנועה תרוץ באיחור.
לתזמון אמין, הגדירו את DISABLE_WP_CRON כ-true והפעילו את ה-cron מהשרת. במילים אחרות, בטלו את WP-Cron והשתמשו ב-cron job אמיתי בשרת.
כדי לוודא שהתדירות והאירוע נרשמו, הריצו את פקודות ה-WP-CLI הבאות:
wp cron schedule list
wp cron event list
רשימת הפרמטרים המלאה נמצאת בתיעוד של wp_schedule_event().
שאלות נפוצות
הנה כמה שאלות נפוצות על תדירויות WP-Cron מותאמות:
hourly, twicedaily, daily ו-weekly. התדירות weekly קיימת החל מוורדפרס 5.4, ולכן מדריכים ישנים מציגים רק שלוש.
wp_schedule_event() בודקת את התדירות מול התדירויות הרשומות ברגע שהיא רצה. אם הפילטר שלכם עוד לא מחובר, האירוע לא יתוזמן.
DISABLE_WP_CRON וקראו ל-wp-cron.php או ל-wp cron event run --due-now מתוך cron job בשרת.
wp_clear_scheduled_hook( 'my_custom_cron_event' ), או הריצו wp cron event delete my_custom_cron_event עם WP-CLI. הסירו גם את קוד התזמון, אחרת הוא יוסיף את האירוע בחזרה בטעינת העמוד הבאה.