في الجزء السابق من سلسلتنا أنشأنا القاعدة لمكوّن WordPress قابل للتمييز بواسطة اللب. اليوم سوف نتعلم كيفية تغيير الوظيفة الافتراضية الأساسية.

مفهوم الخطافات والتصرفات والمرشحات هو المسؤول عن ذلك ؛ كونها القلب الحقيقي لنظام إضافات WordPress بأكمله.

كل شيء يبدأ من "الخطافات" التي يقدمها جوهر نفسه.

ما هو "هوك"؟ هو مكان مميز بشكل خاص في الكود (لأي برنامج نصي) ، حيث يتم تسجيل بعض عمدا - "مدمن مخدرات" - يمكن تنفيذ الوظائف بالترتيب المحدد عند التسجيل.

يحتوي WordPress على نوعين من الخطافات التي تختلف في الغرض الخاص بهما:

  • ربط الإجراء: يمثل مكانًا لتنفيذ إجراء ، على سبيل المثال ، إدخال العملية وتخزين النتائج في قاعدة بيانات
  • خطاف المرشح: يحدد المكان المناسب لتطبيق تعديل على قيمة (يتم توفيره عادةً كمتغير) ، بحيث يستخدم الرمز التالي القيمة المعدلة

دعونا الغوص في التفاصيل ...

العمل مع الإجراءات

