Я не знаю сценарий или плагин, чтобы делать то, что вы хотите. Как вы сказали, есть сценарии ( даже глобальные переменные ), которые вы можете использовать для печати фильтров и используемых в настоящее время действий.
Что касается бездействующих фильтров и действий, я написал две очень основные функции ( с некоторой помощью здесь и там ), которые находят все apply_filters
и do_action
экземпляры в файле, а затем распечатывают его
ОСНОВЫ
Мы будем использовать классы RecursiveDirectoryIterator
, RecursiveIteratorIterator
и RegexIterator
PHP, чтобы получить все файлы PHP в каталоге. Как пример, на моем локальном хосте я использовалE:\xammp\htdocs\wordpress\wp-includes
Затем мы будем перебирать файлы, искать и возвращать ( preg_match_all
) все экземпляры apply_filters
и do_action
. Я настроил его для соответствия вложенных экземпляров скобок, а также для сопоставления возможных пробелов между apply_filters
/ do_action
и первой скобкой
Мы просто создадим массив со всеми фильтрами и действиями, а затем пройдемся по массиву и выведем имя файла, фильтры и действия. Мы будем пропускать файлы без фильтров / действий
ВАЖНЫЕ ЗАМЕТКИ
Эти функции очень дороги. Запускайте их только при локальной тестовой установке.
Измените функции по мере необходимости. Вы можете записать вывод в файл, создать для этого специальную бэкэнд-страницу, опции не ограничены
ОПЦИЯ 1
Первая функция опций очень проста, мы будем возвращать содержимое файла в виде строки, используя file_get_contents
, искать apply_filters
/ do_action
экземпляры и просто выводить имя файла и имена фильтров / действий
Я прокомментировал код для легкого следования
function get_all_filters_and_actions( $path = '' )
{
//Check if we have a path, if not, return false
if ( !$path )
return false;
// Validate and sanitize path
$path = filter_var( $path, FILTER_SANITIZE_URL );
/**
* If valiadtion fails, return false
*
* You can add an error message of something here to tell
* the user that the URL validation failed
*/
if ( !$path )
return false;
// Get each php file from the directory or URL
$dir = new RecursiveDirectoryIterator( $path );
$flat = new RecursiveIteratorIterator( $dir );
$files = new RegexIterator( $flat, '/\.php$/i' );
if ( $files ) {
$output = '';
foreach($files as $name=>$file) {
/**
* Match and return all instances of apply_filters(**) or do_action(**)
* The regex will match the following
* - Any depth of nesting of parentheses, so apply_filters( 'filter_name', parameter( 1,2 ) ) will be matched
* - Whitespaces that might exist between apply_filters or do_action and the first parentheses
*/
// Use file_get_contents to get contents of the php file
$get_file_content = file_get_contents( $file );
// Use htmlspecialchars() to avoid HTML in filters from rendering in page
$save_content = htmlspecialchars( $get_file_content );
preg_match_all( '/(apply_filters|do_action)\s*(\([^()]*(?:(?-1)[^()]*)*+\))/', $save_content, $matches );
// Build an array to hold the file name as key and apply_filters/do_action values as value
if ( $matches[0] )
$array[$name] = $matches[0];
}
foreach ( $array as $file_name=>$value ) {
$output .= '<ul>';
$output .= '<strong>File Path: ' . $file_name .'</strong></br>';
$output .= 'The following filters and/or actions are available';
foreach ( $value as $k=>$v ) {
$output .= '<li>' . $v . '</li>';
}
$output .= '</ul>';
}
return $output;
}
return false;
}
Вы можете использовать по шаблону, веб-интерфейсу или бэкэнду
echo get_all_filters_and_actions( 'E:\xammp\htdocs\wordpress\wp-includes' );
Это напечатает
ВАРИАНТ 2
Этот вариант немного дороже в запуске. Эта функция возвращает номер строки, в которой можно найти фильтр / действие.
Здесь мы используем, file
чтобы взорвать файл в массив, затем мы ищем и возвращаем фильтр / действие и номер строки
function get_all_filters_and_actions2( $path = '' )
{
//Check if we have a path, if not, return false
if ( !$path )
return false;
// Validate and sanitize path
$path = filter_var( $path, FILTER_SANITIZE_URL );
/**
* If valiadtion fails, return false
*
* You can add an error message of something here to tell
* the user that the URL validation failed
*/
if ( !$path )
return false;
// Get each php file from the directory or URL
$dir = new RecursiveDirectoryIterator( $path );
$flat = new RecursiveIteratorIterator( $dir );
$files = new RegexIterator( $flat, '/\.php$/i' );
if ( $files ) {
$output = '';
$array = [];
foreach($files as $name=>$file) {
/**
* Match and return all instances of apply_filters(**) or do_action(**)
* The regex will match the following
* - Any depth of nesting of parentheses, so apply_filters( 'filter_name', parameter( 1,2 ) ) will be matched
* - Whitespaces that might exist between apply_filters or do_action and the first parentheses
*/
// Use file_get_contents to get contents of the php file
$get_file_contents = file( $file );
foreach ( $get_file_contents as $key=>$get_file_content ) {
preg_match_all( '/(apply_filters|do_action)\s*(\([^()]*(?:(?-1)[^()]*)*+\))/', $get_file_content, $matches );
if ( $matches[0] )
$array[$name][$key+1] = $matches[0];
}
}
if ( $array ) {
foreach ( $array as $file_name=>$values ) {
$output .= '<ul>';
$output .= '<strong>File Path: ' . $file_name .'</strong></br>';
$output .= 'The following filters and/or actions are available';
foreach ( $values as $line_number=>$string ) {
$whitespaces = ' ';
$output .= '<li>Line reference ' . $line_number . $whitespaces . $string[0] . '</li>';
}
$output .= '</ul>';
}
}
return $output;
}
return false;
}
Вы можете использовать по шаблону, веб-интерфейсу или бэкэнду
echo get_all_filters_and_actions2( 'E:\xammp\htdocs\wordpress\wp-includes' );
Это напечатает
РЕДАКТИРОВАТЬ
Это в основном столько, сколько я могу сделать без тайм-аутов скриптов или нехватки памяти. С кодом в варианте 2 это так же просто, как перейти к указанному файлу и указанной строке в исходном коде, а затем получить все допустимые значения параметров фильтра / действия, а также, что важно, получить функцию и дополнительный контекст, в котором фильтр / действие используется