مقاله کاربردی

WP-Cron وردپرس چیست؟ آموزش رفع مشکلات و تنظیم کرون واقعی

WP-Cron وردپرس چیست؟ آموزش رفع مشکلات و تنظیم کرون واقعی

چکیده مطلب

آموزش WP-Cron وردپرس؛ از نحوه کار زمان‌بندی تا رفع خطای Missed Schedule، تنظیم Cron واقعی سرور و ساخت رخداد سفارشی با کد.

زمان مطالعه: 2 دقیقهدسته: وردپرسبه‌روزرسانی: 1405/08/03

WP-Cron وردپرس چیست؟ آموزش رفع مشکلات و تنظیم کرون واقعی

WP-Cron وردپرس چیست؟ آموزش رفع مشکلات و تنظیم کرون واقعی

WP-Cron وردپرس از آن دسته مفاهیمی است که تا وقتی سایت کوچک است نادیده گرفته می‌شود، اما به محض رشد ترافیک، خرید یا اشتراک، اهمیت آن در سرعت، ارسال ایمیل و اجرای به‌موقع کارهای زمان‌بندی‌شده کاملاً مشخص می‌شود. افزونه‌های پشتیبان‌گیری، صف ایمیل، به‌روزرسانی خوراک، پاک‌سازی ترنزنت و حتی انتشار زودهنگام نوشته‌ها به همین زمان‌بند متکی هستند. اگر کرون وردپرس کار نکند، بسیاری از این کارها یا اجرا نمی‌شوند یا با تأخیر غیرقابل‌پیش‌بینی انجام می‌شوند.

این مقاله تلاش می‌کند تصویر روشنی از WP-Cron ارائه دهد: ابتدا سازوکار داخلی آن را توضیح می‌دهیم، سپس مشکلات رایج مانند Missed Schedule یا کندی سایت را بررسی می‌کنیم و در ادامه نشان می‌دهیم که چگونه Cron واقعی سرور را جایگزین WP-Cron کنیم و رخداد سفارشی خود را با کد بسازیم. در پایان نیز مسیر بازگشت و عیب‌یابی عملی را مرور می‌کنیم.

WP-Cron چیست و چگونه کار می‌کند؟

تصویر شمارهٔ 2 دربارهٔ «WP-Cron چیست و چگونه کار می‌کند؟» در مقالهٔ «WP-Cron وردپرس چیست؟ آموزش رفع مشکلات و تنظیم کرون واقعی»
بخش 2: WP-Cron چیست و چگونه کار می‌کند؟

WP-Cron یک زمان‌بند شبه‌واقعی است که به‌صورت پیش‌فرض در هستهٔ وردپرس فعال است. برخلاف Cron سیستم‌عامل که توسط سرور در زمان دقیق اجرا می‌شود، WP-Cron به ترافیک سایت وابسته است. وردپرس فهرست رخدادهای زمان‌بندی‌شده را در جدول wp_options و در گزینه‌ای به نام cron ذخیره می‌کند. در هر بار بارگذاری صفحه، وردپرس این آرایه را بررسی می‌کند و اگر رخدادی سررسید شده باشد، آن را اجرا می‌کند.

اجرای رخدادها معمولاً از طریق یک درخواست داخلی به فایل wp-cron.php انجام می‌شود؛ به این درخواست loopback می‌گویند. وقتی بازدیدکننده‌ای وارد سایت می‌شود و رخدادی مانند انتشار برنامه‌ریزی‌شده یا ارسال ایمیل، سررسید شده باشد، وردپرس به‌صورت غیرهم‌زمان این درخواست را به wp-cron.php ارسال می‌کند و تابع متصل به هوک رخداد را اجرا می‌کند.

این طراحی مزیت مهمی دارد: راه‌اندازی آن به دانش سرور نیاز ندارد و روی همهٔ هاست‌های اشتراکی کار می‌کند. اما هزینهٔ آن نیز مشخص است؛ اگر سایتی ترافیک کمی داشته باشد، رخدادها ممکن است ساعت‌ها اجرا نشوند و اگر ترافیک زیادی داشته باشد، هر بار صفحه‌ای بارگذاری می‌شود، بررسی و اجرای کرون می‌تواند به‌صورت ناگهانی منابع سرور را مصرف کند. دقیقاً به همین دلیل است که برای سایت‌های پرمصرف، جایگزینی WP-Cron با Cron واقعی سرور یک اقدام استاندارد بهینه‌سازی محسوب می‌شود.

تفاوت WP-Cron با Cron واقعی سیستم‌عامل

تصویر شمارهٔ 3 دربارهٔ «تفاوت WP-Cron با Cron واقعی سیستم‌عامل» در مقالهٔ «WP-Cron وردپرس چیست؟ آموزش رفع مشکلات و تنظیم کرون واقعی»
بخش 3: تفاوت WP-Cron با Cron واقعی سیستم‌عامل

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

