我不知道要执行所需的脚本或插件。如前所述,有一些脚本(甚至全局变量)可用于打印当前使用的过滤器和操作。
至于休眠过滤器和动作,我已经写了两个非常基本的功能(在这里一些帮助,有),它找到所有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中的代码,就像转到源代码中的所述文件和所述行,然后获取过滤器/操作的所有有效参数值一样简单,而且重要的是,获得函数和进一步的上下文。使用过滤器/操作