add_filter()
e add_action()
estão disponíveis antes de qualquer plug-in ser carregado. Então você pode usar os dois na primeira linha do seu plugin ou tema.
Para facilitar a leitura, recomendo agrupar ações e filtrar registros no topo de seu arquivo principal:
- em um plug-in, o arquivo com o cabeçalho do plug-in
- em um tema, o
functions.php
Existem exceções para essa regra:
-
Retornos de chamada encadeados . Em este exemplo I registre uma ação para
shutdown
somente quando o primeiro filtro parawp_nav_menu_objects
tiver sido chamado. Portanto, o segundo retorno de chamada não pode ser registrado ao mesmo tempo que o primeiro. -
estilo OOP. Às vezes, você precisa configurar os alunos antes de registrar os retornos de chamada. Usando um exemplo muito semelhante …
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 } }
… vemos que a instanciação da classe pode ser interrompida por outro plug-in e uma classe filha pode registrar mais ou diferentes filtros e ações.
Além de agrupar, você pode ir além e oferecer uma ação personalizada para facilitar as personalizações de outros desenvolvedores.
Aqui está um exemplo de um tema em que estou trabalhando:
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' );
A última linha é importante: um tema filho ou um plug-in pode conectar-se à ação t5_theme_hooks_registered
e cancelar o registro de qualquer gancho anterior. Isso salvará lutando com as prioridades , e eu estou livre para mudar meu Prioridades de retorno de chamada a qualquer momento.
Mas não confie apenas na ordem do código-fonte. Documente os ganchos que você está usando no seu bloco doc. Eu estou usando uma tag personalizada wp-hook
para isso. Aqui está um exemplo com ganchos encadeados do mesmo tema:
/**
* 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).*</>~ms', '', $content );
}
Você não precisa rolar para cima para ver onde essas funções são chamadas, basta olhar para o bloco de documentos. Isso requer alguns esforços, porque você precisa manter ambos em sincronia, o registro e o comentário, mas no longo prazo economiza um tempo valioso.