ویژگیWP-CronCron واقعی
وابستگی به ترافیکداردندارد
دقت زمانیتقریبیدقیق
نیاز به دسترسی به سرورندارددارد
مناسب سایت‌های کوچکبلههمچنین بله
مناسب سایت‌های پرمصرفخیربله

نکتهٔ مهم این است که WP-Cron و Cron واقعی جایگزین یکدیگر نیستند؛ شما می‌توانید WP-Cron را غیرفعال کنید و همان کارها را با Cron سرور اجرا کنید. حتی بهتر است اگر افزونه‌ای از هوک‌های cron استفاده می‌کند، آن هوک را با Cron واقعی سرور بیش از پیش منظم کنید.

مشکلات رایج WP-Cron وردپرس

بیشترین گزارش‌های مرتبط با WP-Cron به چند دسته تقسیم می‌شوند: اجرا نشدن رخدادها، کندی ناگهانی سایت، عدم ارسال ایمیل‌های تراکنشی و خطای انتشار نوشته‌ها. در ادامه رایج‌ترین این مشکلات را بررسی می‌کنیم.

خطای Missed Schedule چیست؟

زمانی که یک نوشته قرار است در زمان مشخصی منتشر شود، وردپرس یک رخداد cron برای آن ثبت می‌کند. اگر به هر دلیل، این رخداد در زمان مقرر اجرا نشود، وضعیت نوشته به‌صورت «از دست‌رفته» یا Missed Schedule در می‌آید. این مشکل اغلب زمانی رخ می‌دهد که سایت ترافیک کمی دارد، WP-Cron غیرفعال شده اما Cron سرور درست تنظیم نشده، یا حافظهٔ PHP به‌قدری کم است که پردازش رخدادها ناقص انجام می‌شود.

اگر سایت شما با خطای محدودیت حافظه مواجه می‌شود، پیش از بررسی کرون، موضوع مدیریت حافظه در وردپرس را مرور کنید؛ چون اجرای چند رخداد سنگین هم‌زمان می‌تواند مصرف حافظه را به‌طور چشمگیری افزایش دهد.

کندی سایت در نخستین بازدید پس از سررسید رخدادها

فرض کنید چند افزونه، پاک‌سازی و ایمیل در یک ساعت مشخص زمان‌بندی شده‌اند. نخستین کاربری که بعد از آن ساعت وارد سایت می‌شود، در واقع اجرای همهٔ این رخدادها را به‌صورت غیرهم‌زمان فعال می‌کند. در سایت‌های کوچک این مسئله کم‌اهمیت است، اما در سایت‌های شلوغ می‌تواند باعث ایجاد تأخیر، افزایش مصرف CPU و حتی خطای 503 شود. روش حل اصولی همین است که در ادامه توضیح می‌دهیم: غیرفعال کردن WP-Cron و انتقال آن به Cron واقعی سرور.

در سایت‌های بزرگ، کندی و افزایش بار معمولاً فقط به کرون مربوط نیست؛ اگر مشکل سرعت ادامه‌دار است، مقالهٔ حل مشکل لود نشدن و کم بودن سرعت سایت‌های وردپرسی را نیز بخوانید.

تشخیص سالم بودن WP-Cron

تشخیص سالم بودن WP-Cron

قبل از تغییر سامانهٔ زمان‌بندی، باید وضعیت فعلی را دقیق ببینید. ساده‌ترین راه، استفاده از WP-CLI است. اگر به‌واسطهٔ SSH به سرور دسترسی دارید، دستورهای زیر را اجرا کنید:

wp cron event list
wp cron event run --due-now
wp cron test

خروجی دستور wp cron test باید سالم بودن اجرای wp-cron.php را تأیید کند. دستور wp cron event list نیز فهرست رخدادهای ثبت‌شده، هوک، آرگومان‌ها و زمان بعدی اجرا را نشان می‌دهد. اگر خروجی خالی بود یا رخدادهای مهمی مانند publish_post یا action_scheduler در آن دیده نمی‌شد، یعنی زمان‌بندی به‌درستی کار نمی‌کند.

برای مدیرانی که دسترسی SSH ندارند، افزونهٔ WP Crontrol ابزار مناسبی است. این افزونه به شما اجازه می‌دهد رخدادهای cron را ببینید، رخداد جدید بسازید، هوک‌های گران‌قیمت را شناسایی کنید و رخدادهای تکراری یا مخرب را حذف کنید. همچنین می‌توانید از افزونه‌هایی مانند Advanced Cron Manager برای مشاهدهٔ خطاهای اجرا و زمان‌های بعدی رخدادها استفاده کنید.

تنظیم Cron واقعی سرور به‌جای WP-Cron

