Add_filter का उपयोग करने के लिए सबसे अच्छी जगह कहां है


12

क्या मुझे फ़ंक्शन का उपयोग करना चाहिए add_filterमेरे प्लगइन initएक्शन हुक में या मुख्य प्लगइन स्क्रिप्ट में बस?

चूंकि कभी-कभी मैंने पाया कि लोग सभी जगह फिल्टर का उपयोग कर रहे हैं और अगर मैं initहुक में डालूंगा , तो कुछ मामले के लिए बहुत देर हो जाएगी।

क्या action& filterहुक की पूर्वता पर कोई सामान्य सलाह दी गई है ताकि हमारे पास अधिक सुसंगत कोड शैली हो सके?

जवाबों:


15

add_filter()और add_action()किसी भी प्लगइन को लोड करने से पहले उपलब्ध हैं। तो आप अपने प्लगइन या विषय की पहली पंक्ति में दोनों का उपयोग कर सकते हैं।

पठनीयता के लिए मैं आपकी मुख्य फ़ाइल के शीर्ष पर समूह कार्रवाई और फ़िल्टर पंजीकरण की सिफारिश करता हूं:

  • एक प्लगइन में, प्लगइन हेडर के साथ फाइल
  • एक विषय में functions.php

उस नियम के कुछ अपवाद हैं:

  • जंजीर की पुकार । में इस उदाहरण मैं के लिए एक कार्य रजिस्टर shutdownतभी होता है जब के लिए पहला फिल्टर wp_nav_menu_objectsबुलाया गया है। इसलिए दूसरा कॉलबैक पहले वाले के समान पंजीकृत नहीं किया जा सकता है।
  • OOP शैली। कभी-कभी आपको कॉलबैक रजिस्टर करने से पहले कक्षा सदस्यों को सेट करना होगा। इसी तरह के एक उदाहरण का उपयोग कर ...

    add_action(
        'plugins_loaded',
        array ( T5_Plugin_Class_Demo::get_instance(), 'plugin_setup' )
    );
    class T5_Plugin_Class_Demo
    {
        public function plugin_setup()
        {
            $this->plugin_url    = plugins_url( '/', __FILE__ );
            $this->plugin_path   = plugin_dir_path( __FILE__ );
            $this->load_language( 'plugin_unique_name' );
    
            // more stuff: register actions and filters
        }
    }

    … हम देखते हैं कि कक्षा की तात्कालिकता को अन्य प्लगइन द्वारा रोका जा सकता है, और एक बच्चा वर्ग अधिक या विभिन्न फिल्टर और कार्यों को पंजीकृत कर सकता है।

समूहीकरण के अलावा आप एक कदम आगे जा सकते हैं और अन्य डेवलपर्स के लिए अनुकूलन को आसान बनाने के लिए एक कस्टम कार्रवाई की पेशकश कर सकते हैं।
यहाँ एक विषय पर एक उदाहरण दिया गया है जिस पर मैं काम कर रहा हूँ:

add_action( 'activate_header',      't5_activate_screen' );
// wp_loaded is too late, WP customizer would not detect the features then.
add_action( 'after_setup_theme',    't5_setup_custom_background' );
add_action( 'after_setup_theme',    't5_setup_custom_header' );
add_filter( 'body_class',           't5_enhance_body_class' );
add_action( 'comment_form_before',  't5_enqueue_comment_reply' );
add_action( 'content_before',       't5_frontpage_widget' );
add_action( 'footer_before',        't5_loop_navigation' );
add_action( 'get_the_excerpt',      't5_excerpt_clean_up', 1 );
add_action( 'header_before',        't5_skiplink', 0, 0 );
add_filter( 'the_title',            't5_fill_empty_title', 20, 1 );
add_action( 'wp_enqueue_scripts',   't5_enqueue_style' );
add_action( 'wp_enqueue_scripts',   't5_enqueue_script' );
add_action( 'wp_loaded',            't5_setup' );
add_action( 'wp_loaded',            't5_page_enhancements' );
add_action( 'wp_loaded',            't5_post_format_support' );
add_action( 'wp_loaded',            't5_load_theme_language' );
add_action( 'wp_loaded',            't5_setup_sidebars' );
add_filter( 'wp_nav_menu_items',    't5_customize_top_menu', 10, 2 );
add_filter( 'wp_nav_menu_args',     't5_nav_menu_args', 10, 1 );
add_filter( 'wp_title',             't5_wp_title_filter', 20, 2 );

add_shortcode( 'gallery',    't5_shortcode_gallery' );
add_shortcode( 'wp_caption', 't5_shortcode_img_caption' );
add_shortcode( 'caption',    't5_shortcode_img_caption' );

// Use this action to unregister theme actions and filters.
do_action( 't5_theme_hooks_registered' );

अंतिम पंक्ति महत्वपूर्ण है: एक बच्चा विषय या एक प्लगइन t5_theme_hooks_registeredअब कार्रवाई में हुक कर सकता है और किसी भी पिछले हुक को अपंजीकृत कर सकता है। यह प्राथमिकताओं के साथ संघर्ष करने से बचाएगा , और मैं किसी भी समय अपनी कॉलबैक प्राथमिकताओं को बदलने के लिए स्वतंत्र हूं

लेकिन अकेले सोर्स कोड ऑर्डर पर निर्भर न रहें। अपने डॉक्स ब्लॉक में आपके द्वारा उपयोग किए जा रहे हुक का दस्तावेज़। मैं उसके wp-hookलिए एक कस्टम टैग का उपयोग कर रहा हूं । यहाँ एक ही विषय से जंजीर हुक के साथ एक उदाहरण है:

/**
 * Register handler for auto-generated excerpt.
 *
 * @wp-hook get_the_excerpt
 * @param   string $excerpt
 * @return  string
 */
function t5_excerpt_clean_up( $excerpt )
{
    if ( ! empty ( $excerpt ) )
        return $excerpt;

    add_filter( 'the_content', 't5_excerpt_content' );

    return $excerpt;
}
/**
 * Strip parts from auto-generated excerpt.
 *
 * @wp-hook the_content
 * @param   string $content
 * @return  string
 */
function t5_excerpt_content( $content )
{
    remove_filter( current_filter(), __FUNCTION__ );

    return preg_replace( '~<(pre|table).*</\1>~ms', '', $content );
}

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


2
+1। "ओओपी शैली" के लिए, मेरी प्राथमिकता इसके बजाय उस वर्ग / वस्तु पर नियंत्रण को सौंपना है जो इसके निर्माता (या बाद में यदि उपयुक्त हो) में कार्रवाई / फिल्टर का पंजीकरण करता है। यह बेहतर (OOP!) एनकैप्सुलेशन प्रदान करता है, और जब तक क्लास का उपयोग / त्वरित नहीं किया जाता है, तब तक हुक के डिफरेक्टर का बचाव किया जाता है।
वेबवार्ता
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.