Skip to content

ساخت و استفاده از کرون جاب در وردپرس

عناوین مطلب

سلام

معرفی کرون جاب

شاید تا حالا اسم کرون جاب رو شنیده باشین. کرون جاب امکانی هست که به برنامه نویس اجازه میده توی بازه های زمانی مختلف کار خاصی که تعریف کرده رو انجام بده. تا جایی که میدونم تمام زبان های سمت سرور کرون جاب دارن. توی زبان‌های مختلف ممکنه نحوه تعریف کرون جاب یا افزودن این امکان ممکنه فرق کنه. مثلا توی NodeJs معروفترین کتابخونه cron هست.

ساخت و استفاده از کرون جاب در وردپرس - Create and using cron job in WordPress

کرون جاب در وردپرس

زبان PHP خیلی خوب با کرون جاب و کرون‌ها سازگار هست. بهتر از اون توی وردپرس نحوه تعریف و استفاده از کرون جاب‌ها خیلی ساده‌تر شده.

برای تعریف کرون جاب‌ها به یک بازه زمانی و تابعی که کاری که میخوایم انجام بده نیاز داریم. وردپرس بازه های مختلف و از پیش تعریف شده داره، اما اگه به بازه های دیگه ای نیاز دارید میتونید با فیلتری که برای اینکار تعریف شده اضافه کنید.

لیست بازه‌های زمانی از پیش تعریف شده وردپرس: (اعداد به ثانیه هستن)

<?php
MINUTE_IN_SECONDS = ۶۰
HOUR_IN_SECONDS = ۶۰ * MINUTE_IN_SECONDS
DAY_IN_SECONDS = ۲۴ * HOUR_IN_SECONDS
WEEK_IN_SECONDS = ۷ * DAY_IN_SECONDS
MONTH_IN_SECONDS = ۳۰ * DAY_IN_SECONDS
YEAR_IN_SECONDS = ۳۶۵ * DAY_IN_SECONDS

اینها ثابت‌هایی هستن که وردپرس تعریفشون کرده و هر جایی که ازشون استفاده کنید عدد مربوطه رو نشون میدن.

ساخت بازه زمانی دلخواه

و اما اسم فیلتری که میتونیم بازه‌های زمانی رو کنترل کنیم، cron_schedules هست. ورودی‌ یک آرایه از تمام بازه‌هایی که هست خود وردپرس یا بقیه پلاگین‌ها بهش اضافه کردن. نحوه استفادش بصورت زیر هست:

<?php
add_filter( 'cron_schedules', 'mj_custom_cron_intervals' );
function mj_custom_cron_intervals( $schedules ) {
 $schedules['half'] = array(
 'interval' => 30*MINUTE_IN_SECONDS,
 'display' => __( 'Half', 'mj' )
 );

 return $schedules;
}

اینجا یه بازه نیم ساعته تعریف کردم. یعنی میخوام کدی که جلوتر مینویسم هر نیم ساعت اجرا بشه. توی آرایه، عضو interval که بر واحد ثانیه هست، مدت بازه زمانی رو مشخص میکنه. عضو display هم اسمی که توی پلاگین های مدیریت کرون جاب هستن رو نمایش میده. اما اسمی که برنامه نویس ازش استفاده میکنه اسم خود آرایه هست.(خط ۴)

همیشه یادتون باشه توی فیلتر ها آرگومان اول رو باید بازگشت بدید وگرنه ممکنه خیلی چیزا به هم بریزه.

ساخت تابع کرون جاب

حالا باید با استفاده از کدهای زیر کرون خودمون رو به وردپرس معرفی کنیم. سیستم خود وردپرس میتونه این کرون ها رو مدیریت کنه و سر موقع خودشون اجراشون کنه:

<?php
add_action( 'init', 'mj_register_users_count_event' );
/**
 * this method will register the cron event
 */
function mj_register_users_count_event() {
 // make sure this event is not scheduled
 if( !wp_next_scheduled( 'mj_users_count_hook' ) ) {
 // schedule an event
 wp_schedule_event( time(), 'half', 'mj_users_count_hook' );
 }
}

/**
 * mj_register_users_count method will be call when the cron is executed
 */
add_action( 'mj_users_count_hook', 'mj_users_count' );
 
/**
 * this method will call when cron executes
 */
function mj_users_count() {
 wp_mail( get_user_by( 1 )->user_email, 'Tutorial: Cron job from mjkhajeh.ir', count_users()['total_users'] );
}

کدی که نوشتم برای آموزش هست و فقط تعداد کاربران رو میگیره و ایمیل میکنه

مثل هر عمل دیگه ای توی وردپرس، اول باید کارمون رو ریجستر کنیم و به وردپرس معرفی کنیم. که این کار رو با تابع mj_register_users_count_event انجام میدیم. توی خط ۱۰ ایونت مربوط به کرون جاب رو معرفی میکنیم(تابع wp_schedule_event) آرگومان‌ها به ترتیب:

  • $timestamp: زمانی که می‌خوایم کرون شروع بشه.
  • $recurrence: دوره زمانی که هر بار قراره کدهامون اجرا بشن.
  • $hook: اسم هوکی هست که به تابع کدهای خودمون وصل میشه.

در حقیقت خط ۱۰ ارتباط دهنده تمام چیزها هست.

خط ۱۷ هم از هوک استفاده میکنیم که تابعمون رو صدا بزنیم و کدهامون رو اجرا کنه. تابعمون هم که توی خط ۲۲ با نام mj_users_count هست.

برای مدیریت کرون جاب‌ها پلاگین های زیر هست که میتونید استفاده کنید:

منابعی که میتونید برای آشنایی بیشتر استفاده کنید:

۳ Comments

  1. ho3yn86
    ۲۱ مرداد ۱۴۰۱ @ ۳:۱۸ ق٫ظ

    عالی. فقط بهتر بود اول توضیح میدادی که کلا چرا باید توی کرون جاب اصلی وردپرس دست برد!

    Reply

    • محمدجعفر خواجه
      ۲۱ مرداد ۱۴۰۱ @ ۱۰:۱۰ ق٫ظ

      سلام
      خیلی خوشحال کننده بود که بالاخره یه نفر درباره مقالم نظر داد 🤩
      لطف میکنی یکم دقیق تر بگی کجاش منظورته؟
      و چه بهتر اگه خودت در این باره اطلاع داری نظرت رو بگی شاید اصلا این چیزی که میخوای توضیح بدم من نمیدونستم 😂

      Reply

      • بهنام
        ۱۶ اردیبهشت ۱۴۰۲ @ ۱:۰۴ ب٫ظ

        منم نظر میدم پس
        دمت گرم خسته نباشی عالی بود

        Reply

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *

این سایت از اکیسمت برای کاهش هرزنامه استفاده می کند. بیاموزید که چگونه اطلاعات دیدگاه های شما پردازش می‌شوند.