آموزش کار با کرون در وردپرس

کرون در وردپرس

کرون در حقیقت یک زمان بند اجرای کارهای مختلف در یونیکس است. کرون در وردپرس به منظور مدیریت رویدادهای زمان بندی شده استفاده می شود. از جمله کارهای زمان بندی شده در وردپرس می توان بررسی نسخه های جدید وردپرس، بررسی بروزرسانی پلاگین ها و تم ها و انتشار پست های زمان بندی شده را نام برد. کرون در وردپرس هنگامی که بارگذاری صفحه ای از سایت به اجرا در می آید. هر بار که صفحه ای درخواست شود، وردپرس بررسی می کند که آیا کاری برای اجرای کرون وجود دارد یا نه.

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

زمان بندی یک رویداد تکرار شونده

برای اجرای یک رویداد کرون لازم است که هوک اکشنی برای آن ایجاد نمایید. هوک اکشن ثبت شده توسط زمان بند کرون در زمان تعیین شده به اجرا در می آید. با اجرای هوک اکشن، تابع اکشن برگشتی آن به اجرا در آمده و عملیات مد نظر انجام می پذیرد.

برای زمان بندی یک رویداد تکرار شونده در وردپرس می توان از تابع wp_schedule_event استفاده کرد. این تابع چهار پارامتر ورودی می پذیرد: پارامتر اول زمانی که می خواهید رویداد اتفاق افتد، پارامتر دوم تکرار مجدد رویداد هر چند وقت است، پارامتر سوم نام هوک اکشن اجرایی و پارامتر چهارم آرایه ای از آرگومان های ارسالی به تابع برگشتی هوک.  

مثال:

< ?php
/*
Plugin Name: Cron Example Plugin
Plugin URI: http://example.com/wordpress-plugins/my-plugin
Description: A plugin demonstrating Cron in WordPress
Version: 1.0
License: GPLv2
*/
             
add_action( ‘admin_menu’, ‘bmpt_cron_menu’ );
             
function bmpt_cron_menu() {
             
    //create cron example settings page
    add_options_page( ‘Cron Example Settings’, ‘Cron Settings’,
        ‘manage_options’, ‘bmpt-cron’, ‘bmpt_cron_settings’ );
             
}
             
add_action(‘bmpt_cron_hook’, ‘bmpt_cron_email_reminder’);
             
function bmpt_cron_email_reminder() {
             
    //send scheduled email
    wp_mail( ‘you@example.com’, ‘Elm St. Reminder’,
        ‘Don\’t fall asleep!’ );
             
}
             
function bmpt_cron_settings() {
             
    //verify event has not been scheduled
    if ( !wp_next_scheduled( ‘bmpt_cron_hook’ ) ) {
             
        //schedule the event to run hourly
        wp_schedule_event( time(), ‘hourly’, ‘bmpt_cron_hook’ );
             
    }
             
}
? >

در مثال فوق، زمان بند وردپرس به صورتی ساعتی ایمیلی به آدرس مشخص ارسال می گردد. تابع wp_next_scheduled تایم استمپ بعدی برای یک رویداد کرون را برمی گرداند. در صورت عدم وجود رویداد مقدار false توسط این تابع برگشت داده می شود.

زمان بندی یک رویداد تک اجرایی

برای زمان بندی رویداد تک اجرایی از تابع wp_schedule_single_event استفاده می شود. این تابع سه پارامتر ورودی می پذیرد: پارامتر اول زمان اجرای رویداد، پارامتر دوم نام هوک اکشن اجرایی و پارامتر سوم آرایه ای از آرگومان های ارسالی به تابع برگشتی هوک.

< ?php
/*
Plugin Name: Cron Example Plugin
Plugin URI: http://example.com/wordpress-plugins/my-plugin
Description: A plugin demonstrating Cron in WordPress
Version: 1.0
License: GPLv2
*/
//create the plugin menu
add_action( ‘admin_menu’, ‘bmpt_cron_single_menu’ );
             
function bmpt_cron_single_menu() {
             
    //create cron example settings page
    add_options_page( ‘Cron Example Settings’, ‘Cron Settings’,
        ‘manage_options’, ‘bmpt-single-cron’, ‘bmpt_cron_single_settings’ );
             
}
             
//create the custom hook for cron scheduling
add_action( ‘bmpt_single_cron_hook’,
    ‘bmpt_cron_single_email_reminder’ );
             
function bmpt_cron_single_email_reminder () {
             
    //send scheduled email
    wp_mail( ‘you@example.com’, ‘Reminder’, ‘You have a meeting’ );
             
}
             
function bmpt_cron_single_settings() {
             
    //verify event has not been scheduled
    if ( !wp_next_scheduled( ‘bmpt_single_cron_hook’ ) ) {
             
        //schedule the event to in one hour
        wp_schedule_single_event( time()+3600,
            ‘bmpt_single_cron_hook’ );
             
    }
             
}
? >  

حذف زمان بندی رویداد

تمامی رویدادهای زمان بندی شده کرون در وردپرس در جدول wp_options ذخیره می گردد و با غیرفعالسازی پلاگینی که آن را ایجاد کرده حذف نمی گردد. برای حذف درست یک رویداد کرون باید از تابع wp_unschedule_event استفاده نمود. این تابع سه پارامتر ورودی می پذیرد: پارامتر اول زمان وقوع بعدی رویداد، پارامتر دوم نام اکشن هوکی که باید حذف شود و پارامتر سوم آرایه ای از آرگومانهای ارسالی به تابع برگشتی هوک می باشد.

