Немає сценарію чи плагіна, з якого я знаю, щоб робити те, що ти хочеш. Як ви вже сказали, є сценарії ( навіть глобальні змінні ), які ви можете використовувати для друку фільтрів і дій, які зараз використовуються.
Що стосується недіючих фільтрів і дій, я написав дві найосновніші функції ( з деякою допомогою тут і там ) , який знаходить все apply_filters
і do_action
екземпляри в файл , а потім виводить його
ОСНОВИ
Ми будемо використовувати RecursiveDirectoryIterator
, RecursiveIteratorIterator
і RegexIterator
класи PHP , щоб отримати всі PHP файли в каталозі. Як, наприклад, я на своєму localhost використовував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;
}
Ви можете користуватися функцією "follow" на шаблоні, фронтені чи вихідному сервері
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;
}
Ви можете користуватися функцією "follow" на шаблоні, фронтені чи вихідному сервері
echo get_all_filters_and_actions2( 'E:\xammp\htdocs\wordpress\wp-includes' );
Це надрукується
EDIT
Це в основному стільки, скільки я можу зробити, якщо сценарії не закінчуються або не вистачає пам'яті. З кодом у варіанті 2 це так само просто, як перейти до згаданого файлу та вказаного рядка у вихідному коді, а потім отримати всі дійсні значення параметрів фільтра / дії, а також, що важливо, отримати функцію та подальший контекст, у якому використовується фільтр / дія