וורדפרס מתזמנת משימות ע״י שימוש ב-Cron Jobs, פונקציית UNIX אשר מאזינה לשעון המכונה וכל X זמן או בזמן מוגדר תבצע פעולה מסויימת שהמערכת או המשתמש הגדיר.

וורדפרס משתמשת ב-Cron Jobs על מנת לבצע מספר פונקציות:

  • בדיקה האם יצאה גרסת מערכת חדשה.
  • בדיקה האם ישנה גרסה חדשה לתבניות ולתוספים.
  • פרסום פוסטים אשר מתוזמנים לזמן מסויים.
  • וכד׳…

תזמון משימות מאפשר לנו לבצע אוטומציה למגוון פעולות שנרצה שירוצו ברקע, לדוגמא, גיבוי של המסד נתונים ושליחה במייל או הבאת נתונים מפלטפורמה מסויימת ע״י שימוש ב-API כלשהו.

תזמון משימות עם WP-Cron

וורדפרס מציעה לנו מספר פונקציות לניהול ותזמון משימות ע״י שימוש ב-WP-Cron API.

תזמון משימה חד פעמית

במידה ונרצה לתזמן משימה שתרוץ אך ורק פעם אחת, נעשה זאת ע״י הפונקצייה wp_schedule_single_event().

wp_schedule_single_event( $timestamp, $hook, $args );

הפונקציה מקבלת 3 פרמטרים, הראשון הוא חתימת הזמן של הזמן בו נרצה להריץ את המשימה, הפרמטר השני הינו מזהה הפעולה אותו נרצה לבצע ולבסוף הפרמטר השלישי יאפשר לנו להעביר פרמטרים נוספים ע״י העברת מערך.

תזמון משימה בתדירות

במידה ונרצה לתזמן משימה שתרוץ באופן קבוע כל זמן מוגדר, נשתמש בפונקצייה wp_schedule_event():

wp_schedule_event( time(), 'daily', 'dorzki_send_mails', $args );

function dorzki_send_hello() {
  
  wp_mail( get_bloginfo( 'admin_email' ), __( 'Hello World!', 'dorzki' ), __( 'Greetings and salutations from dorzki!', 'dorzki' ) );

}

add_action( 'dorzki_send_mails', 'dorzki_send_hello' );

פונקצייה זאת מקבלת 4 פרמטרים, כאשר הפרטמר הראשון הינו חתימת הזמן של הפעם הראשונה שנרצה לבצע את המשימה, לאחר מכן כל כמה זמן נרצה שהמשימה תתבצע, מזהה הפעולה אותו נרצה לבצע ולבסוף אם נרצה להעביר פרמטרים נוספים נעשה זאת ע״י העברת מערך בפרמטר הרביעי.

וורדפרס מציעה 3 אפשרויות לתדירות תזמון המשימה:

  • כל שעה // hourly
  • פעמיים ביום (כל 12 שעות) // twicedaily
  • פעם ביום // daily

הגדרת תדירות זמן

ניתן להוסיף תדירות זמן מותאמת אישית, אך נצטרך לעשות זאת ע״י כך שנלמד את וורדפרס מהי תדירות הזמן שנרצה, נעשה זאת ע״י הקוד הבא:

function dorzki_custom_cron_intervals( $intervals ) {
  
  $intervals['quaddaily'] = array(
    'interval' => 21600, // Every six hours = 60 (seconds) * 60 (minutes) * 6 (hours)
    'display' => __( 'Quad Daily', 'dorzki' )
  );

  return $intervals;

}

add_action( 'cron_schedules', 'dorzki_custom_cron_intervals' );

בדוגמא הנ״ל הוספנו תדירות זמן של כל 6 שעות, עשינו זאת ע״י הגדרה של התדירות לפי החישוב הבא – 60 * 60 * 6, כלומר, 60 שניות כפול 60 דקות כפול 6 שעות.

קבלת תזמון המשימה

הפונקציה הבאה תאפשר לנו לקבל את חתימת הזמן שבה מתוכננת לרוץ הפונקציה שלנו, נעשה זאת ע״י שימוש בפונקציה wp_next_scheduled().

$nextTime = wp_next_scheduled( $hook, $args );

נעביר אל הפונקציה את מזהה הפעולה שלנו ואם נרצה להעביר פרטמרים נוספים נוכל להעביר אותם כמערך בפרמטר השני.

הסרה של תזמון משימה

הפונקציה הבאה הינה הפונקציה אשר מאפשרת לנו להסיר את הפעולות שלנו ממנוע תזמון המשימות, נשתמש בה לרוב בפונקצייה כיבוי התוסף שלנו על מנת לא לגרום לשגיאות בעקבות כיבוי התוסף.

$nextTime = wp_next_scheduled( 'dorzki_send_mails' );

