Jak się dowiedzieć, jakie funkcje są podłączone do akcji / filtra?

32

Czy istnieje sposób, aby dowiedzieć się, jakie funkcje są podłączone do konkretnego haka? Na przykład, jeśli chciałbym wiedzieć, jakie funkcje są zaczepione do wp_headhaka.

Javier Villanueva
źródło
Jestem prawie pewien, że robi to, co chcesz: @ Rarst's Debugowanie WordPress przechwytuje
anu
spójrz na tę odpowiedź na podobne pytanie, a dokładniej na wtyczkę opublikowaną przez mike.
Bainternet
1
Mogę się mylić, ale czy to nie tworzy wyczerpującej listy haków? Sposób, w jaki czytam pytanie, polega na tym, że chce wiedzieć, jakie funkcje są dołączone do haka.
anu
Częściowo źle powiedział „na przykład, co jest podpięte do wp_head”, więc jest to pełna lista nie tylko jednego hooka.
Bainternet
Rzeczywiście, chciałem zobaczyć, jakie funkcje są dołączone do konkretnego haka, więc na przykład, jeśli 10 funkcji jest podpiętych, wp_headto chciałbym wymienić te 10.
Javier Villanueva

Odpowiedzi:

16

Spójrz na zmienną globalną $wp_filter. Zobacz moją wtyczkę, aby wyświetlić listę wszystkich filtrów komentarzy na przykład:

<?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";
}

Przykładowe dane wyjściowe dla 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
źródło
Świetna mała funkcja toscho, dziękuję za udostępnienie tego. Używam go do oceny wszystkich haków akcji załadowanych dla motywu podczas akcji zamykania.
Kevin Leary
11

Aby zobaczyć listę funkcji lub akcji podłączonych do konkretnego haka akcji, możesz użyć następującego kodu.

global $wp_filter;
echo '<pre>';
var_dump( $wp_filter['wp_head'] );
echo '</pre>';
Aamer Shahzad
źródło
5

Do celów debugowania proste

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

zrobiłbym to ...

Martin z WP-Stars.com
źródło
1
W moim przypadku wywołanie var_dump($wp_filter)spowodowało zbyt wiele wyników. Wolałem używać var_dump($wp_filter["<action name>"]). (To samo dotyczy print_r- osobiście wolałem var_dump.)
Acsor
4

To pokazuje bardziej czytelną listę filtrów

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.
źródło
0

Uznałem, że odpowiedź od @ user3623530 jest przydatna, ale nie wzięła pod uwagę faktu, że czasami Zamknięcia można zaczepić. Oto moja bardziej pełna (i brzydka) wersja:

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
źródło