फ़िल्टर और एक्शन हुक के बीच अंतर?


51

मैं हाल ही में प्लगइन एपीआई को गहराई से थोड़ा अधिक देख रहा हूं और मैं सोच रहा था कि कार्रवाई और फिल्टर हुक के बीच वास्तविक अंतर क्या थे । वे दोनों ऐसी घटनाएँ हैं जो डेटा को एक पैरामीटर के रूप में प्राप्त करते हैं और वे दोनों एक ही काम करने में सक्षम प्रतीत होते हैं।

जाहिर है मैं देख रहा हूं कि जब कार्रवाई की जाती है और डेटा को हेरफेर करने पर फ़िल्टर कहा जाता है, तो कार्रवाई को कहा जाता है, लेकिन ऐसा लगता है कि यह केवल एक शब्दार्थ नामकरण अंतर है।

शब्दार्थ के अलावा और उनके लिए क्या उपयोग किया जाता है, उनके बीच वास्तविक अंतर क्या हैं?

जवाबों:


58

हाय @ सच :

आपने अपने स्वयं के प्रश्न का बहुत उत्तर दिया है, लेकिन मैं थोड़ा विस्तार करूंगा।

एक्शन हुक

जब वर्डप्रेस कोर या कुछ प्लगइन या थीम आपको एक निश्चित बिंदु पर अपना कोड डालने और निम्नलिखित में से एक या अधिक करने का अवसर दे रहा है, तो कार्य हुक का उपयोग करने के लिए किया जाता है:

  1. प्रतिक्रिया बफर में कुछ HTML या अन्य सामग्री echoको इंजेक्ट करने के लिए उपयोग करें ,
  2. एक या अधिक चर के लिए वैश्विक चर स्थिति को संशोधित करें , और / या
  3. अपने हुक फ़ंक्शन के लिए दिए गए मापदंडों को संशोधित करें (यह मानते हुए कि हुक को do_action_ref_array()इसके बजाय कहा जाता था do_action()क्योंकि उत्तरार्द्ध संदर्भ द्वारा पारित चर का समर्थन नहीं करता है ।)

हुक फ़िल्टर करें

फ़िल्टर हुक एक्शन हुक के समान व्यवहार करते हैं लेकिन उनका उपयोग एक मूल्य प्राप्त करने के लिए होता है और संभवतः मूल्य का एक संशोधित संस्करण लौटाता है। एक फिल्टर हुक भी एक एक्शन हुक की तरह इस्तेमाल किया जा सकता है यानी एक ग्लोबल वैरिएबल को संशोधित करने के लिए या कुछ एचटीएमएल जेनरेट करने के लिए, यह मानकर कि आपको हुक करने की आवश्यकता है। फ़िल्टर हुक के बारे में एक बात जो बहुत महत्वपूर्ण है कि आपको एक्शन हुक के बारे में चिंता करने की ज़रूरत नहीं है, वह यह है कि फ़िल्टर हुक का उपयोग करने वाले व्यक्ति को (पहले का संशोधित संस्करण) वापस लौटना होगा । एक सामान्य नौसिखिया गलती है कि मूल्य वापस करने के लिए भूल जाओ!

फ़िल्टर हुक में संदर्भ प्रदान करने के लिए अतिरिक्त पैरामीटर का उपयोग करना

एक तरफ के रूप में मुझे लगा कि फ़िल्टर हुक वर्डप्रेस के पुराने संस्करणों में शौक से थे क्योंकि उन्हें केवल एक पैरामीटर प्राप्त होगा; यानी उन्हें संशोधित करने के लिए एक मूल्य मिलेगा लेकिन कोई भी संदर्भ प्रदान करने के लिए कोई दूसरा या तीसरा पैरामीटर नहीं। हाल ही में, और सकारात्मक रूप से, ऐसा लगता है कि वर्डप्रेस कोर टीम ने खुशी से (मेरे लिए) फ़िल्टर हुक में अतिरिक्त पैरामीटर जोड़ दिए हैं ताकि आप अधिक संदर्भ खोज सकें। एक अच्छा उदाहरण posts_whereहुक है; मेरा मानना ​​है कि कुछ संस्करणों ने केवल एक पैरामीटर को वर्तमान क्वेरी के "जहां" वर्ग एसक्यूएल होने के रूप में स्वीकार किया है, लेकिन अब यह जहां क्लाज औरWP_Query हुक का आह्वान करने वाले वर्ग के वर्तमान उदाहरण के संदर्भ को स्वीकार करता है ।

तो असली अंतर क्या है?

हकीकत में फ़िल्टर हुक बहुत ज्यादा एक्शन हुक के सुपरसेट हैं। पूर्व कुछ भी कर सकता है और बाद वाला कुछ भी कर सकता है और इसके अलावा डेवलपर के पास एक्शन हुक के साथ एक मूल्य वापस करने की जिम्मेदारी नहीं है जो वह या वह फ़िल्टर हुक के साथ करता है।

