Où est le meilleur endroit pour utiliser add_filter

12

Dois-je utiliser la fonction add_filterDans le initcrochet d'action de mon plugin ou simplement le script de plugin principal?

Puisque parfois j'ai trouvé que les gens utilisaient un filtre partout et si je mettais le initcrochet, il serait trop tard pour certains cas.

Existe-t-il des conseils généraux sur la priorité de action& filterhook pour que nous puissions avoir un style de code plus cohérent?

Yoga
la source

Réponses:

15

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 shutdownuniquement lorsque le premier filtre pour wp_nav_menu_objectsa é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_registeredmaintenant 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-hookpour 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.

fuxia
la source
2
+1. Pour le "style OOP", ma préférence est plutôt de transférer le contrôle à la classe / objet qui enregistre ensuite les actions / filtres dans son constructeur (ou plus tard si approprié). Il offre une meilleure encapsulation (OOP!) Et diffère l'enregistrement des hooks jusqu'à ce que la classe soit utilisée / instanciée.
Webaware