add_filter()
et add_action()
sont disponibles avant le chargement de tout plugin. Vous pouvez donc utiliser les deux dans la première ligne de votre plugin ou thème.
Pour plus de lisibilité, je recommande de regrouper les enregistrements d'action et de filtre tout en haut de votre fichier principal:
- dans un plugin, le fichier avec l'en-tête du plugin
- dans un thème le
functions.php
Il existe des exceptions pour cette règle:
- Rappels chaînés . Dans cet exemple, j'enregistre une action pour
shutdown
uniquement lorsque le premier filtre pour wp_nav_menu_objects
a été appelé. Le deuxième rappel ne peut donc pas être enregistré en même temps que le premier.
Style OOP. Parfois, vous devez configurer des membres de la classe avant de pouvoir enregistrer les rappels. En utilisant un exemple très similaire …
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
}
}
… Nous voyons que l'instanciation de la classe peut être arrêtée par un autre plugin, et une classe enfant pourrait enregistrer plus ou différents filtres et actions.
En plus du regroupement, vous pouvez aller plus loin et proposer une action personnalisée pour faciliter les personnalisations pour les autres développeurs.
Voici un exemple d'un thème sur lequel je travaille:
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' );
La dernière ligne est importante: un thème enfant ou un plugin peut s'accrocher à l'action t5_theme_hooks_registered
maintenant et désinscrire tout hook précédent. Cela évitera de me battre avec les priorités et je suis libre de modifier mes priorités de rappel à tout moment.
Mais ne vous fiez pas uniquement à l'ordre du code source. Documentez les crochets que vous utilisez dans votre bloc doc. J'utilise une balise personnalisée wp-hook
pour cela. Voici un exemple avec des crochets chaînés du même thème:
/**
* 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 );
}
Vous n'avez pas à faire défiler vers le haut pour voir où ces fonctions sont appelées, un coup d'œil au bloc doc suffit. Cela nécessite quelques efforts, car vous devez garder à la fois la synchronisation, l'enregistrement et le commentaire, mais à long terme, cela fait gagner un temps précieux.