برای اینکه وردپرس دیگر در هر بازدید، رخدادهای cron را بررسی و اجرا نکند، باید WP-Cron را غیرفعال کنید. این کار را با افزودن ثابت زیر به فایل wp-config.php انجام دهید:

define( 'DISABLE_WP_CRON', true );

این تعریف را پیش از خط «That’s all, stop editing» در فایل wp-config.php قرار دهید. پس از این تغییر، وردپرس فقط رخدادها را در پایگاه داده نگه می‌دارد، اما خودش آن‌ها را اجرا نمی‌کند. در این مرحله اگر Cron سرور را تنظیم نکرده باشید، هیچ رخدادی اجرا نخواهد شد؛ بنابراین ابتدا Cron واقعی را فعال کنید و سپس WP-Cron را غیرفعال کنید.

افزودن Cron در cPanel

در هاست‌های اشتراکی، معمولاً بخش Cron Jobs در cPanel یا دایرکت‌ادمین وجود دارد. یک کار cron جدید با بازهٔ زمانی ۵ دقیقه بسازید و دستور زیر را وارد کنید:

wget -q -O - https://example.com/wp-cron.php?doing_wp_cron >/dev/null 2>&1

در این دستور، example.com را با آدرس دقیق سایت خود جایگزین کنید. پارامتر doing_wp_cron فقط برای شبیه‌سازی درخواست عادی است و به وردپرس اجازه می‌دهد رخدادهای سررسیدشده را پردازش کند. استفاده از wget به‌جای curl معمولاً در هاست‌های اشتراکی پایدارتر است.

افزودن Cron در سرور لینوکسی با SSH

اگر روی سرور خود دسترسی SSH دارید، ابتدا فایل crontab را باز کنید:

crontab -e

سپس این خط را به انتهای فایل اضافه کنید:

*/5 * * * * wget -q -O - https://example.com/wp-cron.php?doing_wp_cron >/dev/null 2>&1

بازهٔ ۵ دقیقه برای اغلب سایت‌ها کافی است. اگر افزونه‌های صف‌مانندی مانند Action Scheduler دارید، ممکن است به بازهٔ یک دقیقه‌ای نیاز داشته باشید:

* * * * * wget -q -O - https://example.com/wp-cron.php?doing_wp_cron >/dev/null 2>&1

برای اینکه مطمئن شوید سایت از طریق آدرس عمومی که در تنظیمات وردپرس ثبت شده در دسترس است، از URL دقیق سایت استفاده کنید. اگر سایت پشت Cloudflare یا CDN است، گاهی درخواست‌های ناشناس به wp-cron.php ممکن است بلاک شوند؛ در این صورت باید آن را در لیست سفید قرار دهید یا از WP-CLI استفاده کنید.

ساخت رخداد زمان‌بندی‌شده با کد سفارشی

گاه باید کار خودتان را در بازهٔ زمانی مشخص اجرا کنید؛ مثلاً پاک‌سازی فایل‌های موقت، ارسال گزارش روزانه یا همگام‌سازی اطلاعات. برای این کار سه تابع اصلی در وردپرس کافی است: wp_schedule_event برای ثبت رخداد، add_action برای اتصال تابع به هوک و wp_clear_scheduled_hook برای حذف رخداد.

<?php
/**
 * افزونه نمونه: ساخت رخداد زمان‌بندی‌شده سفارشی
 */

function wpw_custom_cron_interval( $schedules ) {
    $schedules['every_ten_minutes'] = array(
        'interval' => 600,
        'display'  => __( 'هر ده دقیقه', 'wpw-textdomain' ),
    );
    return $schedules;
}
add_filter( 'cron_schedules', 'wpw_custom_cron_interval' );

function wpw_schedule_cleanup_event() {
    if ( ! wp_next_scheduled( 'wpw_cleanup_hook' ) ) {
        wp_schedule_event( time(), 'every_ten_minutes', 'wpw_cleanup_hook' );
    }
}
add_action( 'wp', 'wpw_schedule_cleanup_event' );

function wpw_do_cleanup_task() {
    // عملیات واقعی پاک‌سازی در این تابع انجام می‌شود.
    error_log( 'wpw_cleanup_hook executed: ' . current_time( 'mysql' ) );
}
add_action( 'wpw_cleanup_hook', 'wpw_do_cleanup_task' );

در این مثال ابتدا یک بازهٔ سفارشی به نام every_ten_minutes به فهرست بازه‌های وردپرس اضافه شده است. سپس تابع wpw_schedule_cleanup_event بررسی می‌کند که آیا هوک wpw_cleanup_hook قبلاً ثبت شده است یا نه. این بررسی مهم است تا در هر بار بارگذاری صفحه، رخداد تکراری ساخته نشود. در نهایت، تابع wpw_do_cleanup_task به هوک متصل شده است و هر زمان رخداد اجرا شود، این تابع فراخوانی می‌شود.