गाइडेंस और टेलीग्राफिंग इंटेंट देना

लेकिन यह महत्वपूर्ण नहीं है। मुझे लगता है कि जो महत्वपूर्ण है वह यह है कि एक डेवलपर द्वारा एक एक्शन हुक बनाम एक फिल्टर हुक या इसके विपरीत का उपयोग करने का चयन करके वे अपने इरादे को तार - तार कर रहे हैं और इस प्रकार उन लोगों या प्लगइन डेवलपर को मार्गदर्शन दे रहे हैं जो हुक का उपयोग कर रहे होंगे। संक्षेप में, वे या तो कह रहे हैं "मैं आपको कॉल करने जा रहा हूं, आपको जो कुछ भी करने की ज़रूरत है" या "मैं आपको इस मूल्य को संशोधित करने के लिए पास करने जा रहा हूं, लेकिन सुनिश्चित करें कि आप इसे वापस पारित करते हैं ।"

इसलिए अंततः मुझे लगता है कि हुक प्रकार की पसंद द्वारा प्रदान किया गया मार्गदर्शन भेद के पीछे वास्तविक मूल्य है । IMO, वैसे भी।

उम्मीद है की यह मदद करेगा!


मेरे लिए ऐसा लगता है जैसे आप हर चीज़ के लिए फ़िल्टर का उपयोग कर सकते थे, क्योंकि एक चर लौटना PHP में वैकल्पिक है। किसी को भी पता है कि वर्डप्रेस डेवलपर्स ने दो अलग-अलग शर्तें क्यों चुनीं? क्या यह विशुद्ध रूप से अर्थ संबंधी कारणों से है? तकनीकी तौर पर मैं इसकी आवश्यकता नहीं देख सकता ...
TheStoryCoder

2
@ TheStoryCoder "क्या यह विशुद्ध रूप से शब्दार्थ कारणों से है?" ऐसा लगता है कि वास्तव में मेरे जवाब में बताया गया है, पांच (5) साल पहले ...?
मिकशिंकेल

11

यदि आप add_action()कोर फ़ंक्शन के स्रोत को देखते हैं , तो यह फ़ंक्शन के लिए सिर्फ एक आवरण add_filter()है ...

और अगर आप do_action()कोर फ़ंक्शन को देखते हैं, तो यह apply_filters()एक बहुत ही महत्वपूर्ण अंतर के साथ कोर फ़ंक्शन के समान है : यह एक मान नहीं लौटाता है।

अच्छा तो इसका क्या मतलब है? क्रियाएं फ़िल्टर की तरह होती हैं, सिवाय एक एक्शन के कोई मान नहीं लौटता है, इसलिए आप डेटा को संशोधित नहीं कर सकते। यह दिखाता है कि केवल फ़िल्टर तंत्र की प्रतिलिपि बनाकर वर्डप्रेस की कार्रवाई तंत्र बनाना आसान था, और मान वापस नहीं करना। असल में, आप एक कार्रवाई के साथ कर सकते हैं बस कुछ मान को संशोधित किए बिना एक फ़ंक्शन को निष्पादित करें।


5

सरल शब्द में।

क्रिया वे PHP फ़ंक्शंस हैं जो आउटपुट निष्पादित करते हैं।

फ़िल्टर उन PHP फ़ंक्शंस हैं जो आउटपुट वापस करते हैं।

अपडेट किया गया: हम किसी भी प्लगइन का विस्तार कर सकते हैं जो वहां कोड को संशोधित किए बिना कार्यों और फिल्टर का उपयोग करते हैं। हमारे अपने थीम या प्लगइन में फ़िल्टर और क्रियाएं जोड़कर।


कैसे इस्तेमाल करे?

क्रिया:

अपनी थीम functions.phpफ़ाइल में सरल उदाहरण देखें ।

  1. उदाहरण एक: (सरल PHP उदाहरण)
कार्य परीक्षण() {
     गूंज "आउटपुट";
}

परीक्षा();

कार्यक्रम के ऊपर आउटपुट प्रिंट करें:

उत्पादन

[नोट: यहाँ परीक्षण () बस समारोह कहते हैं। और कॉलबैक फ़ंक्शन 'परीक्षण' को निष्पादित करें।]


  1. उदाहरण दो: (कार्रवाई का सरल उपयोग)
फ़ंक्शन टेस्ट 1 () {
     गूंज "आउटपुट";
}
add_action ('परीक्षण', 'test1');

do_action ('परीक्षण');

कार्यक्रम के ऊपर आउटपुट प्रिंट करें:

उत्पादन

