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

32

¿Hay alguna manera de saber qué funciones están enganchadas a un gancho en particular? Por ejemplo, si me gustaría saber qué funciones están enganchadas al wp_headgancho.

Javier Villanueva
fuente
Estoy bastante seguro de que esto hace lo que quieres: @ Rarst's Debug WordPress hooks
anu
Eche un vistazo a esta respuesta a una pregunta similar y más específicamente al complemento publicado por Mike.
Bainternet
1
Podría estar equivocado, pero ¿eso no solo produce una lista completa de ganchos? La forma en que estoy leyendo la pregunta es que quiere saber qué funciones están unidas al gancho.
Anu
Parcialmente equivocado, dijo "por ejemplo, lo que está conectado a wp_head", por lo que es una lista completa, no solo un gancho.
Bainternet
De hecho, quería ver qué funciones están unidas a un enlace particular, así que, por ejemplo, si se conectan 10 funciones wp_head, me gustaría enumerar esas 10.
Javier Villanueva

Respuestas:

16

Mira en la variable global $wp_filter. Vea mi complemento para obtener una lista de todos los filtros de comentarios para un ejemplo:

<?php
/*
Plugin Name: List Comment Filters
Description: List all comment filters on wp_footer
Version:     1.1
Author:      Fuxia Scholz
License:     GPL v2
*/

add_action( 'wp_footer', 'list_comment_filters' );

function list_comment_filters()
{
    global $wp_filter;

    $comment_filters = array ();
    $h1  = '<h1>Current Comment Filters</h1>';
    $out = '';
    $toc = '<ul>';

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

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

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

Salida de muestra 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,
    ),
  ),
)
fuxia
fuente
Gran pequeña función toscho, gracias por compartir esto. Lo estoy usando para evaluar todos los ganchos de acción cargados para un tema en la acción de apagado.
Kevin Leary
11

para ver la lista de funciones o acciones conectadas a un enlace de acción particular, puede usar el siguiente código.

global $wp_filter;
echo '<pre>';
var_dump( $wp_filter['wp_head'] );
echo '</pre>';
Aamer Shahzad
fuente
5

Para fines de depuración, un simple

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

Lo haría ...

Martin de WP-Stars.com
fuente
1
En mi caso, las llamadas var_dump($wp_filter)produjeron demasiada salida. I concentrar var_dump($wp_filter["<action name>"]). (Lo mismo ocurre print_r, personalmente prefiero var_dump).
Acsor
4

Esto muestra una lista de filtros más legible

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;
}
Simone G
fuente
0

La respuesta de @ user3623530 me pareció útil, pero no se tuvo en cuenta el hecho de que a veces se pueden enganchar los cierres. 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");
}
Derwent
fuente