¿Dónde está el mejor lugar para usar add_filter?


12

¿Debo usar la función add_filterEn el initgancho de acción de mi complemento o solo en el script principal del complemento?

Como a veces descubrí que la gente usa filtros en todo el lugar y si lo initengancho, sería demasiado tarde para algún caso.

¿Hay algún consejo general sobre la precedencia de action& filterhook para que podamos tener un estilo de código más consistente?

Respuestas:


15

add_filter()y add_action()están disponibles antes de cargar cualquier complemento. Por lo tanto, puede usar ambos en la primera línea de su complemento o tema.

Para facilitar la lectura, recomiendo agrupar acciones y filtrar registros en la parte superior de su archivo principal:

  • en un complemento, el archivo con el encabezado del complemento
  • en un tema el functions.php

Hay excepciones para esa regla:

  • Callbacks encadenados . En este ejemplo , registro una acción shutdownsolo cuando wp_nav_menu_objectsse ha llamado al primer filtro . Por lo tanto, la segunda devolución de llamada no se puede registrar al mismo tiempo que la primera.
  • Estilo OOP. A veces tiene que configurar miembros de la clase antes de poder registrar las devoluciones de llamada. Usando un ejemplo muy similar ...

    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 la instanciación de la clase puede ser detenida por otro complemento, y una clase secundaria podría registrar más o diferentes filtros y acciones.

Además de la agrupación, puede ir un paso más allá y ofrecer una acción personalizada para facilitar las personalizaciones para otros desarrolladores.
Aquí hay un ejemplo de un tema en el que estoy trabajando:

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 última línea es importante: un tema secundario o un complemento puede conectarse a la acción t5_theme_hooks_registeredahora y anular el registro de cualquier enlace anterior. Eso ahorrará la lucha con las prioridades , y soy libre de cambiar mis prioridades de devolución de llamada en cualquier momento.

Pero no confíe solo en el orden del código fuente. Documente los ganchos que está utilizando en su bloque de documentos. Estoy usando una etiqueta personalizada wp-hookpara eso. Aquí hay un ejemplo con ganchos encadenados del mismo 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 );
}

No tiene que desplazarse hacia arriba para ver dónde se llaman estas funciones, basta con mirar el bloque de documentos. Esto requiere algunos esfuerzos, ya que debe mantenerse sincronizado, el registro y el comentario, pero a la larga ahorra un tiempo valioso.


2
+1. Para el "estilo OOP", mi preferencia es entregar el control a la clase / objeto que luego registra acciones / filtros en su constructor (o posterior, si corresponde). Proporciona una mejor encapsulación (¡OOP!) Y difiere el registro de los ganchos hasta que se utiliza / instancia la clase.
webaware
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.