Không có kịch bản hoặc plugin mà tôi biết để làm những gì bạn muốn. Như bạn đã nêu, có các tập lệnh ( thậm chí là các biến toàn cục ) mà bạn có thể sử dụng để in các bộ lọc và hành động hiện đang được sử dụng.
Đối với các bộ lọc và hành động không hoạt động, tôi đã viết hai hàm rất cơ bản ( với một số trợ giúp ở đây và ở đó ) để tìm tất cả apply_filters
và các do_action
thể hiện trong một tệp và sau đó in ra
CƠ BẢN
Chúng tôi sẽ sử dụng RecursiveDirectoryIterator
, RecursiveIteratorIterator
và RegexIterator
các lớp học PHP để có được tất cả các file PHP trong một thư mục. Ví dụ, trên localhost của tôi, tôi đã sử dụngE:\xammp\htdocs\wordpress\wp-includes
Sau đó chúng tôi sẽ lặp qua các tệp, và tìm kiếm và trả về ( preg_match_all
) tất cả các phiên bản của apply_filters
và do_action
. Tôi đã thiết lập nó để khớp với các trường hợp dấu ngoặc đơn lồng nhau và cũng để khớp với các khoảng trắng có thể có giữa apply_filters
/ do_action
và dấu ngoặc đơn đầu tiên
Chúng tôi sẽ đơn giản sau đó tạo một mảng với tất cả các bộ lọc và hành động, sau đó lặp qua mảng đó và xuất tên tệp cũng như các bộ lọc và hành động. Chúng tôi sẽ bỏ qua các tệp mà không có bộ lọc / hành động
THÔNG BÁO QUAN TRỌNG
Chức năng này rất tốn kém. Chạy chúng chỉ trên một cài đặt thử nghiệm cục bộ.
Sửa đổi các chức năng khi cần thiết. Bạn có thể quyết định ghi đầu ra vào một tệp, tạo một trang phụ trợ đặc biệt cho điều đó, các tùy chọn là không giới hạn
LỰA CHỌN 1
Hàm tùy chọn đầu tiên rất đơn giản, chúng tôi sẽ trả về nội dung của tệp dưới dạng chuỗi bằng cách sử dụng file_get_contents
, tìm kiếm apply_filters
/ do_action
thể hiện và chỉ cần xuất tên tệp và tên bộ lọc / hành động
Tôi đã nhận xét mã để dễ theo dõi
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;
}
Bạn có thể sử dụng theo dõi trên một mẫu, frontend hoặc phụ trợ
echo get_all_filters_and_actions( 'E:\xammp\htdocs\wordpress\wp-includes' );
Cái này sẽ in
LỰA CHỌN 2
Tùy chọn này đắt hơn một chút để chạy. Hàm này trả về số dòng nơi bộ lọc / hành động có thể được tìm thấy.
Ở đây chúng tôi sử dụng file
để phát nổ tệp thành một mảng, sau đó chúng tôi tìm kiếm và trả về bộ lọc / hành động và số dòng
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;
}
Bạn có thể sử dụng theo dõi trên một mẫu, frontend hoặc phụ trợ
echo get_all_filters_and_actions2( 'E:\xammp\htdocs\wordpress\wp-includes' );
Cái này sẽ in
BIÊN TẬP
Điều này về cơ bản là nhiều như tôi có thể làm mà không có kịch bản hết thời gian hoặc hết bộ nhớ. Với mã trong tùy chọn 2, thật dễ dàng như đi đến tệp đã nói và dòng đã nói trong mã nguồn và sau đó nhận tất cả các giá trị tham số hợp lệ của bộ lọc / hành động, quan trọng là, có được hàm và ngữ cảnh xa hơn trong đó bộ lọc / hành động được sử dụng