สถานที่ที่ดีที่สุดในการใช้ 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ขณะนี้และยกเลิกการลงทะเบียน hook ก่อนหน้านี้ นั่นจะช่วยประหยัดการดิ้นรนกับลำดับความสำคัญและฉันมีอิสระในการเปลี่ยนลำดับความสำคัญของการโทรกลับเมื่อใดก็ได้

แต่ไม่ต้องพึ่งพาการสั่งซื้อซอร์สโค้ดเพียงอย่างเดียว จัดทำเอกสาร hooks ที่คุณใช้ในเอกสาร doc ของคุณ ฉันกำลังใช้แท็กที่กำหนดเองwp-hookสำหรับสิ่งนั้น นี่คือตัวอย่างของ hooks ที่ถูกล่ามโซ่จากธีมเดียวกัน:

/**
 * 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 );
}

คุณไม่ต้องเลื่อนขึ้นเพื่อดูว่ามีการเรียกใช้ฟังก์ชันเหล่านี้จากที่ใดดูที่บล็อก doc ก็เพียงพอแล้ว สิ่งนี้ต้องใช้ความพยายามบางอย่างเนื่องจากคุณต้องซิงค์ทั้งสองอย่างการลงทะเบียนและความคิดเห็น แต่ในระยะยาวมันจะช่วยประหยัดเวลาอันมีค่า


2
+1 สำหรับ "สไตล์ OOP" การตั้งค่าของฉันแทนคือมอบการควบคุมคลาส / วัตถุซึ่งลงทะเบียนการกระทำ / ตัวกรองในตัวสร้างของมัน (หรือใหม่กว่าหากเหมาะสม) มันให้ encapsulation (OOP!) ที่ดีขึ้นและเลื่อนการลงทะเบียน hooks จนกว่าคลาสจะถูกใช้ / อินสแตนซ์
webaware
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.