Как узнать, какие функции прикреплены к действию/фильтру?

16 мая 2011 г., 17:16:20
Просмотры: 43.4K
Голосов: 40

Существует ли способ узнать, какие функции прикреплены к определенному хуку? Например, если я хочу узнать, какие функции прикреплены к хуку wp_head.

8
Комментарии

Посмотрите этот ответ на похожий вопрос и, в частности, плагин, который опубликовал там mike.

Bainternet Bainternet
16 мая 2011 г. 17:26:46

Может я ошибаюсь, но разве это не просто создает полный список хуков? Как я понимаю вопрос, автор хочет узнать, какие функции прикреплены к хуку.

anu anu
16 мая 2011 г. 17:37:56

Отчасти ошибаетесь, он сказал "например, что подключено к wp_head", так что нужен полный список, а не только один хук.

Bainternet Bainternet
16 мая 2011 г. 18:21:14

Действительно, я хотел посмотреть, какие функции привязаны к определенному хуку. Например, если к wp_head подключено 10 функций, то я хотел бы увидеть список этих 10 функций.

Javier Villanueva Javier Villanueva
16 мая 2011 г. 19:13:18

Этот плагин как раз выводит список всех функций, подключенных к хукам, вместе с самими хуками.

Bainternet Bainternet
16 мая 2011 г. 19:52:17

Я почти уверен, что это именно то, что вам нужно: @Rarst's Debug WordPress hooks

anu anu
16 мая 2011 г. 17:23:06

недавно нашел этот плагин, который отлично подходит для этого https://wordpress.org/plugins/simply-show-hooks/

Bryan Willis Bryan Willis
14 янв. 2016 г. 09:24:33

Для более глубокого изучения - в этом случае не очень удобно использовать собранную информацию о хуках, особенно на 'wp_head'. Наиболее правильный способ (с объяснением) - это сниппет:

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

который можно найти здесь: https://stackoverflow.com/a/26680808/2445357

Он работает с 2018 года и отлично подходит для подобных решений. Вы найдете хуки из плагинов, классов и вложенных объектов, а также сможете их все посчитать! Или просто перечислить, где находятся функции и т.д.

Jonas Lundman Jonas Lundman
9 июн. 2018 г. 17:34:18
Показать остальные 3 комментариев
Все ответы на вопрос 5
0
23

Чтобы увидеть список функций или действий, прикреплённых к определённому хуку, можно использовать следующий код:

global $wp_filter;
echo '<pre>';
var_dump( $wp_filter['wp_head'] );
echo '</pre>';
3 февр. 2016 г. 20:07:41
0
19

Изучите глобальную переменную $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,
    ),
  ),
)
16 мая 2011 г. 17:22:27
0

Это показывает более читаемый список фильтров

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 апр. 2016 г. 04:28:55
1

Для целей отладки подойдёт простой код:

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

Это выведет список всех зарегистрированных хуков и фильтров...

9 дек. 2015 г. 16:20:30
Комментарии

В моем случае вызов var_dump($wp_filter) выводил слишком много данных. Я предпочел использовать var_dump($wp_filter["<имя действия>"]). (То же самое относится и к print_r - лично я предпочитаю var_dump.)

Acsor Acsor
18 июн. 2017 г. 00:42:00
0

Ответ от @Simone G был полезным, но он не учитывал тот факт, что иногда можно подключить замыкания (Closures). Вот моя более подробная (и некрасивая) версия:

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 февр. 2017 г. 05:38:43