ما هو Cron job وكيف تستفيد منه في ووردبريس؟ شرح شامل

قد تكون هذه هي المرة الأولى التي تسمع فيها بوظيفة كرون (Cron job)، أو ربما تكون قد مررت على هذا المصطلح التقني مرور الكرام دون معرفة معناه. أما إن كنت مطور مواقع، أو صاحب موقع أو أحد موظفي خدمة العملاء لأحد الخوادم أو الاستضافات فأنت بكل تأكيد تعرف ما هذا المصطلح. 

يمكننا القول بأن Cron هو نظام خاص لجدولة المهام وتنفيذها على الخادم، و لا يخص الووردبريس فقط فهو في الأساس تابع لسيرفرات لينكس ويونكس. 

في مقال اليوم سوف نعرفك على Cron job  بالتفصيل ونوضح لك كيف يتوافق ويعمل على نظام الووردبريس.


وظيفة كرون Cron job – نظرة عامة

كما أشرنا في مطلع المقال فإن Cron job عبارة عن نظام لأتمتة وتنفيذ المهام بجدول زمني يتم تحديده مسبقاً، وقد سمي بهذا الاسم (وظيفة) كونه يقوم بوظائف يتم إسنادها إليه لينفذها بحسب الوقت الذي يتم تحديده.

فأداة Cron  عبارة عن نظام أو خدمة برمجية تم إنشاؤها في الأصل لنظام التشغيل  UNIX بحيث تمكن المستخدمين من تنفيذ مهام معينة تلقائيًا في الخلفية في أوقات زمنية محددة، فهو برنامج جدولة يتم تنفيذه اعتماداً على الوقت.

وبالرجوع إلى الووردبريس (WordPress) والذي أنشأ نظام Cron job خاص به تحت مسمى WordPress Cron أو اختصارًا (WP-Cron) يكون مفعلًا بصورة تلقائية لتنفيذ مجموعة من المهام بصورة مجدولة. وأهم ما يقوم به هذا النظام:

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

تستخدم العديد من الإضافات وظيفة (WordPress Cron) للقيام بمهام مختلفة، ومن أشهر الإضافات التي تستخدم WordPress Cron إضافة Jetpack، وإضافة Akismet، وأيضاً الإضافة الشهيرة ووكومرس WooCommerce التي تستخدمها لحذف الطلبات غير المدفوعة و تغيير الجلسة session النشطة على سبيل المثال لا الحصر.

والآن وربما تتساءل وكيف يمكنني الاستفادة من WordPress CRON؟

في الفقرات التالية سنوضح لك كل شيء بالتفصيل عن كيفية الاستفادة من هذه الخدمة لجدولة المهام التي تريدها بنفسك.

كيف يتوافق CRON job مع ووردبريس؟

وظيفة كرون CRON job كما ذكرنا مسبقاً هي بالأساس نظام خاص بالسيرفرات والاستضافات التي تعمل بنظامي التشغيل يونيكس UNIX ولينكس LINUX. يتم استخدام هذا النظام لطلب تنفيذ مهمة معينة في وقت محدد. ويتم تنفيذ هذه المهام كل يوم بشكل تلقائي دون تدخل من قبل المستخدم، ودون إعادة كتابة أي كود برمجي.

على سبيل المثال:

  • نطلب من الخادم تنفيذ (تشغيل) الملف send-mail.php في الساعة 15:00:00 كل يوم.
  • نطلب من الخادم إعادة تشغيل نفسه في وقت محدد كل يوم (إن كنا نملك الصلاحيات).

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

وبالرجوع إلى سؤال كيف يتوافق Cron job مع الووردبريس؟

