web-dev-qa-db-fra.com

Où est le meilleur endroit pour utiliser add_filter

Devrais-je utiliser la fonction add_filter dans le hook d’action init de mon plugin ou juste dans le script du plugin principal?

Étant donné que, parfois, j'ai trouvé des personnes qui utilisaient des filtres partout et que si je mettais le crochet init, ce serait trop tard pour certains cas.

Existe-t-il un conseil général sur la précédence de hook action & filter afin d'avoir un style de code plus cohérent?

10
Yoga

add_filter() et add_action() sont disponibles avant le chargement d’un plug-in. Vous pouvez donc utiliser les deux dans la première ligne de votre plugin ou thème.

Pour des raisons de lisibilité, je vous recommande de regrouper les actions et de filtrer les enregistrements 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 y a des exceptions pour cette règle:

  • Rappels chaînés . Dans cet exemple je n'enregistre une action pour shutdown que lorsque le premier filtre pour wp_nav_menu_objects a été appelé. Donc, le deuxième rappel ne peut pas être enregistré en même temps que le premier.
  • Style de POO. Parfois, vous devez configurer les membres du groupe 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 stoppée par un autre plugin, et une classe enfant pourrait enregistrer plus de filtres ou actions ou des actions différentes.

En plus du regroupement, vous pouvez aller plus loin et proposer une action personnalisée pour faciliter la personnalisation pour les autres développeurs.
Voici un exemple tiré 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 se connecter à l’action t5_theme_hooks_registered maintenant et désenregistrer tout raccordement précédent. Cela épargnera aux prises avec des priorités , et je suis libre de changer les priorités my à tout moment.

Mais ne comptez pas uniquement sur l'ordre du code source. Documentez les crochets que vous utilisez dans votre bloc de documentation. 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 );
}

Il n’est pas nécessaire de faire défiler vers le haut pour voir où ces fonctions sont appelées, il suffit de regarder le bloc de documentation. Cela nécessite quelques efforts, car vous devez synchroniser l'enregistrement et le commentaire, mais à long terme, vous gagnerez un temps précieux.

12
fuxia