< ?php
//get time of next scheduled run
$timestamp = wp_next_scheduled( ‘bmpt_cron_hook’ );
             
//unschedule custom action hook
wp_unschedule_event( $timestamp, ‘bmpt_cron_hook’ );
? >

تخصیص فاصله زمانی سفارشی به رویدادها کرون

وردپرس به صورت پیش فرض دارای سه فاصله زمانی تعریف شده برای وقوع رویدادها است: hourly (ساعتی)، twice daily (دوبار در روز) و daily (روزانه). وردپرس امکان تعریف فاصله زمانی سفارشی برای رویدادهای کرون را دارا می باشد. برای این منظور می توان فیلتری برای هوک cron_schedules ایجاد نمود و فاصله زمانی جدیدی را به لیست موجود اضافه نمود.

< ?php
add_filter( ‘cron_schedules’, ‘bmpt_cron_add_weekly’ );
             
function bmpt_cron_add_weekly( $schedules ) {
             
    //create a ‘weekly’ recurrence schedule option
    $schedules[‘weekly’] = array(
        ‘interval’ = >  604800,
        ‘display’ = >  ‘Once Weekly’
    );
             
    return $schedules;
}
? >

در تابع فیلتر آرایه ورودی $schedules لیستی از فواصل زمانی تعریف شده را نگه می دارد. با افزودن تنظیمات فاصله زمانی مورد نظر به این آرایه، رویدادهای کرون می توانند از آن استفاده نمایند. نامی که به عنوان اندیس آرایه در نظر می گیریم برای شناسایی فاصله زمانی استفاده می گردد. آرگومان های interval آرایه بیانگر مدت فاصله زمانی به ثانیه است. آرگومان display نام نمایشی این فاصله زمانی است.

اکنون به راحتی می توان فاصله زمانی جدید را در زمان بندی یک رویداد استفاده کرد:

< ?php 
wp_schedule_event( time(), ‘weekly’, ‘bmpt_cron_hook’ ); 
? >   

دریافت اطلاعات رویدادهای زمان بندی شده

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

< ?php
/*
Plugin Name: View Cron Jobs Plugin
Plugin URI: http://example.com/wordpress-plugins/my-plugin
Description: A plugin demonstrating Cron in WordPress
Version: 1.0
License: GPLv2
*/
             
add_action( ‘admin_menu’, ‘bmpt_view_cron_menu’ );
             
function bmpt_view_cron_menu() {
             
    //create view cron jobs settings page
    add_options_page( ‘View Cron Jobs’, ‘View Cron Jobs’,
        ‘manage_options’, ‘bmpt-view-cron’, ‘bmpt_view_cron_settings’ );
             
}
             
function bmpt_view_cron_settings() {
             
    $cron = _get_cron_array();
    $schedules = wp_get_schedules();
    $date_format = ‘M j, Y @ G:i’;
    ? > 
     < div class=”wrap” id=”cron-gui” > 
     < h2 > Cron Events Scheduled < /h2 > 
             
     < table class=”widefat fixed” > 
         < thead > 
             < tr > 
                 < th scope=”col” > Next Run (GMT/UTC) < /th > 
                 < th scope=”col” > Schedule < /th > 
                 < th scope=”col” > Hook Name < /th > 
             < /tr > 
         < /thead > 
         < tbody > 
             < ?php foreach ( $cron as $timestamp = >  $cronhooks ) { ? > 
                 < ?php foreach ( (array) $cronhooks as
                    $hook = >  $events ) { ? > 
                     < ?php foreach ( (array) $events as $event ) { ? > 
                         < tr > 
                             < td > 
                                 < ?php echo date_i18n( $date_format,
                                    wp_next_scheduled( $hook ) ); ? > 
                             < /td > 
                             < td > 
                                 < ?php
                                if ( $event[ ‘schedule’ ] ) {
                                    echo $schedules[
                                        $event[ ‘schedule’ ] ][ ‘display’ ];
                                } else {
                                    ? > One-time < ?php
                                }
                                ? > 
                             < /td > 
                             < td >  < ?php echo $hook; ? >  < /td > 
                         < /tr > 
                     < ?php } ? > 
                 < ?php } ? > 
             < ?php } ? > 
         < /tbody > 
     < /table > 
     < /div > 
 < ?
}
? >

کرون حقیقی

همان طور که قبلا هم اشاره شد، کرون وردپرس یک کرون حقیقی نیست و براساس درخواست های بارگذاری صفحه به اجرا در می آید. برای اینکه بتوانید یک کار کرون را در فواصل زمانی مشخص به اجرا در آورید می توانید اجرای کرون وردپرس را غیرفعال و با استفاده از کرون جاب موجود در سرور فایل wp-cron.php را در زمان بندی مناسب به اجرا در آورید. برای غیرفعالسازی کرون وردپرس کافی است کد زیر را در فایل wp-config.php وارد کنید:

define(‘DISABLE_WP_CRON’, true);

معمولا سرور ها دارای برنامه ای برای مدیریت کارهای کرون هستند. با توجه به نوع سرور باید دستور اجرای فایل wp-cron.php در فواصل زمانی مشخص را در بخش مدیریت کارهای کرون وارد نمایید.

پست های مرتبط

Leave a Comment