نقول أنه من الممكن إعداد موقع WordPress الخاص بك لاستخدام نظام Cron job الأساسي المدمج في نظام تشغيل الخادم يونكس أو لينكس. ومع ذلك، يمكن أن يكون ذلك صعبًا لسببين رئيسيين كما أشرنا:

  • قد لا تسمح لك الاستضافة بإعداد Cron job المدمجة مع السيرفر أو الاستضافة لأسباب أمنية.
  • قد تتطلب السيرفرات أو الاستضافات إعداد Cron job بطرق مختلفة بحسب لغة البرمجة، مما يلزمك الإلمام بلغات برمجة مختلفة.

وبالتالي نستنتج أن: 

لكل من  Cron job و WordPress Cron طريقته الخاصة التي يعمل بها، وأن الأول خاص بالسيرفرات على نظامي التشغيل لينكس ويونكس،  والثاني خاص بنظام ووردبريس وهو الذي سنقوم بشرح كيفية استخدامه والاستفادة منه بالتفصيل في الفقرات التالية من المقالة.

وظيفة WordPress Cron

يتم تخزين كافة وظائف WordPress Cron في قاعدة البيانات الخاصة بالموقع وذلك ضمن الجدول wp_options وتحديداً ضمن سطر أو صف محدد فيه باسم cron. 

ويتم استدعاء تلك الوظائف أو المهام عن طريق الملف البرمجي wp-cron.php الموجود ضمن ملفات الووردبريس الأساسية كما توضح الصورة بالأسفل:

وبالعودة إلى سؤال، كيف تعمل وظيفة كرون ووردبريس WordPress Cron؟

عندما يقوم زائر ما بزيارة موقع الووردبريس الخاص بك، فسوف  يتم تنفيذ الملف wp-cron.php والذي يعمل على استدعاء المهام المخزنة في قاعدة البيانات في جدول wp-options، ويبدأ تنفيذ تلك المهام بحسب جدولتها (فمنها ما يعمل كل ساعة، ومنها ما يعمل مرة واحدة في اليوم في وقت محدد..)

إذاً يمكن القول أن وظيفة كرون ووردبريس WordPress Cron تعمل بالتسلسل التالي:

  1. دخول زائر إلى الموقع
  2. تشغيل ملف wp-cron.php
  3. استدعاء المهام من قاعدة البيانات من جدول wp-options وتحديداً من الصف cron
  4. يتم تنفيذ المهام وفقاً للوقت المحدد لها

هل لاحظت شيئاً من التسلسل السابق؟

لاحظ يا صديقي أنه لا يتم تنفيذ وظيفة كرون ووردبريس WordPress Cron إلا إذا قام شخص ما بزيارة الموقع. وهذا بدوره يعني أنه لو كان لديك مهمة سيتم تنفيذها في الساعة 12:00:00 ولم يقم أي شخص بزيارة موقعك حتى الساعة 13:00:00 فإن تلك المهمة سيتم تأجيلها حتى أول زيارة! 

بمعنى آخر فإن ملف wp-cron.php لن يعمل أبداً طالما لم يأتِ لموقعك زيارات. هذا على عكس  وظيفة Cron job المدمجة مع السيرفر أو الاستضافة والتي ستنفذ المهام الموجودة بها طالما أن نظام التشغيل يعمل حتى ولو لم تأتي أي زيارات.

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

على سبيل المثال: لديك متجر إلكتروني يعمل بنظام ووكوميرس woocommerce وأردت عمل ترويج لمنتج معين (بالبريد الإلكتروني) في الساعة 12:00:00 في عيد الفطر، ولم تأتي لك أية زيارات. في هذه الحالة لن يتم تنفيذ هذه المهمة حتى تأتيك زيارة ما والتي قد تتأخر عن الموعد المطلوب.

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

أهمية  إنشاء وظيفة كرون ووردبريس

