Use la variable global $wp_filter para inspeccionar hooks de WordPress, prioridades y fuentes de callbacks al depurar acciones y filtros.
ES

Como listar todas las funciones enganchadas en WordPress

5.00 /5 - (30 votes )
Última verificación: 1 de mayo de 2026
6min de lectura
Guía
Desarrollador full-stack

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:

  1. Acciones: Hacen algo en un punto específico (ej. wp_head, the_content)
  2. 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 predeterminada
  • 11-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?

  1. Interfaz visual: Tabla limpia y buscable
  2. Rutas de archivos: Muestra ubicaciones exactas
  3. Nombres de componentes: Identifica plugins/temas
  4. Datos de rendimiento: Muestra tiempo de ejecucion por hook
  5. 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_filter global 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.

Siguiente paso

Transforma el artículo en una implementación real

Este bloque refuerza el enlazado interno y lleva al lector al siguiente paso más útil dentro de la arquitectura del sitio.

¿Quieres implementar esto en tu sitio?

Si quieres transformar el artículo en mejoras concretas, rediseño o un plan de implementación, puedo cerrar el alcance y ejecutar.

Cluster relacionado

Explora otros servicios WordPress y base de conocimiento

Refuerza tu negocio con soporte técnico profesional en áreas clave del ecosistema WordPress.

FAQ del artículo

Preguntas Frecuentes

Respuestas prácticas para aplicar el tema en la ejecución real.

SEO-ready GEO-ready AEO-ready 3 Q&A
Como se inspeccionan los callbacks adjuntos a un hook de WordPress?
La ruta habitual es verificar la estructura global $wp_filter y listar callbacks junto con sus prioridades, luego usar reflection cuando necesite detalles de archivo y linea.
Por que las funciones anonimás son más dificiles de depurar?
Porque los closures no exponen un nombre de función simple, por lo que a menudo necesita reflection o inspeccion más profunda para encontrar su fuente.
Que ayuda más al rastrear un hook roto?
Conocer el nombre del hook, la prioridad del callback, el archivo fuente y si el callback proviene del tema, del core de WordPress o de un plugin.

¿Necesitas un FAQ adaptado a tu sector y mercado? Preparamos una versión alineada con tus objetivos de negocio.

Hablemos

Artículos Relacionados

Deja de escribir sentencias if desordenadas. Aprende la diferencia entre in_category y has_term, como manejar categorías hijas recursivas eficientemente y optimizar tus etiquetas condicionales.
development

Lógica condicional de WordPress para taxonomías

Deja de escribir sentencias if desordenadas. Aprende la diferencia entre in_category y has_term, como manejar categorías hijas recursivas eficientemente y optimizar tus etiquetas condicionales.

Notas prácticas sobre WP_Query: cuándo get_posts gana a new WP_Query, por qué meta_query sobre claves no indexadas colapsa a escala, y cómo paginar loops personalizados sin caer en 404.
development

Una guía práctica de WP_Query y el Loop (edición de rendimiento 2026)

Notas prácticas sobre WP_Query: cuándo get_posts gana a new WP_Query, por qué meta_query sobre claves no indexadas colapsa a escala, y cómo paginar loops personalizados sin caer en 404.

has_term() e is_tax() se confunden a menudo. Consulta la guía completa sobre lógica condicional para categorías, etiquetas y taxonomías personalizadas.
development

Comprobar si una entrada pertenece a un termino de taxonomía

has_term() e is_tax() se confunden a menudo. Consulta la guía completa sobre lógica condicional para categorías, etiquetas y taxonomías personalizadas.