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 );
}
Не потрібно прокручувати вгору, щоб побачити, куди викликаються ці функції, достатньо одного погляду на doc-блок. Це вимагає певних зусиль, тому що вам доведеться тримати як синхронізацію, реєстрацію та коментар, але в перспективі це економить цінний час.