add_filter()
và 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
shutdown
chỉ 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_registered
ngay 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-hook
cho đ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á.