Intereting Posts
Вызов сообщений из указанного кота Пользовательские функции формы формы виджета Отключение визуального редактора на определенной должности Изменение языка на языке сайта ничего не делает Как проверить с помощью условных тегов на одной странице плагина? Форум для WordPress – Супер путать! Выбор нескольких менеджеров мультимедиа Как создать пользовательский фильтр таксономии, чтобы ИСКЛЮЧИТЬ термин Значение настраиваемого поля не сохраняется, когда он содержит URL-адрес? Запрос на первые 3 сообщения, чтобы изменить внешний вид Поиск, где происходит короткий код Как получить массив идентификаторов сообщений с помощью определенного значения, хранящегося в массиве пользовательского мета Страница против пользовательских типов сообщений Различия / проблемы setup_postdata не возвращает никаких значений Как вы фильтруете список состояний при выборе страны?

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

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

Solutions Collecting From Web of "Как узнать, какие функции связаны с действием / фильтром?"

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

 <?php /* Plugin Name: List Comment Filters Description: List all comment filters on wp_footer Version: 1.1 Author: Thomas Scholz Author URI: http://toscho.de 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, ), ), ) 

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

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

сделал бы это …

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

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

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

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

Я нашел ответ от @ user3623530 полезным, но он не принял во внимание тот факт, что иногда 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"); }