استخدام خطافات WordPress لتنظيف الكود وتنشيطه وإلغاء تثبيته

نشرت: 2015-01-23

يكرس مؤلفو البرنامج المساعد الكثير من الوقت والطاقة للوظائف الرئيسية لمنتجاتهم ، بحيث يسمحون للأشياء الأقل أهمية بالسقوط على جانب الطريق.

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

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

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

  • خطاف التنشيط
    • تسلسل التثبيت
    • قواعد فلاشينغ إعادة الكتابة
    • إنشاء جداول قاعدة البيانات
    • شيكات التبعية
  • خطاف التعطيل
  • خطاف إلغاء التثبيت
  • أمان إضافي
  • حان الوقت للتنظيف

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

خطاف التنشيط

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

تحميل gist f356a899b7f009d136644383339db4f6

مفتاح كل ذلك هو وظيفة register_activation_hook() . المعلمة الأولى هي المسار إلى ملف البرنامج المساعد الرئيسي ؛ تحدد المعلمة الثانية الوظيفة المراد تشغيلها. داخليًا ، تعد وظيفة register_activation_hook() غلافًا لإجراء "activ_ [plugin_name]" ، ولكن نظرًا لأنه أسهل قليلاً في الاستخدام ، فمن غير المعتاد رؤية الخطاف في المكونات الإضافية.

تسلسل التثبيت

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

دعنا نلقي نظرة على مثال لنرى سبب كون هذه مشكلة كبيرة:

قواعد فلاشينغ إعادة الكتابة

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

يبدو الرمز أدناه منطقيًا ولكنه سيفشل.

تحميل جيست 7c656623608efd1785437ebe7cdb7350

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

إليك كيف يبدو تدفق العملية:

  1. يقوم المستخدم بتثبيت البرنامج المساعد.
  2. يقوم المستخدم بالنقر فوق ارتباط التنشيط.
  3. تقوم الصفحة الوسيطة بتشغيل خطاف التنشيط فقط ، ولا شيء آخر. هذا يزيل قواعد إعادة الكتابة.
  4. البرنامج المساعد نشط ويعمل الكود كالمعتاد. تم تسجيل نوع المنشور المخصص.

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

إذا كان هذا الخيار موجودًا ، فنحن نقوم بأشياء التنشيط الخاصة بنا ثم نحذفه.

شيء من هذا القبيل:

تحميل gist 6f0927b3bf9807e426c8778a3bf3a797

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

يوجد حل أفضل مذكور في الدستور الغذائي في الوثائق الخاصة flush_rewrite_rules() . في هذا الحل ، نستخدم نمطية وظائفنا لتسجيل نوع المنشور المخصص عند التنشيط بشكل منفصل:

تحميل gist b44bf08bf511277184a49de53c0c3ed8

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

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

إنشاء جداول قاعدة البيانات

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

يوضح هذا المثال من مقالة الدستور الغذائي حول إنشاء الجداول كيف يمكن استخدام مكالمات التنشيط المتعددة:

تحميل gist 9a1d4757d023f2442093a9a158cdb6b4

الوظيفة الأولى ، jal_install() تنشئ جدول قاعدة بيانات جديدًا. الوظيفة الثانية ، jal_install_data تضيف البيانات الأولية إلى الجدول. بدلاً من استخدام register_activation_hook() لإضافة دالة واحدة تحتوي على كل هذا الرمز ، يمكننا استخدام register_activation_hook عدة مرات.

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

شيكات التبعية

مهمة أخرى شائعة لوظيفة التنشيط هي التحقق من التبعيات. قد يعتمد المكون الإضافي الخاص بك على إصدار معين من WordPress ، أو مكون إضافي آخر ، أو حتى إصدار معين من PHP.

يتحقق الكود أدناه من الحد الأدنى من إصدار WP و PHP ويعيد توجيه المستخدم (بدون تنشيط المكون الإضافي) إذا لزم الأمر:

تحميل جيست 79a2c5414969291ec90cac11c38b7522

خطاف التعطيل

يتم تشغيل خطافات التعطيل عندما يقوم المستخدم بإلغاء تنشيط مكون إضافي ، ولكن قبل إلغاء تثبيته (حذفه). يتم استخدام خطافات التعطيل بنفس طريقة استخدام خطافات التنشيط:

تحميل جيست 6ed9bb66ee1863ab3e84db1f9f753792

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

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

توصي المخطوطة بتنفيذها كما هو موضح أدناه ، لكن هذا لا يعمل :

تحميل جيست 4440a0178b4e34506530e13d0ead8958

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

بطاقة Trac جاهزة للتعامل مع هذا الأمر ، لكن حتى ذلك الحين ، لا يمكنني إعطائك طريقة جيدة جدًا للقيام بذلك. الطريقة الوحيدة التي وجدت أنها تعمل هي حذف قواعد إعادة الكتابة تمامًا:

تحميل جيست 98b496826278084a2f7a5ea27994f781

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

خطاف إلغاء التثبيت

هناك طريقتان لتشغيل التعليمات البرمجية عند إلغاء تثبيت مكون إضافي. يمكنك استخدام خطاف إلغاء التثبيت عبر register_uninstall_hook() أو يمكنك استخدام ملف uninstall.php مخصص داخل المكون الإضافي الخاص بك. سأعرض لك كليهما ، لكن الطريقة المفضلة هي استخدام ملف إلغاء التثبيت.

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

يوضح الكود أدناه عملية إلغاء التثبيت باستخدام خطاف أساسي:

تحميل جيست 040847db4739148900b1ee29d227d71d

كما تمت مناقشته ، هذا ليس هو الحل الأفضل. أفضل طريقة للتعامل مع عمليات إلغاء التثبيت هي استخدام ملف uninstall.php . كل ما عليك فعله هو إنشائه وسيتم استخدامه إذا كان متاحًا.

تحميل جيست 44dde25dcb57b4239be8586f4d04c765

كما ترى ، هذا في الواقع حل أبسط. أفضل للجميع ، أنها قائمة بذاتها.

أمان إضافي

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

استخدم المقتطف التالي عند التنشيط وإلغاء التنشيط:

تحميل جيست 357037989065f89c15f049314e9831bf

يتأكد مقطع التعليمات البرمجية هذا من أن المستخدم لديه الأذونات لتنفيذ هذا الإجراء وأن الإجراء قد تم إنشاؤه في الصفحة المناسبة. هذا يجب أن يحمي من معظم المحاولات الخبيثة.

عملية إلغاء التثبيت خاصة ، لذا سنحتاج إلى استخدام كود مختلف قليلاً:

تحميل جيست 541c93cfa9b89e1e6c7b48b06732d31f

حان الوقت للتنظيف

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

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

إذا لم تكن عضوًا في WPMU DEV بعد ، فقم بالتسجيل اليوم للحصول على نسخة تجريبية مجانية ، خالية تمامًا من المخاطر. بصفتك عضوًا ، ستتمكن من الوصول إلى جميع المكونات الإضافية الرائعة وخدمة الاستضافة السريعة ، بالإضافة إلى دعم الخبراء على مدار الساعة طوال أيام الأسبوع لجميع الأسئلة والمشكلات المتعلقة بـ WordPress.

هل تجد أن المكونات الإضافية تترك قاعدة بياناتك في حالة من الفوضى عند إزالتها؟ أخبرنا برأيك في التعليقات أدناه.
العلامات: