Як знати, які функції підключені до дії / фільтра?


32

Чи є спосіб дізнатися, які функції підключені до певного гака? Наприклад, якщо я хотів би знати, які функції підключені до wp_headгака.


Я майже впевнений, що це робить те, що ви хочете: @ Rarst's Debug WordPress гачки
ану

погляньте на цю відповідь на подібне питання, а точніше на плагін, розміщений там Майком.
Bainternet

1
Я можу помилятися, але хіба це не просто вичерпує список гачків? Я читаю питання - він хоче знати, які функції прикріплені до гачка.
ану

Частково неправильно, він сказав "наприклад, що підключено до wp_head", тому його повний список не лише одного гачка.
Бейнтернет

Дійсно, я хотів побачити, які функції прикріплені до певного гака, тому, наприклад, якщо 10 функцій підключено до wp_headцього, я хотів би перерахувати їх 10.
Хав'єр Віллануєва,

Відповіді:


16

Погляньте на глобальну змінну $wp_filter. Дивіться мій плагін для списку всіх фільтрів коментарів для прикладу:

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

Вибірка зразка для 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,
    ),
  ),
)

Чудова маленька функція toscho, дякую, що поділилася цим. Я використовую його для оцінки всіх гаків дій, завантажених для теми під час вимкнення.
Кевін Лірі

11

щоб переглянути список функцій або дій, підключених до певного гака дій, ви можете скористатися наступним кодом.

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

5

Для цілей налагодження простий

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

зробив би це ...


1
У моєму випадку виклик var_dump($wp_filter)дав занадто багато результатів. Я вважав за краще використовувати var_dump($wp_filter["<action name>"]). (Те саме стосується print_r- я особисто віддав перевагу var_dump.)
Acsor

4

Це показує більш читабельний список фільтрів

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

Я знайшов відповідь від @ user3623530 корисною, але він не врахував той факт, що іноді закриття можуть бути підключені. Ось моя більш докладна (і потворна) версія:

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");
}
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.