Dove è il posto migliore per utilizzare add_filter


12

Dovrei usare la funzione add_filternel initgancio di azione del mio plugin o solo nello script del plugin principale?

Dal momento che a volte ho scoperto che la gente sta usando il filtro dappertutto e se metto il initgancio, sarebbe troppo tardi per qualche caso.

Ci sono consigli generali sulla precedenza di action& filterhook in modo che possiamo avere uno stile di codice più coerente?

Risposte:


15

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 shutdownsolo 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_registerede 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-hookper 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.


2
+1. Per "stile OOP", la mia preferenza è invece di passare il controllo alla classe / oggetto che quindi registra le azioni / i filtri nel suo costruttore (o successivamente se appropriato). Fornisce una migliore incapsulamento (OOP!) E difende la registrazione degli hook finché la classe non viene utilizzata / istanziata.
webaware,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.