wp_unschedule_event( $nextTime, 'dorzki_send_mails', $args );

הפונקציה מקבלת שלושה פרמטרים, הפרמטר הראשון הוא חתימת הזמן של הפעם הבאה שהפעולה שלנו מתוכננת לרוץ, הפרמטר השני הוא מזהה הפעולה והפרטמר השלישי הוא מערך עם פרטמרים אותם נרצה להעביר (לא חובה).

הבעיה עם WP-Cron

וורדפרס משתמשת בפונקציו משלה לניהול ותזמון משימות, כלומר היא אינה משתמש באמת ב-Cron Jobs של המכונה, אלא מספקת פתרון משלה. WP-Cron עובד כך שוורדפרס שומרת במסד נתונים בטבלת wp_options ע״י שימוש ב-Transients API את שם המשימה שיש לבצע ואת חתימת הזמן שבה המשימה צריכה להתבצע.

כך קורה מצב בעצם שכל פעם שעמוד נטען באתר, וורדפרס בודקת האם חתימת הזמן שקיימת במסד נתונים קטנה יותר מחתימת הזמן הנוכחית של השעון, במידה וכן, המשימה תרוץ, השורה תמחק מהמסד נתונים ובמידה וזאת משימה שצריכה לחזור על עצמה כל X זמן, שורה חדשה תתווסף למסד עם חתימת זמן עתידית חדשה.

כאן קבור הכלב, תזמון המשימות של וורדפרס אינו באמת מדוייק; באתרים בעלי תעבורה נמוכה, תזמון המשימות לא באמת יהיה על השנייה ויכול להיות מצב שמשימה שצריכה להתבצע נגיד אחת לשעה, לא תתבצע מספר פעמים כי לא נכנסו לאתר.

למזלנו, וורדפרס מאפשרת לנו כן להשתמש ב-Cron Jobs של השרת, תחילה עלינו לבטל את התזמון משימות של וורדפרס ע״י הוספה של שורה אחת בקובץ wp-config.php:

define( 'DISABLE_WP_CRON', true );

כעת עלינו לתזמן את מתזמן המשימות של וורדרפס ע״י הוספת פקודה קריאה ל-wp-cron.php בפאנל הניהול של השרת שלנו.

DirectAdmin

  1. נתחבר אל פאנל הניהול.
  2. תחת Advanced Features נבחר ב-Cronjobs.
  3. בשדה Minutes נרשום */5, דבר אשר יגדיר כי הפעולה תרוץ כל 5 דקות.
  4. בשדה Command נרשום את הפקודה הבאה:
    /usr/bin/wget -O /dev/null -q http://www.your-website.co.il/wp-cron.php?doing_wp_cron
  5. נלחץ על Add.

cPanel

  1. נתחבר אל פאנל הניהול.
  2. תחת Advanced נבחר ב-Cron jobs.
  3. תחת Add New Cron Job נבחר בשדה Common Settings את Once Per Five Minutes(*/5 * * * *).
  4. בשדה Command נרשום את הפקודה הבאה:
    wget -O -q http://www.your-website.co.il/wp-cron.php?doing_wp_cron > /dev/null 2>&1
  5. נלחץ על Add New Cron Job.

לא לשכוח לשנות את הדומיין לדומיין שלכם בפקודה.

סיכום

תזמון משימות תורם המון לאוטומציה של פעולות בוורדפרס, מאוד שימושי כאשר מפתחים תוספים אשר עובדים עם קריאות API על מנת לאחזר מידע או כאשר רוצים לבצע גיבוי אוטומטי כל זמן מוגדר.

בהצלחה!

דור צוברי

מתכנת מגיל 13, ומתעסק עם וורדפרס מגיל 18, אוהב לפצח אתגרים ולפתח דברים מורכבים על בסיס וורדפרס. עצמאי מגיל 16, מרצה ובלוגר. בזמן הפנוי שלי אוהב מאוד לקרוא קומיקס של MARVEL.

דור צוברי

תגובות לפוסט

כתיבת תגובה

תגובה אחת

  1. רועי

    יכול להרחיב על מה זה "doing_wp_cron"? האם זה פרמטר קבוע? או פונקציה שאמורה לרוץ? בנוסף האם זה אומר שכל אחד יכול לגשת לURL הזה ולהריץ את הפונקציה מתי שבא לו? או שיש אפשרות להגביל את זה?

    1. מחבר
      דור צוברי

      היי רועי,
      אתה מוזמן לקרוא את ההסבר המדוייק בקישור הבא.

      לשאלתך, ברגע שאתה מנסה להיכנס לקישור, הסקריפט זורק את פונקציית die() ולכן אין פה אפשרות כל כך לנסות להציף את השרת או משהו.