ไม่มีสคริปต์หรือปลั๊กอินที่ฉันรู้ว่าจะทำสิ่งที่คุณต้องการ ตามที่คุณระบุไว้มีสคริปต์ ( แม้แต่ตัวแปรทั่วโลก ) ซึ่งคุณสามารถใช้เพื่อพิมพ์ตัวกรองและการกระทำที่กำลังใช้อยู่
สำหรับตัวกรองและแอ็คชั่นที่หยุดนิ่งฉันได้เขียนฟังก์ชั่นพื้นฐานสองอย่าง ( ด้วยความช่วยเหลือที่นี่และที่นั่น ) ซึ่งค้นหาทั้งหมด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;
}
คุณสามารถใช้งานได้ตามแม่แบบส่วนหน้าหรือส่วนหลัง
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 มันง่ายเหมือนกับการไปที่ไฟล์ดังกล่าวและบรรทัดดังกล่าวในซอร์สโค้ดจากนั้นรับค่าพารามิเตอร์ที่ถูกต้องทั้งหมดของตัวกรอง / แอ็คชันเช่นกันที่สำคัญรับฟังก์ชั่นและบริบทเพิ่มเติมที่ ใช้ตัวกรอง / การกระทำ