add_filter()
и add_action()
доступны до загрузки любого плагина. Таким образом, вы можете использовать оба в первой строке вашего плагина или темы.
Для удобства чтения я рекомендую группировать действия и фильтровать регистрации в самом верху вашего основного файла:
- в плагине, файл с заголовком плагина
- в теме
functions.php
Есть исключения для этого правила:
- Цепные обратные вызовы . В этом примере я регистрирую действие
shutdown
только тогда, когда wp_nav_menu_objects
был вызван первый фильтр для . Таким образом, второй обратный вызов не может быть зарегистрирован одновременно с первым.
ООП стиль. Иногда вам нужно настроить участников класса, прежде чем вы сможете зарегистрировать обратные вызовы. Используя очень похожий пример ...
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 );
}
Вам не нужно прокручивать вверх, чтобы увидеть, где эти функции вызываются, достаточно одного взгляда на блок документации. Это требует некоторых усилий, потому что вы должны синхронизировать как регистрацию, так и комментарии, но в конечном итоге это экономит драгоценное время.