يمكن اختصار أهمية تعريف وظيفة كرون ووردبريس (WordPress Cron) في نقطتين أساسيتين كما يلي:

  • تنفيذ المهام على فترات محددة: بحيث يتم تشغيل مهمة ما كل ساعة أو كل يوم أو حتى كل شهر.  كأن أن يتم إرسال رسالة تذكر المشتركين باقتراب موعد دفع الاشتراك السنوي أو الشهري لخدمة ما، أو تحديث إصدار الووردبريس، أو أخذ نسخة احتياطية… إلخ.
  • تنفيذ مهمة ما لمرة واحدة: مثل حذف ملفات الإعداد للووردبريس بعد تثبيت الموقع أول مرة، أو نشر مقال في وقت معين، أو إرسال رسالة لتذكير مستخدم ما بتفعيل البريد الإلكتروني… إلخ.

كذلك تساعد وظيفة كرون ووردبريس WordPress Cron بتحسين الموقع من خلال:

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

عيوب وظيفة WordPress Cron

إلى جانب ميزات  كرون ووردبريس WordPress Cron، فإن لها أيضاً بعض العيوب والمخاطر والتي قد تشمل:

تشكيل ضغط على السيرفر أو الاستضافة

فكما أوضحنا بالأعلى فإن وظيفة كرون ووردبريس WordPress Cron تعمل في كل مرة يقوم فيها شخص ما بزيارة موقعك. وبالتالي إن كان عدد زوار موقعك منخفضاً فلا مشاكل هنا، أما في حالة كان لديك عدد زوار كبير فإن ملف wp-cron.php سيتم تنفيذه آلاف المرات مما يشكل ضغطًا على الموقع واستنزاف موارد الاستضافة.

التسبب في بطء في الموقع

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

عدم تنفيذ بعض المهام في وقتها

في حالة كان عدد زوار موقعك منخفضًا وقمت بإعداد مهمة Cron job ليتم تنفيذها الساعة 12:00:00 مثلاً، ولم يأتِ زوار في هذا الوقت فإن المهمة يتم تأجيلها حتى يصل أول زائر بعد هذا الوقت.

يمكن استغلاله لتنفيذ هجوم على الموقع

فقد تعرضت الإصدارات القديمة من ووردبريس لهجمات حقن SQL باستخدام ملف wp-cron.php، ولكن  تم سد هذه الثغرة في الإصدارات الحديثة.

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


استحدام وظيفة كرون ووردبريس

دعنا الآن نشرح لك كيفية  التعامل مع WordPress Cron بحيث تتمكن من إعادة تعيينه ليعمل بغض النظر عن الزيارات، كذلك إنشاء وظيفة كرون جديدة على الووردبريس:

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

لتحسين أداء موقعك وتجنب التأثيرات السلبية التي تسببها وظيفة WordPress Cron، هناك خطوتان يجب عليك تنفيذهما:

  1. الخطوة الأولى: تعطيل wp-cron المدمج مع نظام الووردبريس
  2. الخطوة الثانية: تشغيل wp-cron كل فترة محددة من خلال Cron job المدمج في الاستضافة أو السيرفر

أولاً: تعطيل wp-cron (WordPress Cron)

لتعطيل وظيفة كرون ووردبريس WordPress Cron يجب تعطيل الملف wp-cron.php من خلال إضافة كود برمجي إلى الملف wp-config.php باتباع الخطوات التالية:

1. انتقل إلى  لوحة التحكم الخاصة باستضافة موقعك

2. من قسم ملفات files اختر إدارة الملفات File manager كما توضح الصورة بالأسفل:

3. انقر على المجلد public_html ثم افتح المجلد الذي يحتوي على موقعك.

4. افتح ملف wp-config.php بالنقر عليه بزر الماوس الأيمن ثم قم باختيار الأمر تعديل edit كما توضح الصورة بالأسفل:

5. أضف الكود التالي إلى الملف، ثم انقر على حفظ التغيرات Save Changes كما توضح الصورة:

define('DISABLE_WP_CRON', true);

ملحوظة: هناك العديد من الإضافات التي يمكنك من خلالها أيضاً التعديل على ملف wp-config.php، كذلك يمكنك الوصول إليه عن طريق أحد برامج عميل FTP مثل برنامج Filezilla.

