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
shutdown
solo cuando wp_nav_menu_objects
se 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_registered
ahora 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-hook
para 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.