Onde é o melhor lugar para usar add_filter

12

Devo usar a função add_filterNo initgancho de ação do meu plug-in ou apenas no script principal do plug-in?

Como algumas vezes eu encontrei pessoas usando filtro em todos os lugares, e se eu colocasse o initgancho, seria tarde demais para alguns casos.

Existe algum conselho geral sobre a precedência do action& filterhook para que possamos ter um estilo de código mais consistente?

Ioga
fonte

Respostas:

15

add_filter()e add_action()estão disponíveis antes que qualquer plug-in seja carregado. Então você pode usar ambos na primeira linha do seu plugin ou tema.

Para facilitar a leitura, recomendo agrupar ações e filtrar registros na parte superior do arquivo principal:

  • em um plug-in, o arquivo com o cabeçalho do plug-in
  • em um tema a functions.php

Há exceções para essa regra:

  • Retornos de chamada em cadeia . Em este exemplo I registar uma ação para shutdownapenas quando o primeiro filtro para wp_nav_menu_objectster sido chamado. Portanto, o segundo retorno de chamada não pode ser registrado ao mesmo tempo que o primeiro.
  • Estilo OOP. Às vezes, é necessário configurar os alunos antes de registrar os retornos de chamada. Usando um exemplo muito semelhante

    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
        }
    }
    

    … Vemos que a instanciação da classe pode ser interrompida por outro plug-in, e uma classe filho pode registrar mais ou diferentes filtros e ações.

Além do agrupamento, você pode ir além e oferecer uma ação personalizada para facilitar as personalizações para outros desenvolvedores.
Aqui está um exemplo de um tema em que estou trabalhando:

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' );

A última linha é importante: um tema filho ou um plug-in pode se conectar à ação t5_theme_hooks_registeredagora e cancelar o registro de qualquer gancho anterior. Isso economizará dificuldades com as prioridades , e estou livre para alterar minhas prioridades de retorno de chamada a qualquer momento.

Mas não confie apenas na ordem do código-fonte. Documente os ganchos que você está usando no seu bloco de documentos. Estou usando uma tag personalizada wp-hookpara isso. Aqui está um exemplo com ganchos encadeados do mesmo 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 );
}

Você não precisa rolar para cima para ver onde essas funções são chamadas; basta olhar para o bloco de documentos. Isso requer alguns esforços, porque você precisa manter a sincronização, o registro e o comentário, mas, a longo prazo, economiza um tempo valioso.

fuxia
fonte
2
+1. Para "estilo OOP", minha preferência é entregar o controle para a classe / objeto que, em seguida, registra ações / filtros em seu construtor (ou mais tarde, se apropriado). Ele fornece um melhor encapsulamento (OOP!) E adia o registro de ganchos até que a classe seja utilizada / instanciada.
Webaware