WordPress funciona con Hooks (Acciones y Filtros). A veces, cosas inesperadas suceden: el contenido desaparece, los títulos cambian, los estilos se rompen. Sospecha que un plugin esta interfiriendo, pero cual?
Conozca más sobre el desarrollo profesional de WordPress en WPPoland.
Necesita saber exactamente que funciones estan adjuntas a un hook específico (ej. the_content o wp_head).
La forma más rápida de depurar eso es inspeccionar $wp_filter, listar callbacks por prioridad y rastrear si cada callback proviene del core, un plugin o el tema activo.
El sistema de hooks de WordPress: Entendiendo la base
El sistema de hooks de WordPress es lo que lo hace extensible. Cada función importante en WordPress dispara hooks, permitiendo que plugins y temas modifiquen el comportamiento sin editar archivos del core.
Dos tipos de hooks:
- Acciones: Hacen algo en un punto específico (ej.
wp_head,the_content) - Filtros: Modifican datos antes de que se usen (ej.
the_title,the_content)
Al depurar, necesita ver:
- Que funciones estan enganchadas
- Sus prioridades (orden de ejecucion)
- Que plugin/tema las agrego
- Los nombres de las funciones callback
El snippet de depuracion completo
Agregue esta función mejorada a su functions.php o usela en un plugin Must-Use durante el desarrollo:
/**
* Inspeccionar hooks de WordPress con información detallada
*
* @param string $hook_name El hook a inspeccionar (ej. 'the_content', 'wp_head')
* @param bool $show_details Mostrar detalles completos del callback
* @return void
*/
function wppoland_inspect_hook( $hook_name, $show_details = false ) {
global $wp_filter;
if ( ! isset( $wp_filter[ $hook_name ] ) ) {
echo '<div style="background:#fff3cd; border:2px solid #ffc107; padding:15px; margin:20px 0;">';
echo "<strong>El hook '$hook_name' no tiene funciones adjuntas.</strong>";
echo '</div>';
return;
}
$hook_data = $wp_filter[ $hook_name ];
echo '<div style="background:#fff; border:2px solid #dc3545; padding:20px; margin:20px 0; font-family:monospace; font-size:12px; max-width:100%; overflow-x:auto;">';
echo "<h2 style='margin-top:0; color:#dc3545;'>Depurando Hook: <code>$hook_name</code></h2>";
// Ordenar por prioridad
ksort( $hook_data->callbacks );
echo '<table style="width:100%; border-collapse:collapse;">';
echo '<thead><tr style="background:#f8f9fa;"><th style="padding:8px; text-align:left; border:1px solid #dee2e6;">Prioridad</th><th style="padding:8px; text-align:left; border:1px solid #dee2e6;">Funcion</th><th style="padding:8px; text-align:left; border:1px solid #dee2e6;">Fuente</th></tr></thead>';
echo '<tbody>';
foreach ( $hook_data->callbacks as $priority => $callbacks ) {
foreach ( $callbacks as $callback ) {
$function_name = 'Desconocido';
$source_file = 'Desconocido';
if ( is_string( $callback['function'] ) ) {
$function_name = $callback['function'];
if ( function_exists( $function_name ) ) {
$reflection = new ReflectionFunction( $function_name );
$source_file = $reflection->getFileName() . ':' . $reflection->getStartLine();
}
} elseif ( is_array( $callback['function'] ) ) {
if ( is_object( $callback['function'][0] ) ) {
$function_name = get_class( $callback['function'][0] ) . '::' . $callback['function'][1];
} else {
$function_name = $callback['function'][0] . '::' . $callback['function'][1];
}
try {
$reflection = new ReflectionMethod( $callback['function'][0], $callback['function'][1] );
$source_file = $reflection->getFileName() . ':' . $reflection->getStartLine();
} catch ( ReflectionException $e ) {
$source_file = 'No se pudo determinar';
}
} elseif ( is_object( $callback['function'] ) ) {
$function_name = 'Closure';
$reflection = new ReflectionFunction( $callback['function'] );
$source_file = $reflection->getFileName() . ':' . $reflection->getStartLine();
}
// Detectar plugin/tema
$source_type = 'Core';
if ( strpos( $source_file, 'wp-content/plugins' ) !== false ) {
$source_type = 'Plugin';
} elseif ( strpos( $source_file, 'wp-content/themes' ) !== false ) {
$source_type = 'Tema';
}
echo '<tr style="border-bottom:1px solid #dee2e6;">';
echo '<td style="padding:8px; border:1px solid #dee2e6;"><strong>' . esc_html( $priority ) . '</strong></td>';
echo '<td style="padding:8px; border:1px solid #dee2e6;"><code>' . esc_html( $function_name ) . '</code></td>';
echo '<td style="padding:8px; border:1px solid #dee2e6;"><span>' . esc_html( $source_type ) . '</span></td>';
echo '</tr>';
}
}
echo '</tbody></table>';
echo '</div>';
}
// Ejemplos de uso:
// add_action( 'wp_footer', function(){ wppoland_inspect_hook('the_content'); } );
// add_action( 'wp_footer', function(){ wppoland_inspect_hook('wp_head', true); } );
Como usar la función de depuracion
Uso básico
Agregue esto temporalmente a su functions.php:
// Inspeccionar el hook the_content
add_action( 'wp_footer', function() {
if ( current_user_can( 'manage_options' ) ) { // Solo para admins
wppoland_inspect_hook( 'the_content' );
}
} );
Visite cualquier página y desplacese al footer. Vera una tabla detallada mostrando todas las funciones enganchadas a the_content.
Inspeccionar multiples hooks
add_action( 'wp_footer', function() {
if ( ! current_user_can( 'manage_options' ) ) return;
$hooks_a_verificar = array( 'the_content', 'wp_head', 'the_title', 'excerpt_length' );
foreach ( $hooks_a_verificar as $hook ) {
wppoland_inspect_hook( $hook );
}
} );
Entendiendo la salida
Columna de prioridad
WordPress ejecuta hooks en orden de prioridad (números menores primero). La prioridad predeterminada es 10.
Prioridades comunes:
1-9: Ejecucion temprana (antes del predeterminado)10: Prioridad predeterminada11-99: Ejecucion tardia (despues del predeterminado)999: Muy tardia (casí última)
Escenarios comunes de depuracion
Escenario 1: El contenido desaparece
wppoland_inspect_hook( 'the_content' );
Busque funciones que retornen cadenas vacias o tengan prioridad alta.
Escenario 2: Títulos cambian inesperadamente
wppoland_inspect_hook( 'the_title' );
Busque plugins SEO o de traduccion que modifiquen títulos.
Escenario 3: Estilos se rompen
wppoland_inspect_hook( 'wp_enqueue_scripts' );
Busque plugins que eliminen hojas de estilo o conflictos de prioridad.
Alternativa moderna: Plugin Query Monitor
En 2026, la mejor forma de depurar hooks es usando el plugin Query Monitor de John Blackbourn.
Por que Query Monitor?
- Interfaz visual: Tabla limpia y buscable
- Rutas de archivos: Muestra ubicaciones exactas
- Nombres de componentes: Identifica plugins/temas
- Datos de rendimiento: Muestra tiempo de ejecucion por hook
- Sin código requerido: Depuracion basada en GUI
Instalación
## Via WP-CLI
wp plugin install query-monitor --activate
Mejores prácticas para depuracion de hooks
1. Solo depure en desarrollo
Nunca deje código de depuracion en producción:
if ( defined( 'WP_DEBUG' ) && WP_DEBUG ) {
add_action( 'wp_footer', function() {
wppoland_inspect_hook( 'the_content' );
} );
}
2. Restrinja a administradores
Siempre verifique capacidades del usuario:
if ( current_user_can( 'manage_options' ) ) {
// Mostrar info de depuracion
}
3. Use nombres descriptivos de hooks
Al crear hooks personalizados, use prefijos:
// Correcto
do_action( 'wppoland_before_content' );
// Incorrecto
do_action( 'before_content' );
Resumen
La depuracion de hooks de WordPress es esencial para entender conflictos de plugins y problemas de temas:
- Use
$wp_filterglobal para inspeccionar hooks - Query Monitor es la mejor solución GUI para 2026
- Siempre restrinja la depuracion a desarrollo/usuarios administradores
- Entienda las prioridades para resolver problemas de orden de ejecucion
- Documente sus hooks personalizados para mantenibilidad
Ya sea que use el snippet personalizado o Query Monitor, entender los hooks de WordPress es crucial para el desarrollo profesional de WordPress en 2026.
Conozca más sobre los servicios de desarrollo WordPress y la auditoria de seguridad WordPress en WPPoland.