المنطق المشترك لإجراءات WordPress بسيط للغاية:

  1. قم بتمييز المكان ، حيث يجب أن يتم استخدام الرمز المخصص ، مع "خطاف التصرف" ومعلماته
  2. قم بإنشاء وظيفة الإجراء التي تنفذ الرمز الجديد باستخدام معلمات (إذا لزم الأمر) التي يوفرها الخطاف
  3. سجل الإجراء (# 2) ليتم تنفيذه عند إطلاق الخطاف (# 1) مع بعض الأولوية
  4. عندما يقوم WordPress بتحميل الصفحة المطلوبة والعثور على الخطاف ، سيبحث عن جميع الوظائف "مدمن مخدرات" ويقوم بتنفيذها واحدة تلو الأخرى وفقًا لأولويتها

لتنفيذ المهمة رقم 1 لدينا وظيفة 'do_action':

do_action($tag, $arg_1, $arg_2, ... , $arg_n);

يقبل المعلمات التالية: $ tag - "اسم" الخطاف الذي يساعد على تحديد خطاف معين وتمييزه بين الآخرين ؛ $ arg_1 ، $ arg_2 ،… ، $ arg_n - قيم لإجراءات قبول كمعلمات. يمكن أن يكون هناك العديد من الحجج حسب الحاجة - من صفر إلى أي مبلغ معقول.

يحتوي WordPress نفسه على الكثير من الخطافات المحددة مسبقًا لاستخدامها:

do_action( 'init' );

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

do_action('save_post', $post_id, $post);

في هذا المثال ، يتم تشغيل الخطاف عندما يتم حفظ النشر ويعطي معلمتين إضافيتين للعمل مع post_id و post post يحتوي على جميع البيانات من المشاركة المحفوظة.

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

do_action( 'my_truly_custom_hook' );

عندما نكون قد وجدنا (أو أنشأنا) خطافًا صحيحًا وأنشأنا وظيفة مخصصة له ، يجب أن نسجل أحدث عملية تنفيذ مع "add_action".

add_action($tag, $function_to_add, $priority, $accepted_args_number);

كما يمكن توقع أن تقبل طريقة 'add_action' معلمتان إلزاميتان: $ tag: اسم الخطاف المناسب و $ function_to_add: اسم الوظيفة التي يجب تنفيذها. المعلمتان الأخريان اختياريتان: الأولوية $: عدد صحيح لتحديد الترتيب الذي يتم فيه تنفيذ الوظائف المسجلة (افتراضيًا ، 10) ، $ accepted_القيمة_ رقم: عدد الوسيطات التي ستقبلها الدالة المسجلة (افتراضيًا ، 1) .

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

function msp_helloworld_footer_notice(){echo "
Hello, I'm your custom notice
";}add_action('wp_footer', 'msp_helloworld_footer_notice');

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

cnotice

العمل مع المرشحات

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

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

apply_filters($tag, $value_to_filter, $arg_1, $arg_2, ... , $arg_n);

تنشئ الدالة "apply_filter" خطًا لفلتر مع اسم علامة $ والمعلمة الإلزامية $ value_to_filter (يمكن أن تكون فارغة ، ولكن يجب أن تكون موجودة لأفضل الممارسات). تعتبر الوسائط الأخرى اختيارية وتعمل بنفس طريقة الإجراءات.

filter_function($value_to_filter, $arg_1, $arg_2, ... , $arg_n){//filtering code goes herereturn $value_to_filter; //value has to be returned back}

هذا هو الهيكل العظمي لفلتر وظيفة التوضيح التي ينبغي أن أ) قبول وسيطة واحدة على الأقل ، قيمة التعديل ؛ و ب) إرجاع القيمة في النهاية.

add_filter($tag, $function_to_add, $priority, $accepted_args);

تسجل الدالة 'add_filter' دالة بالاسم المعطى كوسيطة $ function_to_add لعلامة ربط علامة $. تعمل الحجج الاختيارية - الأولوية $ و dollar_args $ - بنفس الطريقة المستخدمة في خطافات التصرف.

دعنا نوضح العملية بأكملها أثناء العمل: من المهام الإضافية الشائعة إضافة بعض المحتوى في نهاية المشاركة. إذا نظرنا إلى أقرب في علامة قالب 'the_content' ( queryposts.com/function/the_content ) ، والذي يُستخدم عادةً لإخراج محتوى المشاركة في موضوع ، سنجد أنه يحتوي على خطاف عامل التصفية التالي:

$content = apply_filters('the_content', $content);

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

function msp_helloworld_post_footer($content) {$content .= "";return $content;}  add_filter ('the_content'، 'msp_helloworld_post_footer'، 100)؛ 

يرجى ملاحظة أننا نستخدم عددًا كبيرًا جدًا للأولوية هنا لضمان تطبيق جميع الفلاتر الافتراضية قبل 'msp_helloworld_post_footer'. بعد تضمين الشفرة في ملف المكوّن الإضافي ، يجب أن نرى النتيجة على الموقع:

pfooter

كيف تجد خطاطيف

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

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

بعد ذلك تكون مستعدًا للرحلة في شفرة المصدر. يمكنك فقط إجراء بحث عبر ملفات WordPress للكلمات الرئيسية 'do_action' و 'apply_filters' للعثور على الخطاف الذي تحتاجه.

فهم منطق الاستعلام وورد يمكن أن يساعدك أيضًا في تحديد المكان الذي يمكن البحث فيه عن بعض الخطافات.

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

عمليات متقدمة مع خطافات

بالإضافة إلى إضافتك إلى المكون الإضافي ، يمكن أيضًا إزالة الإجراءات والفلاتر بتركيب مماثل.

يمكن إزالة الإجراءات بالطريقة التالية:

remove_action($tag, $function_to_remove, $priority, $accepted_args);remove_all_actions($tag, $priority);

بما أنه من المحتمل أنك قد خمنت "remove_action" ، فسيتم إزالة إجراء معين مسجّل في خطاف معين (يجب عليك تحديد أولوية وعدد الوسيطات بشكل صحيح كما تم استخدامها عند التسجيل) ، ويساعد "remove_all_actions" على إزالة جميع الإجراءات المسجلة مع علامة معينة ربط مع أولوية معينة (إذا تم حذف وسيطة الأولوية ستقوم الوظيفة بإزالة كافة الإجراءات).

ربما تكون قد سمعت عن توصية أمنية مشهورة لإخفاء إصدار WordPress من قسم الرأس في الموقع. هذه وظيفة لـ "remove_action".

أولاً ، دعونا نعثر على الشفرة التي تربط وظيفة 'wp_generator' لطباعة معلومات الإصدار عن طريق التصفح /wp-includes/default-filters.php . رمز القيام بهذا يبدو كالتالي:

add_action('wp_head', 'wp_generator');

للتخلص من تأثير هذه الشفرة ، يجب أن نضع الدالة العكسية في مكان ما:

remove_action('wp_head', 'wp_generator');

يمكن إزالة الفلاتر بطريقة مشابهة:

remove_filter($tag, $function_to_remove, $priority, $accepted_args);remove_all_filters($tag, $priority);

ال واجهة برمجة التطبيقات الإضافية يوفر أيضًا للمطورين طريقة لاكتشاف ما إذا كان الخطاف المحدد قد قام بتسجيل الوظائف لتنفيذها:

has_action($tag, $function_to_check);has_filter($tag, $function_to_check);

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

if('hook_to_check_name' === current_filter()){//do stuff related to 'hook_to_check_name' hook}

على الرغم من الاسم ، لا يعمل "current_filter" فقط مع الفلاتر ولكن مع الإجراءات أيضًا. للحصول على المجموعة الكاملة لوظائف API Plugin ، راجع مجموعة مخطوطات .

حالة العالم الحقيقي

دعونا نحفر الهيكل العظمي للمكون الإضافي الذي قمنا بإعداده الجزء السابق من السلسلة وتنفس بعض الحياة فيه.

سنقوم بملء ملف "core.php" (الجزء المركزي من المكوّن الإضافي الخاص بنا والذي يهدف إلى تحمل معظم الوظائف) مع الرمز الذي يحل مهمة في العالم الحقيقي بمساعدة الإجراءات والفلاتر.

ما نحن بصدد القيام به؟ لنفرض أن موقع WordPress الخاص بك يقبل مشاركات الضيوف من مؤلفين مختلفين ، ولكنه لا يمنحهم الإذن لإنشاء حساباتهم الخاصة للنشر. هذا يعني أن المستخدم ، الذي نشر المقالة ، والمؤلف الحقيقي لها (الضيف) أشخاص مختلفون. سوف تحتاج إلى التأكد من أن المؤلف الفعلي يتلقى الائتمان. يمكن القيام بذلك باستخدام تصنيف مخصص.

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

/** Hook plugin's action and filters **/function msp_helloworld_init(){add_action('init', 'msp_helloworld_taxonomies');add_filter('the_content', 'msp_helloworld_author_block_filter');add_filter('post_class', 'msp_helloworld_post_class');}add_action('plugins_loaded', 'msp_helloworld_init');/** Register custom taxonomy **/function msp_helloworld_taxonomies(){$args = array('labels' => array('name'          => 'Guest authors','singular_name' => 'Guest author'),'show_in_nav_menus' => false);register_taxonomy('gauthor', array('post'), $args);}  / ** إنشاء علامة الصندوق الخاص بالمؤلف ** / وظيفة msp_helloworld_author_block () {global $ post؛ $ author_terms = wp_get_object_terms ($ post-> ID ، 'gauthor') ؛ إذا (فارغ ($ author_terms)) return ؛ $ name = stripslashes ( $ author_terms [0] -> name)؛ $ url = esc_url (get_term_link ($ author_terms [0]))؛ $ desc = wp_filter_post_kses ($ author_terms [0] -> description)؛ $ out = " 
"؛ $ out. ="
هذا هو ضيف ضيف من قبل {$name}
"؛ $ out. ="
{$desc}
"؛ إرجاع $ out؛} / ** إضافة مربع المؤلف إلى نهاية المشاركة ** / وظيفة msp_helloworld_author_block_filter (محتوى $) {if (is_single ()) $ content. = msp_helloworld_author_block ()؛ return $ content؛} / * * إضافة فئة CSS مخصصة إلى حاوية المشاركة ** / وظيفة msp_helloworld_post_class ($ post_class) {global $ post ؛ $ author_terms = wp_get_object_terms ($ post-> ID ، 'gauthor') ؛ إذا (! فارغ ($ author_terms)) {$post_class[] = 'gauthor';} return $ post_class؛}

كما ترى ، قمنا بإنشاء إجراء لتسجيل تصنيف مخصص وتطبيقه على خطاف "init" - هذه ممارسة موصى بها. بعد ذلك ، أنشأنا علامة القالب المسؤولة عن ترميز مربع المؤلف باستخدام وظائف WordPress الأصلية مثل "wp_get_object_terms". بعد ذلك ، أرفقنا هذا المربع بنهاية محتوى المشاركة باستخدام خطّ التصفية "the_content". وأخيرًا ، قمنا بإضافة فئة CSS المخصصة لحاوية منشورات الضيوف لمرونة التصميم في السمة. بعد تطبيق بعض الأساليب ، يمكننا رؤية النتيجة:

gauthor

استنتاج

تمثل الإجراءات والفلاتر الجزء الأكثر أهمية في أي تطوير لبرنامج WordPress. الآن بعد أن فهمت منطقهم وسلوكهم ، فأنت مستعد لتجاربك الخاصة.

انقر هنا لتنزيل نموذج ملحق Hello World الموسع لاستخدامه كهيكل عظمي لتطويرك.

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

صورة مميزة، صورة الوحدة عبر Shutterstock