it-swarm.asia

الفرق بين تصفية والعمل هوكس؟

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

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

إلى جانب الدلالات وما الذي تستخدمه ، ما الاختلافات الحقيقية الموجودة بينهما؟

49
Sruly

مرحبًاSruly :

لقد أجبت كثيرًا على سؤالك الخاص ، لكنني سأوضح بعض الشيء.

السنانير العمل

الإجراءات Hooks مخصصة للاستخدام عندما يتيح لك WordPress core أو بعض المكونات الإضافية أو السمة فرصة إدراج الرمز في نقطة معينة والقيام بواحد أو أكثر من الإجراءات التالية:

  1. استخدم echo إلى حقن بعض HTML أو محتوى آخر في مخزن الاستجابة المؤقت ،
  2. تعديل حالة المتغير الشامل لمتغير واحد أو أكثر ، و/أو
  3. تعديل المعلمات تمريرها إلى دالة ربط الخاص بك (على افتراض تم استدعاء hook بواسطة 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 أو العكس بالعكس أنهم يرسلون نواياهم وبالتالي يقدمون إرشادات للمطور أو المساعد الإضافي الذي قد يكون باستخدام الخطاف. في جوهرها يقولون إما "سأقوم بالاتصال بك ، افعل كل ما عليك القيام به" أو "سأذهب إلى قم بتمرير هذه القيمة لتعديلها ولكن تأكد من إعادتها . "

في نهاية المطاف أعتقد أن التوجيه المقدم من خلال اختيار نوع الخطاف هو القيمة الحقيقية وراء التمييز . المنظمة البحرية الدولية ، على أي حال.

أتمنى أن يساعدك هذا!

56
MikeSchinkel

إذا نظرت إلى مصدر وظيفة add_action() الأساسية ، فهي مجرد غلاف لوظيفة add_filter() ...

وإذا نظرت إلى وظيفة do_action() ، فهي تشبه إلى حد كبير وظيفة apply_filters() ، بفارق رئيسي واحد: لا تُرجع قيمة.

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

11
trusktr

في كلمة بسيطة.

الإجراءات هي تلك PHP الدوال التي تنفذ الإخراج.

المرشحات هي تلك PHP الدوال التي ترجع المخرجات.

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


كيف تستعمل؟

عمل:

راجع أدناه أمثلة بسيطة في ملف functions.php الخاص بالموضوع.

  1. مثال واحد: (بسيط PHP مثال)
 اختبار الوظيفة () {
 يردد "الإخراج" ؛ 
} 
 
 اختبار () ؛ 

فوق البرنامج طباعة الإخراج:

انتاج

[ملاحظة: هنا test () ما عليك سوى استدعاء الوظيفة. وتنفيذ وظيفة رد الاتصال "اختبار".]


  1. المثال الثاني: (الاستخدام البسيط للعمل)
 function test1 () {
 صدى "Output" ؛ 
} 
 add_action ('test' ، 'test1') ؛ 
 
 do_action ('test') ؛ 

فوق البرنامج طباعة الإخراج:

انتاج

[ملاحظة: هنا do_action('test') تعمل مثل وظيفة الاستدعاء. وتنفيذ وظيفة رد الاتصال 'test1'.]


  1. المثال الثالث: (استخدام آخر للإجراءات)
 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 

  1. المثال الرابع: (دعم الطرف الثالث) أضف الكود أدناه في functions.php
 function test1 () {
 do_action ('test_before') ؛ 
 صدى "Test 1" ؛ 
 do_action ('test_after') ؛ 
 } 
 add_action ('test' ، 'test1') ؛ 
 
 do_action ('test') ؛ 

فوق البرنامج طباعة الإخراج:

 الاختبار 1 

الآن ، قم بإنشاء نموذج إضافي للتحقق من كيفية عمل مطور الطرف الثالث.

  1. قم بإنشاء مجلد "بسيط" في دليل /wp-content/plugins/.
  2. قم بإنشاء ملف باسم "simple.php" وأضف الكود أدناه.
/* 
 * اسم المكون الإضافي: البرنامج المساعد البسيط 
 */
 وظيفة 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] => اثنين) 
  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' ) دون تغيير ملفات السمات/البرنامج المساعد.


4
maheshwaghmare