WordPress Actions और Filters: क्या अंतर है?
() translation by (you can also view the original English article)
एक्शन और फिल्टर हुक विभिन्न WordPress API का एक फंडामेंटल हिस्सा हैं। उनके बिना आप अपने थीम्स में जो कर सकते हैं और (विशेष रूप से) आपके प्लगइन में जो कर सकते हैं उसके लिए आप सीमित हैं।
लेकिन कभी-कभी दोनों में भ्रमित होना आसान हो सकता है, खासतौर से उन मामलों में जब WordPress में एक एक्शन हुक और फ़िल्टर हुक एक ही नाम के साथ होता है।
इस लेख में मैं एक्शन और फ़िल्टर हुक्स को परिभाषित करता हूं और उनके बीच के अंतर का वर्णन करता हूं, और मैं दिखाऊंगा कि उन्हें अपने थीम्स और प्लगइन में कैसे उपयोग करें। मैं कुछ उदाहरण भी दूंगा कि कब आप उनमे से प्रत्येक का उपयोग कर सकते हैं।
जब आप अपने कोड में एक्शन और फ़िल्टर हुक्स को जोड़ रहे हैं (या आप उनमे फ़ंक्शन हुक करते हैं), यह समझने में सहायता करता है कि WordPress द्वारा एक्शन और फ़िल्टर कैसे कॉल किए जाते हैं और किस क्रम में होता है। मैं इसे विस्तार से यहां शामिल नहीं करूंगा क्योंकि हमारे पास एक और ट्यूटोरियल है जो वह काम करता है।
डेफिनिशन और डिफरेंस
आइए कुछ परिभाषाओं से शुरू करें। मैं एक्शन और फ़िल्टर को परिभाषित करूँगा और साथ ही फ़ंक्शन को भी, ताकि आप उन सभी के बीच अंतर देख सकें।
फ़ंक्शन
फंक्शन्स वो पहली चीज है जिनका ज्यादातर लोग उपयोग करते है जब वे WordPress डेवलपमेंट सीख रहे होते हैं; अगर आपने अपनी थीम की functions.php
फ़ाइल में कोड जोड़ा है, तो आपने एक फ़ंक्शन लिखा होगा।
फ़ंक्शन यह निर्दिष्ट करते हैं कि कुछ कैसे होगा। आप डेटा को क्वेरी करने, कंटेंट आउटपुट करने, या कई अन्य कार्यों को करने के लिए फ़ंक्शन को कोड करते हैं। आप सीधे अपने थीम की टेम्पलेट फ़ाइलों में फ़ंक्शन को कॉल (एक्सेक्यूट) कर सकते हैं, या आप उन्हें एक्शन या फ़िल्टर हुक्स से हुक कर सकते हैं। फ़ंक्शन को अप्लाई होने पर स्पेसिफी करने के लिए फ़ंक्शंस में कंडीशनल टैग जैसे टेम्पलेट टैग भी शामिल हो सकते हैं।
मैं आपको इस आर्टिकल में बाद में फंक्शन्स को एक्सेक्यूट करने के विभिन्न तरीकों को दिखाऊंगा।
एक्शन हुक्स
कुछ होने पर एक्शन हुक्स (या एक्शन) ट्रिगर होता हैं, जैसे कोई पेज लोड करना, यूजर लॉग इन करना, या कस्टम एक्शन जिसे आप अपने थीम या प्लगइन में परिभाषित करते हैं।
आप do_action()
फ़ंक्शन का उपयोग करके अपने स्वयं के एक्शन हुक जोड़ सकते हैं, जिसे मैं जल्द ही प्रदर्शित करूंगा। उस एक्शन में आप जो भी फ़ंक्शन हुक करते हैं तो वह उस पॉइंट पर चलाया जाएगा।
फ़िल्टर हुक्स
फ़िल्टर हुक्स, या फिल्टर, कुछ ऐसा होता है या कुछ ऐसा बदलता है जो पहले से ही आउटपुट हो रहा है। आप किसी स्पेसिफिक फॉर्मेट में मेटाडेटा आउटपुट करने के लिए फ़िल्टर का उपयोग कर सकते हैं, अपनी प्लगइन द्वारा टेक्स्ट आउटपुट ओवरराइड करने के लिए, या किसी भी चीज़ को डिस्प्ले होने से रोकने के लिए।
आप apply_filters()
फ़ंक्शन का उपयोग करके अपने कोड में फ़िल्टर जोड़ते हैं, जिसे मैं जल्द ही प्रदर्शित करूंगा। जैसा कि 'apply' शब्द इंगित करता है, आप मौजूदा कोड पर फ़िल्टर अप्लाई करते हैं, जबकि do_action()
का उपयोग करके आपके द्वारा बनाये गए एक एक्शन तब तक खाली होता है जब तक आप इसमें फ़ंक्शन को हुक नहीं करते।
Functions, Actions, और Filters का उपयोग करना
आइए कुछ उदाहरण देखें कि आप प्रत्येक फंक्शन्स, एक्शन्स और फिल्टर्स का उपयोग कैसे करते हैं। सबसे पहले, हम आपके कोड में सीधे एक हुक को संलग्न किए बिना फ़ंक्शंस का उपयोग करने पर विचार करेंगे।
फंक्शन्स को सीधे कॉल करना
यहां एक फ़ंक्शन का एक उदाहरण दिया गया है जिसे सीधे टेम्पलेट फ़ाइल में कॉल किया जाता है। मेरी क्लाइंट साइट्स में मैं फुटर में एक कोलोफोन जोड़ता हूं, जिसमें कॉपीराइट जानकारी शामिल है। यहां फ़ंक्शन है:
1 |
if ( ! function_exists( 'compass_colophon' ) ) { |
2 |
function compass_colophon() { ?> |
3 |
<section class="colophon" role="contentinfo"> |
4 |
<small class="copyright left"> |
5 |
<?php echo compass_copyright(); ?>
|
6 |
<a href="<?php echo home_url( '/' ) ?>" title="<?php echo esc_attr( get_bloginfo( 'name', 'display' ) ); ?>" rel="home"> |
7 |
<?php bloginfo( 'name' ); ?>
|
8 |
</a>
|
9 |
</small><!-- #copyright --> |
10 |
|
11 |
<small class="credits right"> |
12 |
Powered by <a href="https://wordpress.org/">WordPress</a> and designed by <a href="http://compass-design.co.uk">Compass Design</a>. |
13 |
</a>
|
14 |
</small><!-- #credits --> |
15 |
</section><!--#colophon--> |
16 |
<?php } |
17 |
}
|
यह फ़ंक्शन प्लग करने योग्य है क्योंकि मैं इसे पैरेंट थीम में उपयोग करता हूं; अगर मैं अपने चाइल्ड थीम में उसी नाम के साथ एक नया फ़ंक्शन बनाउंगा, तो यह फ़ंक्शन ओवरराइड करेगा। ध्यान दें कि फ़ंक्शन में एक और फ़ंक्शन, compass_colophon()
शामिल है, इसे सीधे कोड में कॉल करना।
यह फ़ंक्शन मेरे पैरेंट थीम की functions.php
फ़ाइल में है। मैं इसे सीधे अपनी थीम की footer.php
फ़ाइल में कॉल कर सकता हूं, जैसे:
1 |
compass_colophon(); |
यह मेरे थीम में बिंदु पर फ़ंक्शन में कोड को आउटपुट करता है जहां मैं इसे कॉल करता हूं। आप अपने कार्यों में पैरामीटर भी पास कर सकते हैं, जिन्हें फ़ंक्शन के अंदर उपयोग किया जाता है।
जैसा कि मैं जल्द ही प्रदर्शित करूंगा, इस फ़ंक्शन को किसी एक्शन या फ़िल्टर पर भी लगाया जा सकता है।
एक्शन को हुक करने के लिए फ़ंक्शन
उस कोलोफोन फ़ंक्शन को सीधे कॉल करने के बजाय, अगर मैं इसे एक हुक से जोड़ता हूं तो मेरे पास अधिक फ्लेक्सिबिलिटी होगी।
एक्शन हुक बनाना
मेरे फुटर फ़ाइल में compass_colophon()
फ़ंक्शन को कॉल करने के बजाय, मैं इसे जोड़कर footer.php
फ़ाइल में उस पॉइंट पर एक एक्शन हुक जोड़ सकता हूं:
1 |
do_action( 'compass_in_footer' ); |
do_action()
फ़ंक्शन में एक अनिवार्य पैरामीटर है, जो एक्शन का नाम है। आप वैकल्पिक रूप से इसमें आर्ग्यूमेंट्स भी जोड़ सकते हैं।
एक्शन्स में फंक्शन्स को हुक करना
तो अब मेरे कोलोफोन फ़ंक्शन को कॉल करने के बजाय, मुझे इसे अपने नए एक्शन हुक में हुक करने की आवश्यकता है। मेरी functions.php
फ़ाइल में, मैं इसे अपने फ़ंक्शन के साथ जोड़ता हूं:
1 |
add_action( 'compass_in_footer', 'compass_colophon' ); |
यह मेरे फ़ंक्शन को compass_in_footer
एक्शन में हुक करता है, जिसका अर्थ है कि मेरे फ़ंक्शन के अंदर कोड इस कोड में उस पॉइंट पर चलाएगा जहां एक्शन रखा गया है। पहला पैरामीटर एक्शन हुक का नाम है, और दूसरा मेरे फ़ंक्शन का नाम है।
ऐसा करने का एक फायदा यह है कि आप एक से अधिक फंक्शन को एक ही एक्शन में लगा सकते हैं, और आप प्राथमिकता निर्धारित कर सकते हैं ताकि वे उस क्रम में फायर हो सकें जैसे आप चाहते हैं।
तो मान लीजिए कि मेरे पास एक और फ़ंक्शन है जो मैं अपने compass_in_footer
हुक को हुक करना चाहता हूं, जिसे compass_smallprint()
कहा जाता है, जिसमें कुछ और छोटे प्रिंट होते हैं:
1 |
if ( ! function_exists( compass_smallprint() ) ) { |
2 |
function compass_smallprint() { |
3 |
// contents of function here
|
4 |
}
|
5 |
}
|
6 |
add_action( 'compass_in_footer', 'compass_smallprint', 20 ); |
आप यहां देख सकते हैं कि मैंने अपने add_action()
फ़ंक्शन में तीसरा पैरामीटर जोड़ा है, जो प्रायोरिटी है। डिफ़ॉल्ट प्रायोरिटी 10
है, यदि आप इसे खाली छोड़ देते हैं तो यह अप्लाई किया जाएगा। इसलिए क्योंकि मैंने अपने compass_colophon()
फ़ंक्शन के लिए प्रायोरिटी निर्धारित नहीं की है, compass_smallprint()
फ़ंक्शन के लिए 20 सेट करने से यह एक्शन compass_colophon()
फ़ंक्शन के बाद चलती है।
एक्शन से फ़ंक्शन को हटाना
कभी-कभी आप किसी फ़ंक्शन को चलने से रोकना चाहते हैं, और आप इसे ओवरराइड नहीं कर सकते क्योंकि यह प्लग करने योग्य नहीं है। यदि फ़ंक्शन को एक्शन हुक में लगाया गया है, तो आप remove_action()
फ़ंक्शन का उपयोग करके ऐसा कर सकते हैं।
इसलिए यदि मैं अपने compass_smallprint()
फ़ंक्शन को चलने से रोकना चाहता हूं, तो मैं इसे compass_in_footer
एक्शन से अनहुक करता हूं:
1 |
remove_action( 'compass_in_footer', 'compass_smallprint', 20 ); |
remove_action()
फ़ंक्शन में तीन पैरामीटर हैं: एक्शन हुक का नाम, फ़ंक्शन का नाम, और प्रायोरिटी जिसके साथ फ़ंक्शन मूल रूप से एक्शन में लगाया गया था। काम करने के लिए आपको प्रायोरिटी शामिल करनी होगी।
यदि आप उन्हें एक्सेक्यूट करने से रोकना चाहते हैं तो आप किसी भी एक्शन से सभी एक्शन्स को भी प्रिवेंट कर सकते हैं। ऐसा करने पर सावधान रहें, क्योंकि ऐसे फ़ंक्शन हो सकते हैं जिन्हें आप अपनी एक्शन में शामिल होने के बारे में नहीं जानते हैं।
ऐसा करने के लिए, remove_all_actions()
फ़ंक्शन का उपयोग करें:
1 |
remove_all_actions( 'compass_in_footer' ); |
प्रायोरिटी संख्या को दूसरे पैरामीटर के रूप में जोड़ना केवल उन्हीं एक्शन्स को हटा देता है जो आपके द्वारा निर्दिष्ट प्रायोरिटी के साथ उस एक्शन हुक में लगाए गए हैं, जो आपको अधिक नियंत्रण देता है।
फ़िल्टर करने के लिए एक्शन को हुक करना
आपके पास हुक फ़िल्टर करने के लिए अपने एक्शन्स को जोड़ने का विकल्प भी है। जब आप कुछ मौजूदा कोड को बदलना या ओवरराइड करना चाहते हैं तो आप ऐसा करते हैं। जब आप फ़िल्टर हुक बनाते हैं (apply_filters()
फ़ंक्शन का उपयोग करके), आप उस थीम को अपने थीम या प्लगइन में लपेटते हैं, जिसे हुक से जुड़े किसी भी फ़िल्टर द्वारा बदला जाता है।
यह उपयोगी हो सकता है यदि आपके पास थीम या प्लगइन विकल्प हैं जिन्हें आप डिफ़ॉल्ट सेटिंग ओवरराइड करना चाहते हैं, या यदि आप एक पैरेंट थीम बना रहे हैं जिसमें चाइल्ड थीम द्वारा एलिमेंट्स को ओवरराइड किया जा सकता है।
फ़िल्टर हुक बनाना
apply_filters()
फ़ंक्शन में तीन पैरामीटर हैं: फ़िल्टर हुक का नाम, वह वैल्यू जिसे आप फ़िल्टर करना चाहते हैं (यानी डिफ़ॉल्ट वैल्यू), और ऑप्शनल वेरिएबल्स जिन्हें आप फ़िल्टर में लगाए गए फ़ंक्शंस में पास करते हैं।
आप अपनी थीम टेम्पलेट फ़ाइलों में या किसी फ़ंक्शन के अंदर एक फ़िल्टर हुक के माध्यम से एक फ़िल्टर जोड़ सकते हैं। आइए दोनों ऑप्शंस पर नज़र डालें।
मेरे compass_colophon()
फ़ंक्शन पर लौटते हुए, मै इसके कंटेंट को footer.php
apply_filters()
फंक्शन के अंदर जोड़ कर इसे फ़िल्टर में बदलता हूँ जैसे:
1 |
echo apply_filters( 'compass_colophon', ' |
2 |
<section class="colophon" role="contentinfo"> |
3 |
<small class="copyright left"> |
4 |
<?php echo compass_copyright(); ?>
|
5 |
<a href="<?php echo home_url( '/' ) ?>" title="<?php echo esc_attr( get_bloginfo( 'name', 'display' ) ); ?>" rel="home"> |
6 |
<?php bloginfo( 'name' ); ?> |
7 |
</a>
|
8 |
</small><!-- #copyright --> |
9 |
|
10 |
<small class="credits right"> |
11 |
Powered by <a href="http://wordpress.org/">WordPress</a> and designed by <a href="http://compass-design.co.uk">Compass Design</a>. |
12 |
</a>
|
13 |
</small><!-- #credits --> |
14 |
</section><!--#colophon-->' |
15 |
); |
यह उस कोड को आउटपुट करता है जिसे मैंने अपने apply_filters()
फ़ंक्शन के दूसरे पैरामीटर के रूप में सेट किया है।
हालांकि, मैं इसे सीधे अपनी थीम टेम्पलेट फ़ाइल में नहीं जोड़ना पसंद करता हूं, इसलिए मैं उस फ़ंक्शन में फ़िल्टर जोड़ दूंगा जिसे मैं पहले से ही एक्शन हुक के माध्यम से जोड़ रहा हूं।
इसलिए मैं ऊपर दिखाए गए do_action()
फ़ंक्शन का उपयोग करके मेरी footer.php
फ़ाइल में compass_in_footer
एक्शन को जोड़ता हूं, और फिर मैं अपने functions.php
फ़ाइल में एक फ़ंक्शन बनाता हूं जो उस एक्शन से जुड़ा होता है और इसमें एक फ़िल्टर होता है:
1 |
if ( ! function_exists( 'compass_colophon' ) ) { |
2 |
function compass_colophon() { |
3 |
echo apply_filters( 'compass_colophon_filter', ' |
4 |
<section class="colophon" role="contentinfo"> |
5 |
<small class="copyright left"> |
6 |
<?php echo compass_copyright(); ?>
|
7 |
<a href="<?php echo home_url( '/' ) ?>" title="<?php echo esc_attr( get_bloginfo( 'name', 'display' ) ); ?>" rel="home"> |
8 |
<?php bloginfo( 'name' ); ?> |
9 |
</a>
|
10 |
</small><!-- #copyright --> |
11 |
|
12 |
<small class="credits right"> |
13 |
Powered by <a href="http://wordpress.org/">WordPress</a> and designed by <a href="http://compass-design.co.uk">Compass Design</a>. |
14 |
</a>
|
15 |
</small><!-- #credits --> |
16 |
</section><!--#colophon-->' |
17 |
); |
18 |
} |
19 |
add_action( 'compass_in_footer', 'compass_colophon' ); |
इसका मतलब है कि अब मैं डिफ़ॉल्ट कंटेंट को तीन तरीकों में से एक में ओवरराइड कर सकता हूं:
- मेरे चाइल्ड थीम में
compass_colophon()
नामक एक नया फ़ंक्शन बनाकर, जो मेरे पैरेंट थीम में फ़ंक्शन को ओवरराइड करता है क्योंकि यह प्लग करने योग्य है -
compass_in_footer
एक्शन हुक सेcompass_colophon()
फ़ंक्शन को अनचेक करके और एक नया फ़ंक्शन लिखकर जिसे मैं इसके स्थान पर संलग्न करता हूं - एक नया फ़ंक्शन बनाकर जो मैं
compass_colophon_filter
फ़िल्टर हुक को हुक करता हूं, जो मेरेapply_filters()
फ़ंक्शन में वैल्यू को ओवरराइड करता है
वास्तविक जीवन में आपको इन ऑप्शंस को रखने की आवश्यकता नहीं होगी, इसलिए यह अधिक संभावना है कि आप पूरी चीज़ के बजाय अपने फ़ंक्शन में कंटेंट के हिस्से में फ़िल्टर लागू करेंगे।
इसलिए मैं दो फ़िल्टर बना सकता हूं, एक कॉपीराइट सेक्शन के लिए और दूसरा क्रेडिट के लिए:
1 |
if ( ! function_exists( 'compass_colophon' ) ) { |
2 |
function compass_colophon() { |
3 |
|
4 |
echo '<section class="colophon" role="contentinfo">'; |
5 |
|
6 |
echo apply_filters( 'compass_copyright_filter', ' |
7 |
<small class="copyright left"> |
8 |
<?php echo compass_copyright(); ?>
|
9 |
<a href="<?php echo home_url( '/' ) ?>" title="<?php echo esc_attr( get_bloginfo( 'name', 'display' ) ); ?>" rel="home"> |
10 |
<?php bloginfo( 'name' ); ?> |
11 |
</a>
|
12 |
</small><!-- #copyright -->' |
13 |
); |
14 |
|
15 |
echo apply_filters( 'compass_copyright_filter', ' |
16 |
<small class="credits right"> |
17 |
Powered by <a href="http://wordpress.org/">WordPress</a> and designed by <a href="http://compass-design.co.uk">Compass Design</a>. |
18 |
</a>
|
19 |
</small><!-- #credits -->' |
20 |
); |
21 |
echo '</section><!--#colophon-->'; |
22 |
} |
23 |
add_action( 'compass_in_footer', 'compass_colophon' ); |
तो मैं या तो अपने पूरे compass_colophon फ़ंक्शन को अनहुक करके या अपने चाइल्ड थीम में एक नया लिखकर ओवरराइड कर सकता था, या मैं अलग-अलग एलिमेंट्स को ओवरराइड करने के लिए compass_copyright_filter
या compass_credits_filter
फ़िल्टर हुक पर लगाए गए फ़ंक्शन को बना सकता था।
फंक्शन्स को फ़िल्टर में हुक करना
किसी फ़ंक्शन को फ़िल्टर हुक में हुक करने के लिए, आप add_filter()
फ़ंक्शन का उपयोग करते हैं, जिसमें दो पैरामीटर हैं: हुक का नाम और फ़ंक्शन का नाम।
तो क्रेडिट बदलने के लिए, मैं इस फंक्शन को लिखूंगा:
1 |
function new_credits() { ?> |
2 |
<small class="credits right"> |
3 |
Powered by <a href="http://wordpress.org/">WordPress</a> and designed by <a href="http://rachelmccollin.co.uk">Rachel McCollin</a>. |
4 |
</a>
|
5 |
</small><!-- #credits --> |
6 |
<?php } |
7 |
add_filter( 'compass_credits_filter', 'new_credits' ); |
यह मेरे new_credits()
फ़ंक्शन के कंटेंट के साथ मेरे ओरिजिनल compass_credits_filter
फ़िल्टर हुक में वैल्यू सेट को ओवरराइड करता है, लेकिन compass_colophon()
फ़ंक्शन में सब कुछ रखता है।
जब फंक्शन्स को फिल्टर्स में हुक करते हैं तो आप प्रायोरिटी को भी स्पेसिफी कर सकते हैं, बिलकुल उस तरह से जैसे की एक्शन हुक्स में। कम प्रायोरिटी वाले फंक्शन्स को पहले चलाया जाएगा।
फिल्टर्स में कुछ अनहुक फंक्शन्स
एक्शन हुक के साथ, आप फ़िल्टर हुक से फ़ंक्शन भी हटा सकते हैं। आप remove_filter() फ़ंक्शन का उपयोग करके ऐसा करते हैं, जिसमें तीन पैरामीटर होते हैं: फ़िल्टर हुक का नाम, फ़ंक्शन का नाम, और प्रायोरिटी, जो अनिवार्य है यदि फ़ंक्शन को मूल रूप से फ़िल्टर पर लगाया जाए।
तो मेरे new_credits()
फ़ंक्शन को निकालने के लिए, मैं इसका उपयोग करता हूं:
1 |
remove_filter( 'compass_credits_filter', 'new_credits' ); |
कोड आउटपुट तब मेरे ओरिजिनल apply_filters()
फ़ंक्शन में स्पेसिफी वैल्यू को रीटर्न करेगा। तो अगर मैं new_credits()
फ़ंक्शन को हटाना चहुँ और इसके स्थान पर कुछ भी नहीं दिखे, तो मुझे एक नया फ़ंक्शन जोड़ना होगा। मैं फिर पहले फंक्शन को अनहुक करता हूं और अपना नया फ़ंक्शन इस प्रकार हुक करता हूं:
1 |
function no_credits() { |
2 |
return; |
3 |
}
|
4 |
remove_filter( 'compass_credits_filter', 'new_credits' ); |
5 |
add_filter( 'compass_credits_filter', 'no_credits' ); |
सारांश
एक्शन और फ़िल्टर हुक के बीच अंतर को समझना और उनमें से दोनों का प्रभावी ढंग से उपयोग करने में सक्षम होने से आपकी थीम और प्लगइन डेवलपमेंट को बढ़ावा मिलेगा। असल में, कम से कम एक प्रकार के हुक का उपयोग किए बिना, आप प्लगइन्स बिल्कुल नहीं लिख सकते हैं, क्योंकि आपके प्लगइन में कोड एक्टिवेट होने का एकमात्र तरीका एक्शन और फ़िल्टर हुक के माध्यम से जुड़ा हुआ है।
इस गाइड ने आपको दिखाया है कि फ़ंक्शन, एक एक्शन हुक और एक या अधिक फ़िल्टर हुक का उपयोग करके समान फंक्शनलिटी को कैसे जोड़ना है, इस तकनीक के साथ ही फंक्शन्स को हुक्स से हटाने के लिए और सलाह देती है की हर तकनीक कब और उपयोगी है।
साथ ही साथ अपनी खुद के एक्शन और फ़िल्टर हुक बनाने के लिए फ़ंक्शन को हुक करने के लिए, आप उन्हें WordPress द्वारा प्रदान किए गए actions और filters जैसे हुक कर सकते हैं, जैसे wp_head
एक्शन या body_class
फ़िल्टर।