تشغيل Wp-cron عن طريق Cron job للإستضافة

بعد تعطيل وظيفة WordPress Cron بالتعديل على ملف wp-config.php، ننتقل للخطوة الثانية وهي تشغيل wp-cron كل فترة محددة على سبيل المثال كل ساعة واحدة:

1. انتقل إلى  لوحة التحكم cPanel في استضافة موقعك، ثم اختر Cron job من قسم Advanced، كما توضح الصورة بالأسفل:

2. قم بإعداد وظيفة كرون Cron jop كما توضح الصورة بالأسفل، مع إضافة الكود التالي في السطر الأخير:

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

تنبيه: لا تنسى تغير https://domain.com بالدومين الخاص بموقعك.
يمكن أيضاً استخدام الكود التالي:

cd /home/user-name/public_html; php -q wp-cron.php

وهو أيضًا مسار ملف wp-cron مع ضرورة تغيير user-name باسم المستخدم للملفات.

ملحوظة:

في الإصدارات الجديدة من الووردبريس (الإصدارWordPress 3.3  وما يليه) يمكن إعادة تعيين وظيفة كرون ووردبريس WordPress Cron عن طريق إضافة الكود التالي إلى ملف wp-config.php. هذا الكود يجبر wp-cron على العمل كل مدة محددة تختارها (بالثواني) بغض النظر عن الزيارات. مما يوفر عليك عناء إضافة Cron job من الاستضافة أو السيرفر.

الكود المستخدم:

<?php
    define('WP_CRON_LOCK_TIMEOUT', 3600);
?>

لاحظ أن الرقم 3600  هو الفترة الزمنية مقدرة بالثواني، أي سيتم تشغيل وظيفة cron في هذه الحالة  كل 60 دقيقة.


إنشاء وظيفة WordPress Cron جديدة

إن كنت مبرمجًا أو مطور مواقع وتعرف جيداً كيفية التعامل مع الدوال functions والخطافات hooks الخاصة بووردبريس، فإن أفضل طريقة لإنشاء وظيفة كرون ووردبريس WordPress Cron جديدة هي عن طريق كتابة الكود بنفسك.

كما يمكنك بشكل بديل استخدام الإضافات المخصصة لإنجاز هذه المهمة. وفي الفقرات التالية سنشرح لك الطريقتين واختر ما يناسبك. 

إنشاء وظيفة كرون ووردبريس WordPress Cron يدوياً (للمطورين)

لإنشاء وظيفة WordPress Cron مهمتها إرسال رسالة يومية إلى شخص ما فإن الكود البسيط التالي يمكنك من القيام بذلك:

<?php

if ( ! wp_next_scheduled( 'send_new_mail_hook' ) ) { // check if function is scheduled
    wp_schedule_event( time(), 'daily', 'send_new_mail_hook' ); // if not, schedule it
    }
    function send_new_mail() { // your updatemagic
    wp_mail('ing.moudy@gmail.com','Mahmoud Hassan','NEW MAIL from MAHMOUD');
}
    

?>

 شرح الكود:

  • في البداية نقوم بالتحقق من وجود وظيفة كرون Cron job باسم send_new_mail_hook من عدمه عن طريق wp_next_scheduled()
  • في حالة لم تكن send_new_mail_hook فعالة فإنه يتم تفعيلها أو جدولتها مرة واحدة يومياً باستخدام wp_schedule_event
  • أنشأنا بعدها دالة استدعاء callback  باسم send_new_mail لتقوم بإرسال الإيميل للشخص المطلوب
  • في النهاية قمنا بتشغيل كل شيء عبر add_action ونادينا على دالة الاستدعاء send_new_mail ليتم تنفيذها إذا كان الحدث send_new_mail_hook فعالاً

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

إدارة وإنشاء  WordPress Cron باستخدام إضافة WP Crontrol

