لقد نظرت إلى واجهة برمجة تطبيقات البرنامج المساعد بشكل أكثر تعمقًا مؤخرًا وكنت أتساءل ما هي الفروق الحقيقية التي كانت موجودة بين خطافات الحركة والفلتر كلاهما حدثان يستقبلان البيانات كمعلمة ويبدو أنهما قادران على فعل نفس الأشياء.
من الواضح أنني أرى أن الإجراءات تسمى عندما تحدث الإجراءات ويتم استدعاء المرشحات عندما يتم التعامل مع البيانات ، ولكن يبدو أنه مجرد فرق تسمية دلالي.
إلى جانب الدلالات وما الذي تستخدمه ، ما الاختلافات الحقيقية الموجودة بينهما؟
مرحبًاSruly :
لقد أجبت كثيرًا على سؤالك الخاص ، لكنني سأوضح بعض الشيء.
الإجراءات Hooks مخصصة للاستخدام عندما يتيح لك WordPress core أو بعض المكونات الإضافية أو السمة فرصة إدراج الرمز في نقطة معينة والقيام بواحد أو أكثر من الإجراءات التالية:
echo
إلى حقن بعض HTML أو محتوى آخر في مخزن الاستجابة المؤقت ،do_action_ref_array()
بدلاً من do_action()
لأن الأخير لا يدعم تمرير المتغيرات حسب المرجع .)تصفية الخطافات سلوك مشابه جدًا لـ خطاطيف الإجراء ولكن الاستخدام المقصود منه هو الحصول على قيمة وإرجاع نسخة معدلة من القيمة على الأرجح. يمكن أيضًا استخدام ربط عامل التصفية تمامًا مثل Action Hook أي لتعديل متغير عمومي أو إنشاء بعض HTML ، على افتراض أن هذا ما تحتاج إلى القيام به عند استدعاء الخطاف. شيء واحد مهم للغاية حول Filter Hooks الذي لا داعي للقلق بشأنه هو Action Hooks هو أن الشخص الذي يستخدم Filter Hook must return (نسخة معدلة من) المعلمة الأولى تم تمريره. خطأ مبتدئ شائع هو أن ننسى أن نعيد هذه القيمة!
جانبا شعرت أن Filter Hooks كانت متعثرة في الإصدارات السابقة من WordPress لأنها ستتلقى معلمة واحدة فقط ؛ بمعنى أنهم سيحصلون على قيمة للتعديل ولكن لا توجد معلمات ثانية أو ثالثة لتوفير أي سياق. في الآونة الأخيرة ، وبشكل إيجابي ، يبدو أن الفريق الأساسي لـ WordPress قام بسرور (بالنسبة لي) بإضافة معلمات إضافية إلى Filter Hooks حتى تتمكن من اكتشاف المزيد من السياق. مثال جيد هو ربط posts_where
؛ أعتقد أن هناك بعض الإصدارات التي تم قبولها قبلت فقط معلمة واحدة هي الاستعلام الحالي "حيث" فئة SQL ولكن الآن تقبل كلا من حيث حيث و / إشارة إلى المثيل الحالي للفئة WP_Query
هذا هو استدعاء هوك.
في الواقع ، تعتبر "عوامل تصفية الخطافات" مجموعة كبيرة من "خطافات العمل". يمكن للأولى القيام بأي شيء يمكن أن يقوم به الأخير ، وأكثر قليلاً ، وإن لم يكن المطور يتحمل مسؤولية إرجاع قيمة باستخدام Hook Hook الذي يفعله مع Filter Hook.
ولكن هذا ربما ليس هو المهم. أعتقد أن المهم هو اختيار مطور Action Hook مقابل عامل تصفية Hook أو العكس بالعكس أنهم يرسلون نواياهم وبالتالي يقدمون إرشادات للمطور أو المساعد الإضافي الذي قد يكون باستخدام الخطاف. في جوهرها يقولون إما "سأقوم بالاتصال بك ، افعل كل ما عليك القيام به" أو "سأذهب إلى قم بتمرير هذه القيمة لتعديلها ولكن تأكد من إعادتها . "
في نهاية المطاف أعتقد أن التوجيه المقدم من خلال اختيار نوع الخطاف هو القيمة الحقيقية وراء التمييز . المنظمة البحرية الدولية ، على أي حال.
أتمنى أن يساعدك هذا!
إذا نظرت إلى مصدر وظيفة add_action()
الأساسية ، فهي مجرد غلاف لوظيفة add_filter()
...
وإذا نظرت إلى وظيفة do_action()
، فهي تشبه إلى حد كبير وظيفة apply_filters()
، بفارق رئيسي واحد: لا تُرجع قيمة.
فماذا يعني هذا؟ الإجراءات تشبه المرشحات ، باستثناء أن الإجراء لا يُرجع قيمة ، لذلك لا يمكنك تعديل البيانات. يُظهر أنه كان من السهل إنشاء آلية عمل WordPress من خلال نسخ آلية التصفية ببساطة ، وليس إرجاع قيمة. في الأساس ، كل ما يمكنك القيام به مع إجراء ما هو ببساطة تنفيذ وظيفة دون تعديل بعض القيمة.
في كلمة بسيطة.
الإجراءات هي تلك PHP الدوال التي تنفذ الإخراج.
المرشحات هي تلك PHP الدوال التي ترجع المخرجات.
محدث: يمكننا تمديد أي مكون إضافي يستخدم الإجراءات والمرشحات دون تعديل رمز هناك. عن طريق إضافة المرشحات والإجراءات في موضوعنا أو البرنامج المساعد.
راجع أدناه أمثلة بسيطة في ملف functions.php
الخاص بالموضوع.
اختبار الوظيفة () { يردد "الإخراج" ؛ } اختبار () ؛
فوق البرنامج طباعة الإخراج:
انتاج
[ملاحظة: هنا test () ما عليك سوى استدعاء الوظيفة. وتنفيذ وظيفة رد الاتصال "اختبار".]
function test1 () { صدى "Output" ؛ } add_action ('test' ، 'test1') ؛ do_action ('test') ؛
فوق البرنامج طباعة الإخراج:
انتاج
[ملاحظة: هنا do_action('test')
تعمل مثل وظيفة الاستدعاء. وتنفيذ وظيفة رد الاتصال 'test1'.]
function test2 () { صدى "Test 2" ؛ } add_action ('test' ، 'test2' ، 1) ؛ function test1 () { صدى "Test 1" ؛ } add_action ('test' ، 'test1' ، 2) ؛ do_action ('اختبار') ؛
فوق البرنامج طباعة الإخراج:
اختبار 2 اختبار 1
[ملاحظة: هنا do_action('test')
تعمل مثل وظيفة الاستدعاء. وتنفيذ وظائف رد الاتصال على أولوياتها.
وظيفة رد الاتصال 'test1' لها الأولوية 2 و 'test2' لها الأولوية 1.]
إذا تغيرت الأولويات مثل "test1" بالأولوية 1 و "test2" بالأولوية 2 ، فسيكون الناتج:
اختبار 1 اختبار 2
functions.php
function test1 () { do_action ('test_before') ؛ صدى "Test 1" ؛ do_action ('test_after') ؛ } add_action ('test' ، 'test1') ؛ do_action ('test') ؛
فوق البرنامج طباعة الإخراج:
الاختبار 1
الآن ، قم بإنشاء نموذج إضافي للتحقق من كيفية عمل مطور الطرف الثالث.
/wp-content/plugins/
./* * اسم المكون الإضافي: البرنامج المساعد البسيط */ وظيفة test_callback_function () { صدى "من البرنامج المساعد" ؛ } add_action ('test' ، 'test_callback_function') ؛
الآن ، قم بتنشيط البرنامج المساعد البسيط من لوحة تحكم مسؤول WordPress.
Goto plug-plugin وقم بتنشيطه.
بعد تفعيل البرنامج المساعد أعلاه البرنامج طباعة الإخراج:
اختبار 1 من البرنامج المساعد [. _.]
[ملاحظة: إذا أضفنا الأولوية لعملنا الإضافي من 1 إلى 9 ، فسيطبع الناتج مثل:
من pluginTest 1
نظرًا لأن WordPress يفكر في 10 priority by default
لجميع الإجراءات المضافة.]
تحقق من الأمثلة أدناه:
مثال بسيط PHP:
$ data = array ('one' ، 'two') ؛ print_r ($ data) ؛
فوق البرنامج طباعة الإخراج:
صفيف ([0] => واحد [1] => اثنين)
$ data = apply_filters ('my_filter_name' ، المصفوفة ('one' ، 'two')) ؛ print_r ($ data) ؛ add_filter (' my_filter_name '، function ($ old_data) { إرجاع صفيف (' ثلاثة '،' أربعة ') ؛ }) ؛
فوق البرنامج طباعة الإخراج:
صفيف ([0] => ثلاثة [1] => أربعة)
هنا ، لقد أضفنا عامل التصفية my_filter_name
وقمنا بتغيير الإخراج الحالي array( 'one', 'two' )
مع array( 'three', 'four' )
دون تغيير ملفات السمات/البرنامج المساعد.