تسخير قوة WordPress Hooks: شرح الإجراءات والمرشحات
نشرت: 2022-07-22مثل أي CMS ، لن يلبي WordPress دائمًا كل احتياجاتك بمجرد إخراجها من الصندوق. نظرًا لأنه مفتوح المصدر ، يمكنك اختراقه لجعله متوافقًا مع احتياجات عملك - ولكن بدلاً من ذلك ، يمكنك استخدام أدوات WordPress لتحقيق أهدافك. البناء باستخدام الخطافات هي إستراتيجية رابحة تحرر مطوري WordPress لبناء أي ميزة موقع ويب يمكن تخيلها.
خطافات ووردبريس: الإجراءات والمرشحات
لا تعد أدوات WordPress أدوات تخصيص قوية فحسب ، بل هي طريقة تفاعل مكونات WordPress مع بعضها البعض. تدير الوظائف الموصولة العديد من المهام الروتينية التي نعتبرها جزءًا لا يتجزأ من WordPress ، مثل إضافة أنماط أو نصوص إلى صفحة ، أو إحاطة نص التذييل بعناصر HTML. يكشف البحث في قاعدة بيانات WordPress Core عن آلاف الخطافات في أكثر من 700 موقع. تحتوي قوالب WordPress والإضافات على المزيد من الروابط.
قبل أن ننتقل إلى الخطافات ونستكشف الفرق بين خطافات الحركة وخطافات التصفية ، دعنا نفهم أين تتناسب مع بنية WordPress.
البنية التحتية لـ WordPress
تتكامل العناصر المعيارية في WordPress بسهولة مع بعضها البعض ، حتى نتمكن من المزج والمطابقة والجمع بسهولة:
- WordPress Core: هذه هي الملفات المطلوبة لكي يعمل WordPress. يوفر WordPress Core بنية عامة ولوحة تحكم WP Admin واستعلامات قاعدة البيانات والأمان والمزيد. WordPress Core مكتوب بلغة PHP ويستخدم قاعدة بيانات MySQL.
- السمة (أو النسق الرئيسي): تحدد السمة التخطيط والتصميم الأساسيين لموقع الويب. بدعم من ملفات PHP و HTML و JavaScript و CSS ، تعمل سمة من خلال قراءة قاعدة بيانات WordPress MySQL لإنشاء كود HTML الذي يتم عرضه في المستعرض. قد تضيف الخطافات في النسق أوراق أنماط أو نصوص أو خطوط أو أنواع منشورات مخصصة ، على سبيل المثال.
- موضوع الطفل: نقوم بإنشاء سمات الطفل بأنفسنا لضبط التخطيط والتصميم الأساسيين اللذين توفرهما السمات الرئيسية. يمكن أن تحدد السمات الفرعية أوراق الأنماط والبرامج النصية لتعديل الميزات الموروثة أو إضافة أنواع المنشورات أو إزالتها. تحل إرشادات النسق الفرعي دائمًا محل إرشادات الموضوع الرئيسي.
- الإضافات (الإضافات ): لتوسيع وظيفة النهاية الخلفية لـ WordPress ، يمكننا الاختيار من بين آلاف المكونات الإضافية لجهات خارجية. يمكن للخطافات في المكون الإضافي ، على سبيل المثال ، إخطارنا عبر البريد الإلكتروني عند نشر منشور أو إخفاء التعليقات التي يرسلها المستخدم والتي تحتوي على لغة محظورة.
- المكون الإضافي المخصص (المكونات الإضافية): عندما لا يلبي مكون إضافي تابع لجهة خارجية احتياجات العمل بالكامل ، يمكننا شحنه عن طريق كتابة مكون إضافي مخصص في PHP. أو يمكننا كتابة مكون إضافي جديد من البداية. في كلتا الحالتين ، نضيف الخطاف لتوسيع الوظائف الحالية.
بالنظر إلى أن لدينا إمكانية الوصول إلى مصدر الطبقات الخمس ، فلماذا هناك حاجة إلى الخطافات في WordPress؟
كود السلامة
لمواكبة التقنيات المتطورة ، يقوم المساهمون في WordPress Core والموضوعات الرئيسية والمكونات الإضافية بإصدار تحديثات بشكل متكرر للتخفيف من الثغرات الأمنية أو إصلاح الأخطاء أو حل حالات عدم التوافق أو تقديم ميزات جديدة. كما يعلم أي مستشار لديه خبرة في حالات الطوارئ بشكل مباشر ، فإن الفشل في تحديث مكونات WordPress محدثًا يمكن أن يضر أو حتى يعطل الموقع.
إذا قمنا بتعديل النسخ المحلية مباشرة من مكونات WordPress الرئيسية ، فإننا نواجه مشكلة: التحديثات تحل محل التخصيصات الخاصة بنا. كيف يمكننا التحايل على هذا عند تخصيص WordPress؟ عبر الخطافات ، في القالب الفرعي والمكونات الإضافية المخصصة.
الترميز في موضوع طفلنا
المظهر الفرعي هو مساحة آمنة حيث يمكننا تخصيص مظهر ومظهر المظهر المثبت لدينا. أي كود مضاف هنا سوف يلغي كود مشابه في الأصل دون التعرض لخطر الكتابة فوقه بتحديث.
عندما يتم تنشيط موضوع فرعي ، فإنه يرتبط بوالد تم إلغاء تنشيطه ، ويرث ويعرض خصائص الوالدين بينما يظل غير متأثر بتحديثات الوالدين. حتى لا تقع فريسة لإغراء تعديل موضوع ما ، فإن أفضل الممارسات تقترح تنشيط سمة فرعية كجزء من إعدادنا.
كتابة البرنامج المساعد (الإضافات) المخصصة
عندما يتم تنشيط البرنامج المساعد ، يتم تنفيذ ملف functions.php
الخاص به مع كل مكالمة على الخادم. يقوم WordPress بدوره بتحميل وفرز الخطافات من جميع المكونات الإضافية النشطة وفقًا لأولويتها وتنفيذها بالتتابع. لتوسيع وظائف مكون إضافي تابع لجهة خارجية ، يمكننا كتابة مكون WordPress الإضافي المخصص الخاص بنا.
أين نضع خطافنا في WordPress
هدف | مثال | أين؟ | |
---|---|---|---|
موضوع الطفل PHP | البرنامج المساعد المخصص PHP | ||
لتعديل هيكل صفحة الويب | إضافة ورقة أنماط مخصصة لتغيير ألوان وخطوط عناصر الموقع | ||
لتعديل وظائف مكون إضافي آخر (على سبيل المثال ، إنشاء مكون إضافي لتحسين وظائف مكون إضافي تابع لجهة خارجية) | إضافة عنوان فرعي (على سبيل المثال ، "أخبار") لأنواع المنشورات المخصصة | ||
لإضافة ميزة جديدة تتجاوز WordPress Core | تعديل سير العمل الذي يحدث عند زيارة منشور لتضمين تحديث عداد في قاعدة البيانات |
الإعداد المسبق للغوص: التعاريف
لتجنب الخلط بين المصطلحات ، سنلتزم بهذه المصطلحات:
- الخطاف هو مكان جميل في WordPress حيث يتم تسجيل الوظائف للتشغيل. قد نربط وظائفنا بواحدة من العديد من الروابط في WordPress ومكوناتها أو ننشئ وظائفنا الخاصة.
- هوك العمل يدير الإجراءات.
- مرشح هوك يدير المرشحات.
- الوظيفة الموصولة هي وظيفة رد اتصال PHP مخصصة قمنا بربطها بموقع ربط WordPress. يعتمد النوع الذي يجب استخدامه على ما إذا كان المقصود من الخطاف هو السماح بإجراء تغييرات خارج الوظيفة - على سبيل المثال ، الإضافة مباشرة إلى مخرجات صفحة الويب ، أو تعديل قاعدة البيانات ، أو إرسال بريد إلكتروني. تُعرف هذه الآثار الجانبية .
- يجب أن يتجنب المرشح (أو وظيفة التصفية ) الآثار الجانبية من خلال العمل فقط ، ثم إعادة نسخة معدلة من البيانات التي تم تمريرها إليه.
- على النقيض من ذلك ، فإن الإجراء (أو وظيفة العمل ) يهدف إلى إحداث آثار جانبية. ليس له قيمة مردودة.
مع وضع هذه الفروق في الاعتبار ، يمكننا أن نبدأ استكشافنا للخطافات.
التجريد والكود النظيف
عندما يتم دمج إجراء أو مرشح في خطاف ، حسب الحاجة ، فإننا نحقق أهداف كتابة وظيفة واحدة فقط لكل مهمة وتجنب تكرار الكود داخل المشروع. على سبيل المثال ، لنفترض أننا نريد إضافة نفس ورقة الأنماط إلى ثلاثة قوالب للصفحة (أرشيف ، صفحة واحدة ، منشور مخصص) في موضوعنا. بدلاً من تجاوز كل قالب في الأصل ، ثم إعادة إنشاء كل قالب في القالب الفرعي الخاص بنا ، ثم إضافة أوراق أنماط إلى أقسام الرأس الفردية ، يمكننا كتابة التعليمات البرمجية في وظيفة واحدة وإرفاقها باستخدام خطاف wp_head
.
تسمية مدروسة
تجنب التعارضات بشكل استباقي عن طريق تسمية سمة فرعية أو أدوات ربط مخصصة بشكل فريد. إن وجود خطافات تحمل نفس الاسم في موقع واحد هو وصفة لسلوك كود غير مقصود. تنص أفضل الممارسات على أن نبدأ اسم الخطاف ببادئة فريدة قصيرة (على سبيل المثال ، الأحرف الأولى من اسم المؤلف أو المشروع أو الشركة) ، متبوعة باسم خطاف وصفي. على سبيل المثال ، باستخدام النمط "الأحرف الأولى من اسم المشروع بالإضافة إلى اسم الخطاف" لمشروع Tahir's Fabulous Plugin ، يمكننا تسمية الخطافات tfp-upload-document
أو tfp-create-post-news
.
التطوير المتزامن والتصحيح
قد يؤدي الخطاف المفرد إلى تشغيل أكثر من إجراء أو مرشح واحد. على سبيل المثال ، يمكننا كتابة صفحة ويب تحتوي على نصوص متعددة ، وكلها تستخدم ربط الإجراء wp_head
لطباعة HTML (على سبيل المثال ، قسم <style>
أو <script>
) داخل قسم <head>
في الواجهة الأمامية للصفحة.
وبالتالي ، يمكن للعديد من مطوري المكونات الإضافية تطوير أهداف متعددة بشكل متوازٍ على مكون إضافي واحد ، أو تقسيم المكون الإضافي إلى عدة مكونات إضافية فردية أبسط. إذا لم تعمل الميزة بشكل صحيح ، فيمكننا التحقيق مباشرة وتصحيح وظيفتها الموصولة دون الحاجة إلى البحث في المشروع بأكمله.
أجراءات
يقوم الإجراء بتشغيل التعليمات البرمجية عند حدوث حدث في WordPress. يمكن أن تؤدي الإجراءات عمليات مثل:
- خلق البيانات.
- قراءة البيانات.
- تعديل البيانات.
- حذف البيانات.
- تسجيل أذونات المستخدمين المسجلين.
- تتبع المواقع وتخزينها في قاعدة البيانات.
تتضمن أمثلة الأحداث التي يمكن تشغيل الإجراءات فيها ما يلي:
-
init
، بعد تحميل WordPress ولكن قبل إرسالها إلى تدفق الإخراج. -
save_post
، عندما يتم حفظ المنشور. -
wp_create_nav_menu
، بعد إنشاء قائمة التنقل بنجاح.
يمكن أن يتفاعل الإجراء مع واجهة برمجة التطبيقات لنقل البيانات (على سبيل المثال ، رابط إلى منشور على وسائل التواصل الاجتماعي) ، لكنه لن يعيد البيانات إلى ربط الاتصال.
لنفترض أننا نرغب في أتمتة مشاركة جميع المنشورات الجديدة على موقعنا عبر وسائل التواصل الاجتماعي. ابدأ بالاطلاع على وثائق WordPress بحثًا عن خطاف يمكن تشغيله عند نشر منشور.

