İstediğinizi yapmak için bildiğim komut dosyası veya eklenti yok. Belirttiğiniz gibi, şu anda kullanılmakta olan filtreleri ve eylemleri yazdırmak için kullanabileceğiniz komut dosyaları ( genel değişkenler bile ) vardır.
Hareketsiz filtreler ve eylemlere gelince , bir dosyadaki tüm ve örnekleri bulan ve daha sonra yazdırılan iki çok temel işlev ( burada ve orada bazı yardımlarla ) yazdımapply_filters
do_action
TEMELLERİ
Bir dizindeki tüm PHP dosyalarını almak için RecursiveDirectoryIterator
, RecursiveIteratorIterator
ve RegexIterator
PHP sınıflarını kullanacağız. Örneğin, yerel ana bilgisayarımda,E:\xammp\htdocs\wordpress\wp-includes
Daha sonra dosyalar arasında döngü ve arama ve dönüş (edecek preg_match_all
) tüm örneklerini apply_filters
ve do_action
. Yuvalanmış parantez örneklerini eşleştirmek ve apply_filters
/ do_action
ve ilk parantez arasındaki olası boşlukları eşleştirmek için ayarladım
Daha sonra tüm filtreleri ve eylemleri içeren bir dizi oluşturacağız ve sonra dizi boyunca döngüye gireceğiz ve dosya adını, filtreleri ve eylemleri çıktılayacağız. Filtreleri / işlemleri olmayan dosyaları atlayacağız
ÖNEMLİ NOTLAR
Bu işlevler çok pahalıdır. Bunları yalnızca yerel bir test yüklemesinde çalıştırın.
İşlevleri gerektiği gibi değiştirin. Çıktıyı bir dosyaya yazmaya karar verebilir, bunun için özel bir arka uç sayfası oluşturabilirsiniz, seçenekler sınırsızdır
SEÇENEK 1
İlk seçenekler işlevi çok basittir, bir dosyanın içeriğini kullanarak dize olarak döndüreceğiz file_get_contents
, apply_filters
/ do_action
örnekleri arayacağız ve sadece dosya adını ve filtre / eylem adlarını çıktılayacağız
Kolay takip için kodu yorumladım
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;
}
Takipte bir şablon, ön uç veya arka uçta kullanabilirsiniz
echo get_all_filters_and_actions( 'E:\xammp\htdocs\wordpress\wp-includes' );
Bu yazdırılacak
SEÇENEK 2
Bu seçeneğin çalışması biraz daha pahalıdır. Bu işlev, filtrenin / eylemin bulunabileceği satır numarasını döndürür.
Burada file
dosyayı bir diziye patlatmak için kullanırız , ardından filtreyi / işlemi ve satır numarasını arar ve döndürürüz
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;
}
Takipte bir şablon, ön uç veya arka uçta kullanabilirsiniz
echo get_all_filters_and_actions2( 'E:\xammp\htdocs\wordpress\wp-includes' );
Bu yazdırılacak
DÜZENLE
Bu temelde komut dosyaları zaman aşımına uğramadan ya da bellek tükenmeden yapabildiğim kadarıyla. Seçenek 2'deki kodla, kaynak koddaki adı geçen dosyaya ve adı geçen satıra gitmek kadar kolaydır ve daha sonra filtrenin / eylemin tüm geçerli parametre değerlerini almak, ayrıca, filtre / eylem kullanılır