[नोट: यहाँ do_action('test')कॉलिंग फंक्शन की तरह काम करता है। और कॉलबैक फ़ंक्शन 'test1' पर अमल करें।]


  1. उदाहरण तीन: (क्रियाओं का एक और उपयोग)
समारोह test2 () {
     इको "टेस्ट 2";
}
add_action ('परीक्षण', 'test2', 1);

फ़ंक्शन टेस्ट 1 () {
     इको "टेस्ट 1";
}
add_action ('परीक्षण', 'test1', 2);

do_action ('परीक्षण');

कार्यक्रम के ऊपर आउटपुट प्रिंट करें:

टेस्ट 2 टेस्ट 1

[नोट: यहाँ do_action('test')कॉलिंग फंक्शन की तरह काम करता है। और यह प्राथमिकताओं पर कॉलबैक फ़ंक्शन निष्पादित करता है।

कॉलबैक फ़ंक्शन 'test1' की प्राथमिकता 2 है और 'test2' की प्राथमिकता 1. है]

यदि प्राथमिकताएँ 1 के साथ 'test1' की तरह बदल रही हैं और प्राथमिकता 2 के साथ 'test2' तो आउटपुट होगा:

टेस्ट 1 टेस्ट 2

  1. उदाहरण चार: (तीसरा पक्ष समर्थन) नीचे दिए गए कोड को जोड़ेंfunctions.php
फ़ंक्शन टेस्ट 1 () {
     do_action ('test_before');
     इको "टेस्ट 1";
     do_action ('test_after');
}
add_action ('परीक्षण', 'test1');

do_action ('परीक्षण');

कार्यक्रम के ऊपर आउटपुट प्रिंट करें:

परीक्षण 1

अब, 3 जी पार्टी डेवलपर के लिए यह कैसे काम करता है यह जांचने के लिए नमूना प्लगइन बनाएं।

  1. /wp-content/plugins/निर्देशिका में फ़ोल्डर 'सरल' बनाएँ ।
  2. 'Simple.php' नाम की फ़ाइल बनाएँ और नीचे दिया गया कोड जोड़ें।
/ *
* प्लगइन नाम: सरल प्लगइन
* /
समारोह test_callback_function () {
     गूंज "प्लगइन से";
}
add_action ('परीक्षण', 'test_callback_function');

अब, WordPress admin डैशबोर्ड से हमारे सरल प्लगइन को सक्रिय करें ।

गोटो मेनू प्लगइन और इसे सक्रिय करें।

प्रोग्राम के ऊपर प्लगइन को सक्रिय करने के बाद आउटपुट प्रिंट करें:

1From प्लगइन का परीक्षण करें

[नोट: अगर हम अपनी प्लगइन कार्रवाई के लिए प्राथमिकता १ से ९ तक जोड़ते हैं तो यह आउटपुट को प्रिंट करता है जैसे:

PluginTest से 1

क्योंकि, वर्डप्रेस 10 priority by defaultसभी जोड़े गए कार्यों के लिए विचार करता है ।]

फिल्टर

नीचे दिए गए उदाहरण देखें:

सरल PHP उदाहरण:

$ डेटा = सरणी ('एक', 'दो');
Print_r ($ डेटा);

कार्यक्रम के ऊपर आउटपुट प्रिंट करें:

ऐरे ([0] => एक [1] => दो)
  1. उदाहरण एक: (फ़िल्टर का सरल उपयोग)
$ डेटा = apply_filters ('my_filter_name', सरणी ('एक', 'दो'));
Print_r ($ डेटा);

add_filter ('my_filter_name', function ($ old_data) {
     वापसी सरणी ('तीन', 'चार');
});

कार्यक्रम के ऊपर आउटपुट प्रिंट करें:

ऐरे ([0] => तीन [1] => चार)

यहाँ, हम फिल्टर को शामिल किया है my_filter_nameऔर मौजूदा उत्पादन को बदलने array( 'one', 'two' )के साथ array( 'three', 'four' )विषय / प्लगइन फ़ाइलों को परिवर्तित किए बिना।



थैंक्स @maheshwaghmare ऐसी सरल ट्रिक के लिए। कृपया 'फ़िल्टर्स' के बारे में भी लिखें
आदि

"जल्द" से आपका क्या तात्पर्य है?
राप्ती

@ राप्ती देरी के लिए क्षमा करें। आज रात मैं फिल्टर से संबंधित उत्तर जोड़ूंगा। भविष्य में मैं हुक (क्रिया और फ़िल्टर) के बारे में एक वर्णनात्मक लेख बनाऊंगा।
महेशवाघमारे

@ ममहेशवाघमारे को ज्यादा जगह मिली? : पी

अच्छी व्याख्या, मुझे अब एक बेहतर समझ है
१ip
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.