شرح WP-Cron: كيف يعمل ومتى تعطله واستخدام Cron حقيقي على السيرفر

كيف يعمل WP-Cron، ولماذا تتأخر المهام المجدولة في المواقع قليلة الزيارات، وكيف تعطله وتستخدم Cron حقيقيا على السيرفر، وكيف تعرض الأحداث وتصلحها وتجدولها.

WP-Cron هو مجدول المهام المدمج في ووردبريس: الإضافات والنواة تسجل أحداثا (نشر المقالات المجدولة، إرسال الإيميلات، النسخ الاحتياطي، معالجة إجراءات ووكومرس)، ويفحص ووردبريس الأحداث المستحقة عند تحميل الصفحات ويشغلها عبر طلب خلفي إلى wp-cron.php. ولأنه يعتمد على الزيارات فهو غير دقيق، والحل هو Cron حقيقي على السيرفر.

هذا الدليل جزء من سلسلة الأتمتة.

كيف يعمل WP-Cron؟

مع كل تحميل صفحة يفحص ووردبريس هل يوجد حدث مجدول مستحق. إن وجد يرسل طلبا غير معطل إلى wp-cron.php لتشغيل الأحداث المستحقة. لا زيارات يعني لا فحص، فتتأخر المهام في المواقع الهادئة. وتحفظ الأحداث في خيار cron بقاعدة البيانات.

مشكلات السلوك الافتراضي

  • مواعيد فائتة في المواقع قليلة الزيارات: مقال مجدول للساعة 9:00 ينشر عند وصول الزائر التالي.
  • كاش الصفحات: إذا قدم الكاش الصفحات دون تشغيل PHP فقد لا يطلق ووردبريس Cron من هذه الزيارات.
  • فشل loopback: بعض الاستضافات أو الجدران النارية تمنع الموقع من طلب نفسه، فلا يعمل wp-cron.php أبدا، ويظهر ذلك في صحة الموقع.
  • حمل على المواقع المزدحمة: فحوصات متكررة ومهام طويلة تعمل داخل طلبات الويب.
  • اعتماد ووكومرس: Action Scheduler الذي يستخدمه ووكومرس في الويب هوكس والإيميلات والمهام الخلفية يعتمد على WP-Cron افتراضيا (مع طلبات غير متزامنة).

الخطوة 1: اعرف ما المجدول

باستخدام WP-CLI:

wp cron event list --fields=hook,next_run_relative,recurrence
wp cron schedule list
wp cron test

أو ثبت إضافة WP Crontrol لعرض الأحداث وتشغيلها وتعديلها من لوحة التحكم. ابحث عن:

  • أحداث متأخرة منذ وقت طويل.
  • Hooks من إضافات حذفتها (أحداث يتيمة).
  • جداول متكررة جدا تنفذ عملا ثقيلا.

الخطوة 2: عطل التشغيل عند تحميل الصفحات

في wp-config.php فوق سطر “That’s all, stop editing”:

define( 'DISABLE_WP_CRON', true );

هذا يوقف إطلاق Cron من الزيارات فقط. الأحداث ما زالت موجودة وتحتاج للتشغيل، فنفذ الخطوة 3 فورا.

الخطوة 3: أضف Cron حقيقيا

من لوحة الاستضافة (cPanel وhPanel وأمثالهما فيها قسم “Cron Jobs”) أو بأمر crontab -e على السيرفر.

الخيار أ: WP-CLI (المفضل عند توفره)

*/5 * * * * cd /home/user/public_html && wp cron event run --due-now --quiet

الخيار ب: طلب wp-cron.php

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

الخيار ج: PHP مباشرة

*/5 * * * * cd /home/user/public_html && php wp-cron.php > /dev/null 2>&1

WP-CLI وPHP المباشر يتجنبان المرور بسيرفر الويب والجدار الناري والكاش، فهما أكثر اعتمادية. تأكد أن مهمة Cron تعمل بنفس المستخدم المالك لملفات الموقع.

الخطوة 4: تحقق

  • جدول مقالا تجريبيا بعد دقائق وتأكد أنه نشر.
  • شغل wp cron event list وتأكد أنه لا أحداث متأخرة منذ وقت طويل.
  • راجع أدوات ← الإجراءات المجدولة في ووكومرس لترى هل تتراكم إجراءات معلقة.
  • راجع صحة الموقع بحثا عن تحذيرات الأحداث المجدولة.

جدولة أحداثك الخاصة

داخل إضافة:

register_activation_hook( __FILE__, function () {
    if ( ! wp_next_scheduled( 'mx_daily_cleanup' ) ) {
        wp_schedule_event( time() + HOUR_IN_SECONDS, 'daily', 'mx_daily_cleanup' );
    }
} );

register_deactivation_hook( __FILE__, function () {
    wp_clear_scheduled_hook( 'mx_daily_cleanup' );
} );

add_action( 'mx_daily_cleanup', function () {
    // Keep it short; move heavy work into batches.
    delete_expired_transients();
} );

عادات جيدة:

  • جدول عند التفعيل وامسح عند التعطيل، ولا تستدع wp_schedule_event() مع كل تحميل صفحة دون فحص.
  • اجعل كل تشغيل قصيرا، وعالج المهام الكبيرة على دفعات عبر عدة تشغيلات.
  • اجعل المهام آمنة إذا تكررت مرتين.
  • سجل الأخطاء في مكان ستراه.

فترات مخصصة

add_filter( 'cron_schedules', function ( $schedules ) {
    $schedules['every_fifteen_minutes'] = array(
        'interval' => 15 * MINUTE_IN_SECONDS,
        'display'  => __( 'Every 15 minutes', 'mx' ),
    );
    return $schedules;
} );

تذكر: فترات WP-Cron حد أدنى لا ضمان. مع Cron على السيرفر كل 5 دقائق، الجدول كل دقيقة سيعمل تقريبا كل 5 دقائق.

Cron حقيقي للأتمتة الأثقل

في مهام مثل استيراد CSV من الموردين أو إنشاء التقارير، كثيرا ما أتجاوز WP-Cron وأستدعي أمر WP-CLI مخصصا من Cron السيرفر في وقت ثابت. هذا أوضح ومسجل ومستقل عن طابور ووردبريس.

قائمة المراجعة

  • مراجعة الأحداث المجدولة وحذف الـ hooks اليتيمة
  • ضبط DISABLE_WP_CRON مع إضافة Cron على السيرفر
  • اختبار Cron بمقال مجدول
  • الإجراءات المجدولة في ووكومرس لا تتراكم
  • الأحداث المخصصة تجدول عند التفعيل وتمسح عند التعطيل

أخطاء شائعة

  • ضبط DISABLE_WP_CRON ونسيان Cron السيرفر: الإيميلات والنسخ الاحتياطية والمقالات المجدولة تتوقف بصمت.
  • تشغيل Cron كل دقيقة على استضافة مشتركة بطيئة مع مهام ثقيلة.
  • ترك أحداث إضافات محذوفة تطلق أخطاء.
  • تنفيذ استيراد ثقيل في تشغيل Cron واحد ينتهي بانتهاء المهلة.

إذا كانت المهام المجدولة في موقعك غير موثوقة، تواصل معي.

الأسئلة الشائعة

ما هو WP-Cron؟

هو المجدول المدمج في ووردبريس، يحفظ الأحداث المجدولة في قاعدة البيانات ويشغل المستحق منها عند تحميل أي صفحة عبر طلب خلفي إلى wp-cron.php.

هل أعطل WP-Cron؟

عطل التشغيل عند تحميل الصفحات فقط إذا استبدلته بـ Cron حقيقي على السيرفر، وإلا ستتوقف المقالات المجدولة والإيميلات والنسخ الاحتياطية ومهام ووكومرس.

كل كم يجب أن يعمل Cron الحقيقي؟

كل 5 دقائق يناسب أغلب المواقع، والمتاجر المزدحمة ذات المهام الحساسة للوقت قد تستخدم كل دقيقة، والمواقع الهادئة جدا كل 15 دقيقة.

لماذا تظهر مقالاتي المجدولة بحالة فات موعدها؟

غالبا لأن WP-Cron لا يعمل: زيارات قليلة، أو DISABLE_WP_CRON مفعل دون Cron على السيرفر، أو طلبات loopback محجوبة، أو الكاش يمنع تشغيل PHP.

محمد أحمد

مطوّر متاجر إلكترونية وحلول ويب

أنا محمد أحمد، مطوّر متاجر إلكترونية وحلول ويب بخبرة 15 عامًا في بناء متاجر ومواقع سريعة وآمنة على WooCommerce وWordPress ومنصات مخصّصة مثل Laravel. أكتب هنا عن سرعة المواقع وتحسين محركات البحث (SEO) والأتمتة وزيادة المبيعات.

كل المقالات تواصل معي

مقالات ذات صلة