زمان‌بندی رویداد‌ها در وردپرس

Cron Job یکی از قابلیت‌های معروف سیستم‌های یونیکسی است که به کاربران این امکان رو می‌دهد که دستورات مشخصی را در زمان خاص یا دوره‌ی خاص اجرا کنند. برای مثال یک دستور هر روز در ساعت ۱۶ اجرا شود یا هر ۱۰ دقیقه یک‌بار یک فایل دانلود شود.

هاستینگ‌های بسیاری این امکان را به مشتریان خود می‌دهند که بتوانند Cron Jobهای خود را تنظیم کنند. اما بسیاری از مواقع امکان استفاده از این Cron Jobها وجود ندارد.

برای مثال اگر شما یک توسعه‌دهنده افزونه وردپرس هستید، تقریباً امکان استفاده از Cron Job یونیکس برایتان وجود ندارد، چون ممکن است هر کسی با نحوه تنظیم Cron Job آشنا نباشد.

خوشبختانه وردپرس یک سیستم قوی Cron Job داخلی دارد که به توسعه‌دهندگان این امکان را می‌دهد که در مدت مشخصی دستورات موردنظر را اجرا کنند. برای مثال هر روز، نسخه جدید پلاگین را چک کنند و …

مزایا و معایب سیستم Cron Job داخلی وردپرس نسبت به خویشاوند یونیکسی آن را در زیر آورده‌ام:

مزایا:

  • عدم وابستگی به سیستم‌عامل سرور
  • امکان تغییر زمان و دوره Cron در هر زمان
  • استفاده آسان برای توسعه‌دهندگان مبتدی

معایب:

  • سیستم Cron داخلی وردپرس به بازدید کاربران بستگی دارد. یعنی هر کاربری که سایت را باز کند، وردپرس چک می‌کند که آیا زمان انجام وظیفه محول‌شده فرا رسیده یا خیر. در صورتی که سایت کم بازدید باشد، سیستم داخلی ممکن است به کار نیاید.
  • دقیق نبودن زمان انجام: شما ممکن است Cron را روی روز شنبه ساعت ۲۲:۰۰ تنظیم کنید، اما به دلیلی که بالا گفته شد، ممکن است که وظیفه محول‌شده ساعت ۲۲:۱۵ یا حتی دیرتر روی دهد. البته اگر ساعت ۲۲:۰۱ بازدیدی از سایت انجام شود، وظیفه همان موقع اجرا می‌شود.

ثبت یک رویداد برای تکرار

در ادامه یک وظیفه ساده به وردپرس برای اجرا محول می‌کنیم. کدهای زیر را می‌توانید در functions.php قالب خود یا یک پلاگین جدا بنویسید.

برای ایجاد یک رویداد زمان‌بندی‌شده (Scheduled Event) که با نام وظیفه قبلاً معرفی کردم، کافیست ابتدا چک کنیم که آیا قبلاً این رویداد توسط وردپرس شناخته شده یا خیر، در غیر این صورت، آن را به وردپرس معرفی می‌کنیم.

برای معرفی، بایستی به تگ wp فانکشن معرفی را هُک کنیم.

add_action( 'wp', 'wp_parsi_scheduled_event' );
function wp_parsi_scheduled_event() {
	if ( ! wp_next_scheduled( 'wp_parsi_daily_task' ) )
		wp_schedule_event( time(), 'daily', 'wp_parsi_daily_task' );
}

همان‌طور که در کد تابع wp_parsi_scheduled_event مشاهده می‌کنید، ابتدا چک کردیم که آیا رویدادی با نام wp_parsi_daily_task قبلاً زمان‌بندی شده یا خیر. در غیر این صورت یک رویداد زمان‌بندی ثبت کند. برای ثبت یک رویداد از تابع wp_schedule_event استفاده می‌کنیم. پارامترهای این تابع به ترتیب:

  1. start_time : زمان شروع این رویداد. در زمان تنظیم‌شده ابتدا دستورات اجرا می‌شود و نوبت بعدی اجرا مطابق پارامتر دوم خواهد شد. مقدار این پارامتر باید بر حسب زمان یونیکسی باشد. برای مثال استفاده از تابع time زمان یونیکسی الان را برمی‌گرداند.
  2. recurrence : زمان تکرار این رویداد. به طور پیش‌فرض وردپرس سه مقدار hourly، daily و twicedaily را داراست. در ادامه فرا می‌گیریم که چگونه زمان تکرار دلخواه خودمان را اضافه کنیم.
  3. hook : نام رویداد زمان‌بندی‌شده و همچنین نام هُکی که برای اجرای دستورات باید آن‌ها را به آن هُک کنیم.

