في الجزء السابق من سلسلتنا أنشأنا القاعدة لمكوّن WordPress قابل للتمييز بواسطة اللب. اليوم سوف نتعلم كيفية تغيير الوظيفة الافتراضية الأساسية.
مفهوم الخطافات والتصرفات والمرشحات هو المسؤول عن ذلك ؛ كونها القلب الحقيقي لنظام إضافات WordPress بأكمله.
كل شيء يبدأ من "الخطافات" التي يقدمها جوهر نفسه.
ما هو "هوك"؟ هو مكان مميز بشكل خاص في الكود (لأي برنامج نصي) ، حيث يتم تسجيل بعض عمدا - "مدمن مخدرات" - يمكن تنفيذ الوظائف بالترتيب المحدد عند التسجيل.
يحتوي WordPress على نوعين من الخطافات التي تختلف في الغرض الخاص بهما:
دعونا الغوص في التفاصيل ...
المنطق المشترك لإجراءات 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". بمجرد أن نقوم بتضمين هذه التعليمة البرمجية في ملف البرنامج المساعد الخاص بنا (كما تمت مناقشته في المقالة السابقة) ، سنرى النتيجة على الموقع.
تعمل الفلاتر بنفس المنطق مثل الإجراءات. والفرق الوحيد هو أنهم لا يقومون فقط بتنفيذ جزء من الكود في مكان معين. ينفذون هذا الرمز لتعديل بعض القيمة المعطاة لهم بواسطة الخطاف. هذا يعني أن كل خطاف مرشح له القيمة المرتبطة (في معظم الحالات يحملها متغير).
يجب أن تأخذ الدالة التي تقوم بالتصفية هذه القيمة ، وتغيرها بطريقة ما ، ثم تعيدها لمزيد من الاستخدام. حتى أن بناء الجملة من الوظائف المسؤولة عن الخطافات والفلاتر يختلف قليلاً.
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'. بعد تضمين الشفرة في ملف المكوّن الإضافي ، يجب أن نرى النتيجة على الموقع:
يجب أن يكون واضحًا في الوقت الحالي أنه بالنسبة إلى تنفيذ إجراءات الأداء والفلتر ، نحتاج إلى معرفة الروابط المتاحة.
ووردبريس الدستور يوفر مرجع العمل مع معظم خطوات العمل التي تم إطلاقها على تحميل الصفحة المعتاد و مرجع مرشح مع قائمة من المرشحات شائعة الاستخدام. تفيد هذه المراجع في فهم ترتيب الإجراءات ومنطق الفلاتر حتى تتمكن من اختيار مكان وزمان الوظائف التي يمكن ويجب حقنها.
بعد ذلك تكون مستعدًا للرحلة في شفرة المصدر. يمكنك فقط إجراء بحث عبر ملفات 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؛} / ** إضافة مربع المؤلف إلى نهاية المشاركة ** / وظيفة 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 المخصصة لحاوية منشورات الضيوف لمرونة التصميم في السمة. بعد تطبيق بعض الأساليب ، يمكننا رؤية النتيجة:
تمثل الإجراءات والفلاتر الجزء الأكثر أهمية في أي تطوير لبرنامج WordPress. الآن بعد أن فهمت منطقهم وسلوكهم ، فأنت مستعد لتجاربك الخاصة.
انقر هنا لتنزيل نموذج ملحق Hello World الموسع لاستخدامه كهيكل عظمي لتطويرك.
ما هي الاستخدامات التي وجدتها لإجراءات وفلاتر WordPress؟ ما الذي ترغب في مشاهدته في الجزء التالي من هذه السلسلة؟ اسمحوا لنا أن نعرف في التعليقات.