يمكنك إدارة كافة وظائف ووردبريس WordPress Cron jobs باستخدام إضافة wp Control وهي إضافة مجانية تمكنك من عرض كافة وظائف كرون الموجودة في موقعك والتحكم فيه كما تريد، كما تمكنك من إنشاء وظيفة WP-Cron خاصة بك. وذلك كما يلي:

1. من لوحة تحكم الموقع، انتقل إلى التبويب: الإضافات < أضف جديد

2. في مربع البحث اكتب اسم الإضافة WP Crontrol، لتظهر لك في نتائج البحث وتقوم بتنصيب وتفعيل الإضافة كما توضح الصورة بالأسفل.

وإذا كنت بحاجة لشرحٍ أكبر لعملية تثبيت الإضافة يمكنك الاطلاع على كيفية تنصيب إضافة ووردبريس وتفعيلها على موقعك بالشكل الصحيح.

3.  الآن لإدارة أو إضافة وظائف كرون ووردبريس WordPress Cron jobs، قم بالنقر على أدوات tools ثم اختر cron events، ستلاحظ ظهور نافذة تعرض لك كافة أحداث كرون المتاحة على موقعك والتي تتسبب في تنفيذ وظائف كرون في الخلفية وموعد تنفيذ  كل منها.

هذه الأحداث يتم تعريفها وإطلاقها من قبل ووردبريس نفسه أو من قبل الإضافات المثبتة على الموقع، ويمكنك إنشاء حدث wordpress cron جديد وربطه بمهمة كرون جديدة، وذلك من خلال النقر على add new كما توضح الصورة التالية

بدايةً املأ النموذج هو موضح في الصورة التالية:

1- في هذا المربع النصي أضف اسم الخطاف Hooke Name بدون مسافات (ستحتاجه لاحقاً لإنشاء وظيفة أو callback)
2- في القسم Next Run حدد موعد تشغيل الحدث لأول مرة
3- اختر من القائمة المنسدلة Recurrence موعد التكرار، أو الوقت الذي سيتم فيه تنفيذ الحدث إما يومياً أو كل أسبوع، أو غير ذلك على حسب الحاجة

ما زال عليك تحديد المهمة التي سيتم تنفيذها كل وقوع للحدث (كل دقيقة في هذا المثال) حسب ما حددنا في الخطوة السابقة. اذهب إلى ملف functions.php وأضف الكود التالي له:

<?php

    function send_new_mail() {

        wp_mail( 'ing.moudy@gmail.com', 'New test mail', 'New test mail (cron job)' ); 

    }

    add_action( 'send_new_mail_hook', 'send_new_mail' );

?>

المثال السابق يرسل رسالة كل دقيقة واحدة. لاحظ أن أسم الخطاف Hook name الذي تم إنشاؤه في الخطوة رقم 1 يجب أن يكون نفس الاسم في الكود أيضاً كما هو مبين.

أعتقد أنك أصبحت الآن قادرًا على إنشاء أول وظيفة WordPress Cron خاصة بك في موقع ووردبريس، كما أعتقد أيضاً أنك قادر على إنشاء Cron job في استضافة موقعك من خلال لوحة تحكم الاستضافة cPanel للتحكم بشكل أفضل في موقعك وتحسين أدائه.

خاتمة

تعرفنا من خلال هذه المقالة على كل من Cron jobs و WordPress cron ووضحنا الفرق بينهم.

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

والآن حان دورك لتجريب التعامل مع وظائف WordPress Cron جديدة في موقعك، ومحاولة تشغيل ذلك النظام عن طريق cron jobs في السيرفر كما وضحنا لك بالتفصيل. وفي حال واجهتك أي مشكلة الرجاء ترك استفسارك في التعليقات وسيتم الرد عليك في أقرب فرصة.

اطرح سؤالك على منتدى عرب ووردبريس وافتح نقاشًا جديدًا مع مجموعة من الخبراء في إدارة مواقع ووردبريس وهناك نشارك تجاربنا وأفضل الممارسات التي يحتاجها أصحاب المواقع