add_filter()
e add_action()
sono disponibili prima del caricamento di qualsiasi plug-in. Quindi puoi usare entrambi nella prima riga del tuo plugin o tema.
Per leggibilità, consiglio di raggruppare le azioni e filtrare le registrazioni nella parte superiore del file principale:
- in un plugin, il file con l'intestazione del plugin
- in un tema il
functions.php
Ci sono eccezioni per quella regola:
- Richiamate concatenate . In questo esempio, registro un'azione
shutdown
solo quando wp_nav_menu_objects
è stato chiamato il primo filtro per . Pertanto, il secondo callback non può essere registrato contemporaneamente al primo.
Stile OOP. A volte è necessario impostare i membri della classe prima di poter registrare i callback. Utilizzando un esempio molto simile ...
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
}
}
... vediamo che l'istanza della classe può essere fermata da un altro plugin e una classe figlio potrebbe registrare più o diversi filtri e azioni.
Oltre al raggruppamento puoi fare un ulteriore passo avanti e offrire un'azione personalizzata per facilitare le personalizzazioni per altri sviluppatori.
Ecco un esempio di un tema su cui sto lavorando:
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' );
L'ultima riga è importante: un tema figlio o un plug-in possono ora collegarsi all'azione t5_theme_hooks_registered
e annullare la registrazione di qualsiasi hook precedente. Ciò salverà la lotta con le priorità e sono libero di modificare le mie priorità di richiamata in qualsiasi momento.
Ma non fare affidamento solo sull'ordine del codice sorgente. Documenta gli hook che stai usando nel tuo blocco di documenti. Sto usando un tag personalizzato wp-hook
per questo. Ecco un esempio con ganci incatenati dello stesso 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).*</\1>~ms', '', $content );
}
Non è necessario scorrere verso l'alto per vedere dove vengono chiamate queste funzioni, basta uno sguardo al blocco doc. Ciò richiede alcuni sforzi, poiché è necessario mantenere sincronizzati, la registrazione e il commento, ma a lungo termine consente di risparmiare tempo prezioso.