لا توجد طرق مختصرة للعثور على الخطاف: سنتعلم من خلال الخبرة أو المسام من خلال الإجراءات المدرجة للعثور على المرشحين المحتملين. قد نفكر في save_post
مرشحًا ، لكننا نستبعده سريعًا لأنه قد يتم تشغيله عدة مرات خلال جلسة تحرير واحدة. يعتبر الخيار الأفضل هو "" "" تحويل " transition_post_status
" ، والذي يتم تشغيله فقط عند تغيير حالة المنشور (على سبيل المثال ، من draft
إلى publish
، ومن publish
إلى trash
).
سنذهب إلى موقع transition_post_status
، لكننا سنعمل أيضًا على تحسين إجراءنا ليتم تشغيله فقط عندما يتم publish
حالة ما بعد الانتقال. علاوة على ذلك ، باتباع الوثائق الرسمية وواجهات برمجة التطبيقات لمنصات الوسائط الاجتماعية المختلفة ، يمكننا دمج ونشر محتوى منشورنا ، جنبًا إلى جنب مع صورة مميزة:
<?php function publish_post_on_social_media ( $new_status = NULL, $old_status = NULL, $post_ID = NULL ) { if ( 'publish' == $new_status && 'publish' != $old_status ) { // build the logic to share on social media } } add_action( 'transition_post_status', 'publish_post_on_social_media', 10, 3 ); ?>
الآن بعد أن عرفنا كيفية استخدام خطافات الحركة ، هناك واحد مفيد بشكل خاص ، خاصة عندما يتعلق الأمر بـ CSS.
تحديد الأولويات باستخدام wp_enqueue_scripts
لنفترض أننا نريد إضافة ورقة أنماط السمات الفرعية الخاصة بنا أخيرًا ، بعد تحميل جميع الفئات الأخرى ، للتأكد من أن فصول السمات الفرعية الخاصة بنا قد تجاوزت أي فصول تحمل نفس الاسم تنشأ في مكان آخر.
يقوم WordPress بتحميل أوراق الأنماط بترتيب افتراضي:
- موضوع الوالدين
- موضوع الطفل
- أي ملحقات
في هذا البناء:
add_action( string $hook_name, callable $callback, int $priority = 10, int $accepted_args = 1)
... تحدد قيمة priority
للإجراء المضاف ترتيب تنفيذه:
- قيمة
priority
الافتراضية لـwp_enqueue_scripts
(أو أي إجراء) هي "10." - يتم تشغيل الوظيفة في وقت سابق إذا قمنا بإعادة تعيين
priority
إلى رقم أقل. - يتم تشغيل الوظيفة لاحقًا إذا قمنا بإعادة تعيين
priority
إلى رقم أعلى.
لتحميل ورقة الأنماط الخاصة بالقالب الفرعي الخاص بنا أخيرًا ، استخدم wp_enqueue_scripts
، وهو إجراء يتم استخدامه بشكل شائع بواسطة قوالب WordPress والإضافات. نحتاج فقط إلى تغيير أولوية إجراء wp_enqueue_scripts
إلى رقم أعلى من الافتراضي "10" ، قل "99":
add_action( 'wp_enqueue_scripts', 'child_theme_styles', 99 );
بشكل عام ، نستخدم الإجراءات عندما لا نبحث عن قيم الإرجاع. لإعادة البيانات إلى ربط الاتصال ، نحتاج إلى النظر في عوامل التصفية.
المرشحات
يسمح لنا عامل التصفية بتعديل البيانات قبل معالجتها لعرضها في المتصفح. تحقيقا لهذه الغاية ، يقبل المرشح المتغير (المتغيرات) ، ويعدل القيمة (القيم) التي تم تمريرها ، ويعيد البيانات لمزيد من المعالجة.
يتحقق WordPress من جميع المرشحات المسجلة وينفذها قبل إعداد المحتوى للمتصفحات. بهذه الطريقة ، يمكننا معالجة البيانات قبل إرسالها إلى المتصفح أو قاعدة البيانات ، حسب الاقتضاء.
يقوم أحد عملائي بإضفاء الطابع الشخصي على المنتجات التي يبيعها من خلال طبعها بالصور التي يقدمها العملاء. يستخدم هذا العميل البرنامج المساعد WooCommerce لإدارة التجارة الإلكترونية. لا تدعم WooCommerce هذه الوظيفة خارج الصندوق. لذلك ، أضفت بتين من التعليمات البرمجية إلى functions.php
عميلي .php:
-
woocommerce_checkout_cart_item_quantity
، المدرج في وثائق WooCommerce ، عبارة عن عامل تصفية يسمح للعملاء بإضافة عناصر خارجية إلى عرباتهم قبل الخروج. -
my_customer_image_data_in_cart
هو عامل تصفية سنكتبه بأنفسنا ونستخدمه لتشغيلwoocommerce_checkout_cart_item_quantity
عندما تقوم WooCommerce بإعداد عربة التسوق للعرض.
باستخدام النموذج التالي ، يمكننا إضافة عامل التصفية الخاص بنا وتعديل السلوك الافتراضي لسلة التسوق:
add_filter( 'woocommerce_checkout_cart_item_quantity', 'my_customer_image_data_in_cart', 1, 3 ); function my_customer_image_data_in_cart( $html, $cart_item, $cart_item_key ) { if ( !empty( $cart_item['images_data'] ) ) { // Store image // Get image URL // Modify $html } return $html; }
نضيف المرشحات بنفس الطريقة التي نضيف بها الإجراءات. تعمل المرشحات بشكل مشابه للإجراءات ، بما في ذلك كيفية معالجة الأولويات. يتمثل الاختلاف الرئيسي بين عوامل التصفية والإجراءات في أن الإجراء لن يعيد البيانات إلى ربط الاتصال ولكن المرشح سوف يقوم بذلك.
خطافات العمل المخصصة وخطافات المرشح
لا تؤدي كتابة خطافات الإجراءات المخصصة إلى توسيع Wordpress Core ولكنها تخلق فقط نقاط تشغيل جديدة داخل الكود الخاص بنا.
إنشاء خطافات إجراءات مخصصة
تسمح إضافة خطاف مخصص في السمة أو المكون الإضافي الخاص بنا للمطورين الآخرين بتوسيع الوظائف دون تعديل قاعدة التعليمات البرمجية الخاصة بنا. لإضافة خطاف مخصص ، استخدم نفس الأسلوب الذي تستخدمه قاعدة شفرة WordPress الأساسية نفسها: عند نقطة التشغيل التي نرغب فيها ، فإننا ببساطة نسمي do_action
باسم الخطاف الجديد ، ونضيف اختياريًا العديد من الوسائط التي قد تجدها عمليات الاستدعاء مفيدة:
do_action( 'myorg_hello_action', $arg1, $arg2 );
يعمل هذا الرمز ببساطة على تشغيل أي وظائف رد اتصال تم ربطها على الخطاف المخصص لدينا. لاحظ أن مساحة الاسم عالمية ، لذا ، كما هو مقترح سابقًا ، سيكون من الجيد تقديم أسماء الخطاف المخصصة مع شكل مختصر لاسم منظمتنا (وربما مشروعنا أيضًا) ، ومن هنا myorg_
هنا.
الآن بعد أن حددنا myorg_hello_action
، أصبح متاحًا للمطورين الارتباط بالطريقة نفسها التي غطيناها سابقًا للخطافات المضمنة: تحديد وظيفة ، ثم استدعاء add_action()
.
ما لم نرغب في استخدام خطاف جديد داخليًا بحتًا - إنها طريقة مفيدة لبناء الكود الخاص بنا ، بعد كل شيء - سيتعين علينا توصيل مدى توفره في نهاية المطاف إلى أعضاء آخرين في فريقنا أو للمستخدمين الخارجيين للمكون الإضافي الخاص بنا ، عبر وثائق واضحة .
إنشاء خطافات مرشح مخصص
نمط WordPress لخطافات التصفية المخصصة هو نفس نمط خطافات الإجراءات ، باستثناء أننا نسمي apply_filters()
بدلاً من do_action()
.
دعنا نمر بمثال أكثر واقعية هذه المرة. لنفترض أن المكون الإضافي الخاص بنا ينشئ قائمة شريط جانبي ، والتي تتكون عادةً من أربعة عناصر. سنضيف رابط مرشح مخصص حتى نتمكن (والمطورون النهائيون) من تعديل قائمة العناصر هذه في مكان آخر:
// Text labels of sidebar menu $sidebar_menu = array( "Page One", "Page Two", "Page Three", "Page Four" ); $sidebar_menu = apply_filters( 'myorg_sidebar_menu', $sidebar_menu );
هذا كل شيء - خطاف المرشح المخصص myorg_sidebar_menu
جاهز الآن للاستخدام في مكون إضافي قد يتم تحميله لاحقًا أو في أي مكان آخر في هذا المكون. هذا يسمح لأي شخص يكتب التعليمات البرمجية النهائية لتخصيص شريطنا الجانبي.
سنتبع نحن أو المطورين الآخرين نفس النمط عند استخدام خطاف WordPress مدمج. بمعنى آخر ، سنبدأ بتحديد بعض وظائف رد الاتصال التي تُرجع نسخة معدلة من البيانات التي تم تمريرها:
function lowercase_sidebar_menu( $menu ) { $menu = array_map( 'strtolower', $menu ); return $menu; } function add_donate_item( $menu ) { $menu = array_push( $menu, 'Donate' ); return $menu; }
كما هو الحال مع الأمثلة السابقة لدينا ، نحن الآن جاهزون لربط وظائف رد نداء عامل التصفية الخاص بنا إلى الخطاف المخصص الخاص بنا:
add_filter( 'myorg_sidebar_menu', 'add_donate_item', 100 ); add_filter( 'myorg_sidebar_menu', 'lowercase_sidebar_menu' );
مع ذلك ، قمنا بتوصيل وظيفتي رد الاتصال المثالين لدينا على خطاف المرشح المخصص. كلاهما يقوم الآن بتعديل المحتوى الأصلي لـ $the_sidebar_menu
. نظرًا لأننا أعطينا قيمة priority
أعلى لـ add_donate_item
، يتم تشغيلها لاحقًا ، بعد تنفيذ lowercase_sidebar_menu
.
يتمتع مطورو المصب دائمًا بحرية ربط المزيد من وظائف رد الاتصال إلى myorg_sidebar_menu
. كما يفعلون ، يمكنهم استخدام المعامل priority
لجعل الخطافات تعمل قبل أو بعد أو بين مثالين لدالة رد الاتصال.
السماء هي الحد من الإجراءات والمرشحات
من خلال الإجراءات والفلاتر والخطافات ، يمكن أن تنمو وظائف WordPress بسرعة فائقة. يمكننا تطوير ميزات مخصصة لموقعنا ، مع ترك مساهماتنا الخاصة قابلة للتوسيع مثل WordPress. تسمح لنا الخطافات بالالتزام بالسلامة وأفضل الممارسات بينما ننتقل بموقع WordPress الخاص بنا إلى المستوى التالي.
تعرب مدونة Toptal Engineering عن امتنانها لفهد مرتضى لخبرته واختباره التجريبي والمراجعة الفنية لهذه المقالة.