بهتر است کد زمان‌بندی را در یک افزونهٔ اختصاصی قرار دهید و از قرار دادن آن در فایل functions.php پوسته اجتناب کنید؛ چون با تغییر پوسته، رخداد حذف و دوباره ساخته می‌شود. اگر رخداد قبلاً ثبت شده و می‌خواهید آن را حذف کنید، تابع زیر را یک بار فراخوانی کنید:

wp_clear_scheduled_hook( 'wpw_cleanup_hook' );

رفع رخدادهای ازدست‌رفته و پاک‌سازی cron

پس از فعال‌سازی Cron واقعی، ممکن است برخی رخدادهای قدیمی، بیش از یک بار در صف باقی مانده باشند. برای دیدن رخدادهای تکراری می‌توانید دوباره از WP-CLI استفاده کنید:

wp cron event list --fields=hook,next_run,status

اگر رخدادی با وضعیت due یا missed می‌بینید، می‌توانید آن را به‌صورت دستی اجرا یا حذف کنید:

wp cron event run wpw_cleanup_hook
wp cron event delete wpw_cleanup_hook

در برخی موارد، رخدادهای تکرارشونده به‌دلیل خطاهای قبلی، کلیدهای نامعتبری در گزینهٔ cron باقی می‌گذارند. افزونهٔ WP Crontrol در همین جا کاربرد پیدا می‌کند؛ می‌توانید رخدادهای یتیم را شناسایی و حذف کنید. اگر از Action Scheduler استفاده می‌کنید، گاهی لازم است با افزونه یا WP-CLI صف‌های نیمه‌کاره را مجدداً اجرا کنید:

wp action-scheduler run

همچنین به‌خاطر داشته باشید که اجرای کرون با درخواست HTTP، در صورت استفاده از کش صفحه، گاهی با تداخل روبه‌رو می‌شود. در سایت‌هایی که از WP Rocket یا افزونه‌های کش استفاده می‌کنند، مطمئن شوید صفحهٔ wp-cron.php از کش خارج شده است. در غیر این صورت، وجود پارامتر doing_wp_cron در URL کمک می‌کند تا این درخواست کش نشود.

چند نکته برای جلوگیری از بازگشت مشکل

  • هرگز چند افزونهٔ زمان‌بند هم‌زمان با Cron واقعی و WP-Cron فعال نداشته باشید؛ ابتدا WP-Cron را غیرفعال و سپس Cron سرور را تنظیم کنید.
  • برای رخدادهای سفارشی، فقط یک بار و با شرط wp_next_scheduled زمان‌بندی را انجام دهید تا از اجرای تکراری جلوگیری شود.
  • میزان مصرف حافظه را بررسی کنید؛ اجرای رخدادهای سنگین می‌تواند به خطای fatal منجر شود. در این صورت، موضوع مدیریت حافظه در وردپرس را دوباره مرور کنید.
  • لاگ خطاها را فعال کنید و خروجی خطاهای cron را در فایل error_log بررسی کنید.
  • پس از هر تغییر در wp-config.php، سایت را در چند دقیقهٔ مختلف بازدید کنید تا مطمئن شوید رخدادها در موعد مقرر اجرا می‌شوند.

جمع‌بندی

WP-Cron وردپرس برای شروع کار ساده و مناسب است، اما وقتی سایت رشد می‌کند، وابستگی آن به ترافیک و اجرای ناگهانی چند رخداد، می‌تواند به کندی و بی‌ثباتی منجر شود. بهترین راهکار، غیرفعال کردن WP-Cron و انتقال زمان‌بندی به Cron واقعی سرور است. با این تغییر، رخدادها در زمان دقیق و بدون وابستگی به بازدید اجرا می‌شوند، ایمیل‌ها منظم ارسال می‌شوند و احتمال خطای Missed Schedule تقریباً از بین می‌رود.

اگر می‌خواهید رخداد سفارشی خود را بسازید، استفاده از wp_schedule_event به همراه بررسی wp_next_scheduled بهترین مسیر است. حتماً کد زمان‌بندی را داخل افزونهٔ اختصاصی قرار دهید، در غیرفعال‌سازی رخداد را پاک کنید و خروجی خطاها را زیر نظر داشته باشید. با رعایت همین نکات، سامانهٔ زمان‌بندی سایت شما سال‌ها بدون دردسر کار خواهد کرد.

دنیای وردپرس

دنیای وردپرس

نویسنده و توسعه‌دهنده وردپرس

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

گفت‌وگو

دیدگاه‌ها

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

هنوز دیدگاهی ثبت نشده است.

اولین نفری باشید که دیدگاه خود را درباره این مقاله ثبت می‌کند.

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

پیشنهاد ویژه

محصولات پیشنهادی مرتبط با این مقاله

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

مشاهده همه محصولات