Não há nenhum script ou plugin que eu conheça para fazer o que você deseja. Como você afirmou, existem scripts ( mesmo variáveis globais ) que você pode usar para imprimir filtros e ações atualmente em uso.
Quanto aos filtros e ações dormentes, eu escrevi duas funções muito básicas ( com alguma ajuda aqui e ali ), que encontra todos apply_filters
e do_action
instâncias em um arquivo e, em seguida, imprime-lo para fora
FUNDAMENTOS
Usaremos a RecursiveDirectoryIterator
, RecursiveIteratorIterator
e RegexIterator
classes PHP para obter todos os arquivos do PHP dentro de um diretório. Como exemplo, no meu host local, eu useiE:\xammp\htdocs\wordpress\wp-includes
Em seguida, percorreremos os arquivos e procuraremos e retornaremos ( preg_match_all
) todas as instâncias de apply_filters
e do_action
. Eu o configurei para coincidir com instâncias aninhadas de parênteses e também para coincidir com possíveis espaços em branco entre apply_filters
/ do_action
e o primeiro parêntese
Simplesmente criaremos uma matriz com todos os filtros e ações e, em seguida, percorreremos a matriz e produziremos o nome do arquivo, filtros e ações. Iremos pular arquivos sem filtros / ações
ANOTAÇÕES IMPORTANTES
Essas funções são muito caras. Execute-os apenas em uma instalação de teste local.
Modifique as funções conforme necessário. Você pode decidir gravar a saída em um arquivo, criar uma página de back-end especial para isso, as opções são ilimitadas
OPÇÃO 1
A primeira função de opções é muito simples; retornaremos o conteúdo de um arquivo como uma string usando file_get_contents
, pesquisemos as instâncias apply_filters
/ do_action
e simplesmente produzimos o nome do arquivo e os nomes de filtro / ação
Eu comentei o código para facilitar o acompanhamento
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;
}
Você pode usar a seguir em um modelo, front-end ou back-end
echo get_all_filters_and_actions( 'E:\xammp\htdocs\wordpress\wp-includes' );
Isso imprimirá
OPÇÃO 2
Essa opção é um pouco mais cara de executar. Esta função retorna o número da linha onde o filtro / ação pode ser encontrado.
Aqui usamos file
para explodir o arquivo em uma matriz, depois pesquisamos e retornamos o filtro / ação e o número da linha
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;
}
Você pode usar a seguir em um modelo, front-end ou back-end
echo get_all_filters_and_actions2( 'E:\xammp\htdocs\wordpress\wp-includes' );
Isso imprimirá
EDITAR
Isso é basicamente o máximo que posso fazer sem que os scripts atinjam o tempo limite ou fiquem sem memória. Com o código na opção 2, é tão fácil quanto ir para o referido arquivo e a referida linha no código-fonte e, em seguida, obter todos os valores de parâmetro válidos do filtro / ação, também, o mais importante, obter a função e o contexto em que o filtro / ação é usado