حالا برای مشخص‌کردن دستوراتی که باید اجرا شوند، کافیست که یک تابع به wp_parsi_daily_task هُک کنیم.

add_action( 'wp_parsi_daily_task', 'wp_parsi_func' );
function wp_parsi_func() {
	// ... code here ...
}

به همین راحتی! به این راحتی شما می‌توانید با این سیستم کار کنید.

نکته مهم: نکته‌ای که بیشتر توسعه‎دهندگان در توسعه پلاگین و پوسته‌هایی که از سیستم Cron داخلی استفاده می‌کنند، رعایت نمی‌کنند، پاک‌نکردن رویدادها در هنگام غیرفعال‌شدن افزونه یا پلاگین است. برای حذف رویداد از سیستم وردپرس، از کد مشابه زیر برای پلاگین‌ها استفاده کنید:

register_deactivation_hook( __FILE__, 'wp_parsi_remove_task' ); // be jaye __FILE__, sabet file asli plugin khod ra jaygozin konid
function wp_parsi_remove_task() {
	if ( wp_next_scheduled( 'wp_parsi_daily_task' ) )
		wp_clear_scheduled_hook( 'wp_parsi_daily_task' );
}

تکرار رویدادها به صورت سفارشی

همان‌طور که پیش‌تر اشاره شد، وردپرس پیش‌فرض از سه نوع برای تکرار رویدادها استفاده می‌کند:

  1. daily : روزانه (هر ۲۴ ساعت)
  2. twicedaily : دو بار در روز (هر ۱۲ ساعت)
  3. hourly : هر ساعت (هر ۶۰ دقیقه)

شاید شما نیاز به هر ۵ دقیقه یا هر یک ماه داشته باشید. کافیست که فاصله زمانی بین هر تکرار به ثانیه به وردپرس تحویل دهید. برای مثال هر پنج دقیقه به ثانیه برابر با ۵ * ۶۰ می‌شود یا هر ماه برابر ۶۰ * ۶۰ * ۲۴ * ۳۰ می‌شود. برای معرفی از فیلتر cron_schedules به صورت زیر استفاده می‌کنیم.

add_filter( 'cron_schedules', 'wp_parsi_custom_schedule' );
function wp_parsi_custom_schedule( $schedules ) {
	$schedules[ 'five_minutes' ] = array(
		'interval' 			=>	۵ * ۶۰,
		'display' 			=>	'Once five minutes'
	);

	return $schedules;
}

برای تعریف، ابتدا یک عضو جدید به آرایه با کلید five_minutes اضافه کردیم، سپس برای کلید interval آن، ۵ دقیقه را به ثانیه تعریف کردیم و برای display هم مقدار دلخواهی در نظر می‌گیریم.

حالا در تابع wp_schedule_event می‌توانید از five_minutes به جای daily یا hourly و … استفاده کنید تا رویداد شما هر پنج دقیقه اجرا شود.


سخن پایانی

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

  • تا حد امکان کوئری‌ها را از دیتابیس محدود کنید.
  • فواصل زمانی بین اجرای رویدادها را بیش‌تر کنیم، برای‎مثال استفاده هر ۵ دقیقه یک‎بار ممکن است فشار زیادی به سرور بیاورد یا حتی باعث داون‎شدن آن شود.
  • در هنگام دی‌اکتیوکردن افزونه یا پوسته، استفاده از wp_clear_schedule_hook را فراموش نکنید.
  • سعی کنید بیش از ۲ فانکشن به هُک رویداد اضافه نکنید.

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

۱۰:۴۷ - ۱۳۹۴/۰۶/۲۳