وردپرس ساعت ندارد. کارهای زمانبندیشدهاش (انتشار نوشته، بکاپ افزونهها، ارسال ایمیل، بهروزرسانی) فقط وقتی اجرا میشوند که کسی صفحهای از سایت را باز کند. اگر در زمان موعد بازدیدی نباشد، یا صفحه از کش داده شود و وردپرس اصلاً اجرا نشود، کار جا میماند و کنار نوشته «زمانبندی از دست رفت» میبینید. راه رفع دائمی این است که کرون داخلی وردپرس را خاموش کنید و یک کرونجاب واقعی در سیپنل بسازید که هر چند دقیقه آن را صدا بزند.
WP-Cron چطور کار میکند؟
- بازدیدکنندهای صفحهای را باز میکند.
- وردپرس نگاه میکند کاری هست که موعدش رسیده باشد.
- اگر هست، یک درخواست جدا به wp-cron.php میفرستد تا در پسزمینه اجرا شود.
پس دقت زمانبندی به بازدید وابسته است، نه به ساعت.
چرا جا میماند؟
| علت | توضیح |
|---|---|
| بازدید کم | در ساعت موعد کسی سایت را باز نکرده |
| کش صفحه | صفحه از کش داده میشود و وردپرس اجرا نمیشود؛ روی سایتهای کششده شایعترین علت است |
| درخواست داخلی مسدود است | سایت نمیتواند به خودش وصل شود: رمز پوشه، فایروال، یا SSL نامعتبر |
| DISABLE_WP_CRON روشن است ولی کرون واقعی ساخته نشده | کسی نیمی از کار را انجام داده |
| صف طولانی | کار سنگینی وسط صف گیر کرده و بقیه پشتش ماندهاند |
| منطقهی زمانی اشتباه | ساعت سایت با ساعت واقعی فرق دارد |
راه دائمی: کرون واقعی
قدم ۱. در wp-config.php، بالای خط «That’s all»، اضافه کنید:
define('DISABLE_WP_CRON', true);
قدم ۲. در سیپنل، Cron Jobs را باز کنید و یک کار تازه بسازید که هر پنج دقیقه اجرا شود (از فهرست Common Settings گزینهی «Once Per Five Minutes»). در کادر Command یکی از این دو را بنویسید:
wget -q -O /dev/null "https://example.com/wp-cron.php?doing_wp_cron" >/dev/null 2>&1
یا با PHP مستقیم، که به وب وابسته نیست (مسیر را با مسیر واقعی سایت عوض کنید):
cd /home/USERNAME/public_html && php -q wp-cron.php >/dev/null 2>&1
قدم ۳. ده دقیقه صبر کنید و ببینید کارها اجرا میشوند. (ساخت کرونجاب در سیپنل)
هر دو قدم را با هم انجام دهید. اگر فقط قدم اول را بزنید، هیچ کار زمانبندیشدهای اجرا نمیشود.
چه فاصلهای؟
| سایت | فاصله |
|---|---|
| وبلاگ و سایت شرکتی | هر ۱۰ تا ۱۵ دقیقه |
| فروشگاه، سایت خبری، سایت با زمانبندی دقیق | هر ۵ دقیقه |
| هر دقیقه | لازم نیست و منابع را بیدلیل مصرف میکند |
یک فایدهی جانبی: سرعت و منابع
با کرون داخلی، وردپرس در هر بازدیدِ کشنشده بررسی میکند کاری هست یا نه، و روی سایت پربازدید درخواستهای wp-cron.php پشتسرهم ساخته میشود. با کرون واقعی، این بار از دوش بازدیدکننده برداشته میشود و مصرف منابع قابلپیشبینی میشود. (کم کردن مصرف CPU)
نوشتهای که جا مانده
نوشته را باز کنید و «انتشار» را بزنید، یا تاریخ را چند دقیقه جلوتر ببرید. بعد از راهاندازی کرون واقعی، این اتفاق دیگر نباید تکرار شود.
بررسی صف
افزونهی WP Crontrol فهرست همهی کارهای زمانبندیشده را نشان میدهد: نام، موعد بعدی و فاصله. سه چیز را ببینید:
- کارهایی که موعدشان گذشته و هنوز در صفاند.
- کارهایی از افزونههایی که دیگر نصب نیستند؛ قابل حذفاند.
- کاری که هر دقیقه یا هر چند ثانیه اجرا میشود؛ معمولاً یک افزونهی بدرفتار.
برای ووکامرس، صف جداگانهی Action Scheduler در وضعیت ووکامرس، بخش Scheduled Actions دیده میشود. موارد Pending قدیمی و Failed زیاد، نشانهی همین مشکل است.
اگر کرون واقعی هم کار نکرد
| بررسی | چطور |
|---|---|
| آدرس wp-cron.php از بیرون باز میشود؟ | در مرورگر بازش کنید؛ باید صفحهی سفید خالی بیاید، نه ۴۰۳ یا ۴۰۴ |
| قانون htaccess یا افزونهی امنیتی آن را بسته؟ | موقتاً غیرفعال کنید |
| سایت پشت رمز پوشه است؟ | از روش PHP مستقیم استفاده کنید |
| مسیر یا دامنه در دستور کرون درست است؟ | ایمیل خروجی کرون را موقتاً فعال کنید تا خطا را ببینید |
| منطقهی زمانی | تنظیمات، عمومی؛ شهر تهران را انتخاب کنید |
چه چیزهایی به کرون وابستهاند؟
- انتشار نوشتههای زمانبندیشده.
- بکاپ خودکار افزونهها.
- ایمیلهای پیگیری و یادآور فروشگاه، لغو سفارشهای پرداختنشده، پایان تخفیف زماندار.
- بهروزرسانی خودکار و بررسی نسخهها.
- پاکسازی کش و ترنزینتها.
- همگامسازی موجودی و قیمت با سرویسهای بیرونی.
اگر یکی از اینها «گاهی کار میکند و گاهی نه»، اول کرون را بررسی کنید.
سوالهای رایج
افزونههایی که «Missed Schedule» را رفع میکنند خوباند؟
آنها هم به بازدید وابستهاند و فقط نشانه را میپوشانند. کرون واقعی علت را حل میکند.
چند سایت روی یک هاست دارم.
برای هر سایت یک کرون جدا بسازید و دقیقهی شروعشان را متفاوت بگذارید تا همزمان اجرا نشوند.
کرون واقعی منابع بیشتری مصرف میکند؟
کمتر. بهجای بررسی در هر بازدید، هر چند دقیقه یک بار اجرا میشود.