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.


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,
    ),
  ),
)

Ś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>';

5

Do celów debugowania proste

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

zrobiłbym to ...


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

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");
}
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.