¿Cómo saber qué funciones están conectadas a una acción/filtro?

16 may 2011, 17:16:20
Vistas: 43.4K
Votos: 40

¿Existe alguna manera de saber qué funciones están conectadas a un hook en particular? Por ejemplo, si quisiera saber qué funciones están conectadas al hook wp_head.

8
Comentarios

echa un vistazo a esta respuesta a una pregunta similar y más específicamente al plugin publicado allí por mike.

Bainternet Bainternet
16 may 2011 17:26:46

Podría estar equivocado, pero ¿no produce eso simplemente una lista exhaustiva de hooks? La forma en que estoy leyendo la pregunta es que él quiere saber qué funciones están vinculadas al hook.

anu anu
16 may 2011 17:37:56

Parcialmente equivocado, él dijo "por ejemplo qué está enganchado a wp_head", así que es una lista completa no solo un único hook.

Bainternet Bainternet
16 may 2011 18:21:14

De hecho, quería ver qué funciones están vinculadas a un hook en particular, por ejemplo, si hay 10 funciones enganchadas a wp_head, me gustaría listar esas 10.

Javier Villanueva Javier Villanueva
16 may 2011 19:13:18

Bueno, ese plugin listará todas las funciones que están enganchadas con sus respectivos hooks.

Bainternet Bainternet
16 may 2011 19:52:17

Estoy bastante seguro de que esto hace lo que buscas: @Rarst's Debug WordPress hooks

anu anu
16 may 2011 17:23:06

acabo de encontrarme con este plugin que es bastante genial para esto https://wordpress.org/plugins/simply-show-hooks/

Bryan Willis Bryan Willis
14 ene 2016 09:24:33

Para contribuir - en este asunto, no es muy amigable usar la información de hooks recolectada, y especialmente no en 'wp_head'. La forma más cercana y correcta (explicada) es el fragmento de código:

function list_hooks($hook = '') ...

encontrado en: https://stackoverflow.com/a/26680808/2445357

Eso funciona a partir de 2018 y ha sido increíble para este tipo de soluciones. ¡Encontrarás hooks de plugins, clases y objetos anidados y los contarás todos! O fácilmente listar dónde residen las funciones, etc., etc.

Jonas Lundman Jonas Lundman
9 jun 2018 17:34:18
Mostrar los 3 comentarios restantes
Todas las respuestas a la pregunta 5
0
23

Para ver la lista de funciones o acciones enganchadas a un gancho de acción específico puedes usar el siguiente código.

global $wp_filter;
echo '<pre>';
var_dump( $wp_filter['wp_head'] );
echo '</pre>';
3 feb 2016 20:07:41
0
19

Mira la variable global $wp_filter. Consulta mi plugin para una lista de todos los filtros de comentarios como ejemplo:

<?php
/*
Plugin Name: Listar Filtros de Comentarios
Description: Lista todos los filtros de comentarios en wp_footer
Version:     1.1
Author:      Fuxia Scholz
License:     GPL v2
*/

add_action( 'wp_footer', 'listar_filtros_comentarios' );

function listar_filtros_comentarios()
{
    global $wp_filter;

    $filtros_comentarios = array ();
    $h1  = '<h1>Filtros de Comentarios Actuales</h1>';
    $out = '';
    $toc = '<ul>';

    foreach ( $wp_filter as $key => $val )
    {
        if ( FALSE !== strpos( $key, 'comment' ) )
        {
            $filtros_comentarios[$key][] = var_export( $val, TRUE );
        }
    }

    foreach ( $filtros_comentarios as $nombre => $arr_valores )
    {
        $out .= "<h2 id=$nombre>$nombre</h2><pre>" . implode( "\n\n", $arr_valores ) . '</pre>';
        $toc .= "<li><a href='#$nombre'>$nombre</a></li>";
    }

    print "$h1$toc</ul>$out";
}

Salida de ejemplo para pre_comment_author_email:

array (
  10 => 
  array (
    'trim' => 
    array (
      'function' => 'trim',
      'accepted_args' => 1,
    ),
    'sanitize_email' => 
    array (
      'function' => 'sanitize_email',
      'accepted_args' => 1,
    ),
    'wp_filter_kses' => 
    array (
      'function' => 'wp_filter_kses',
      'accepted_args' => 1,
    ),
  ),
)
16 may 2011 17:22:27
0

Esto muestra una lista más legible de filtros

function print_filters_for( $hook = '' ) {
    global $wp_filter;
    if( empty( $hook ) || !isset( $wp_filter[$hook] ) ) return;

    $ret='';
    foreach($wp_filter[$hook] as $priority => $realhook){
        foreach($realhook as $hook_k => $hook_v){
            $hook_echo=(is_array($hook_v['function'])?get_class($hook_v['function'][0]).':'.$hook_v['function'][1]:$hook_v['function']);
            $ret.=  "\n$priority $hook_echo";
        }

    }
     return $ret;
}
15 abr 2016 04:28:55
1

Para fines de depuración, un simple

global $wp_filter;
echo "<pre>" . print_r($wp_filter, true) . "</pre>";

sería suficiente...

9 dic 2015 16:20:30
Comentarios

En mi caso, llamar a var_dump($wp_filter) generaba demasiada salida. Preferí usar var_dump($wp_filter["<nombre de la acción>"]). (Lo mismo aplica para print_r - personalmente preferí var_dump).

Acsor Acsor
18 jun 2017 00:42:00
0

Encontré útil la respuesta de @Simone G, pero no tenía en cuenta el hecho de que a veces se pueden enganchar Closures. Aquí está mi versión más detallada (y fea):

if( isset($wp_filter[$filterName]) ){
    foreach( $wp_filter[$filterName] as $priority => $hooks){
        foreach ($hooks as $hook_k => $hook_v) {
            $hook_echo=(is_array($hook_v['function'])?get_class($hook_v['function'][0]).':'.$hook_v['function'][1]:$hook_v['function']);
            if(is_object($hook_echo) && ($hook_echo instanceof Closure)){
                $hook_echo="closure";
            }
            error_log($filterName." HOOKED (".serialize($priority)."): ".serialize($hook_k)."".serialize($hook_echo));
        }
    }
} else {
    error_log($filterName." NO FILTERS HOOKED");
}
21 feb 2017 05:38:43