Đâu là nơi tốt nhất để sử dụng add_filter


12

Tôi có nên sử dụng chức năng add_filterTrong inithook hành động của plugin hay chỉ trong tập lệnh plugin chính?

Vì đôi khi tôi thấy mọi người đang sử dụng bộ lọc ở khắp mọi nơi và nếu tôi đặt vào initmóc, thì sẽ quá muộn cho một số trường hợp.

Có lời khuyên chung nào về quyền ưu tiên của action& filterhook để chúng ta có thể có một kiểu mã phù hợp hơn không?

Câu trả lời:


15

add_filter()add_action()có sẵn trước khi bất kỳ plugin nào được tải. Vì vậy, bạn có thể sử dụng cả trong dòng đầu tiên của plugin hoặc chủ đề của mình.

Để dễ đọc, tôi khuyên bạn nên nhóm hành động và đăng ký bộ lọc ở đầu tệp chính của bạn:

  • trong một plugin, tệp có tiêu đề plugin
  • trong một chủ đề functions.php

Có những ngoại lệ cho quy tắc đó:

  • Cuộc gọi lại bị xích . Trong ví dụ này, tôi đăng ký một hành động shutdownchỉ khi bộ lọc đầu tiên wp_nav_menu_objectsđược gọi. Vì vậy, cuộc gọi lại thứ hai không thể được đăng ký cùng lúc với cuộc gọi đầu tiên.
  • Phong cách OOP. Đôi khi bạn phải thiết lập các thành viên lớp trước khi bạn có thể đăng ký các cuộc gọi lại. Sử dụng một ví dụ rất giống ...

    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
        }
    }

    Chúng tôi thấy việc khởi tạo lớp có thể bị chặn bởi một plugin khác và một lớp con có thể đăng ký nhiều bộ lọc và hành động khác nhau.

Ngoài việc nhóm, bạn có thể tiến thêm một bước và đưa ra một hành động tùy chỉnh để thực hiện các tùy chỉnh cho các nhà phát triển khác dễ dàng hơn.
Đây là một ví dụ từ một chủ đề tôi đang làm việc:

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' );

Dòng cuối cùng rất quan trọng: Một chủ đề con hoặc một plugin có thể nối vào hành động t5_theme_hooks_registeredngay bây giờ và hủy đăng ký bất kỳ hook nào trước đó. Điều đó sẽ tiết kiệm vật lộn với các ưu tiên và tôi có thể tự do thay đổi các ưu tiên gọi lại của mình bất cứ lúc nào.

Nhưng không chỉ dựa vào thứ tự mã nguồn. Tài liệu về các hook bạn đang sử dụng trong khối doc của bạn. Tôi đang sử dụng một thẻ tùy chỉnh wp-hookcho điều đó. Dưới đây là một ví dụ với các móc xích từ cùng một chủ đề:

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

Bạn không cần phải cuộn lên để xem các hàm này được gọi ở đâu, chỉ cần nhìn vào khối tài liệu là đủ. Điều này đòi hỏi một số nỗ lực, bởi vì bạn phải giữ cả hai đồng bộ, đăng ký và nhận xét, nhưng về lâu dài sẽ tiết kiệm thời gian quý giá.


2
+1. Đối với "kiểu OOP", thay vào đó, ưu tiên của tôi là trao quyền điều khiển cho lớp / đối tượng, sau đó đăng ký các hành động / bộ lọc trong hàm tạo của nó (hoặc sau này nếu thích hợp). Nó cung cấp đóng gói (OOP!) Tốt hơn và trì hoãn đăng ký hook cho đến khi lớp được sử dụng / khởi tạo.
web biết
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.