많은 플러그인 개발자가 사용자가 제품 기능을 조정할 수 있도록 필터 / 액션 후크를 추가하는 데 시간이 걸리는 것 같습니다. 어느 것이 좋지만 자주하지 않는 것은 후크 목록과 인수 수를 제공하는 것입니다.
누구나 플러그인 (또는 테마) 디렉토리를 가리키고 사용 가능한 모든 후크 목록을 보는 가장 자동화 된 방법을 찾았습니까?
나는 후크를 스캔하는 플러그인처럼 보였지만, 내가 알 수있는 한, 주어진 페이지를 렌더링하기 위해 실제로 호출되는 플러그인을 보여줍니다. 내가 얻는 것은 편리 할 수 있습니다. 그러나 때로는 특정 플러그인과 상호 작용하고 있다는 것을 안다면 액션이나 필터를 걸 수있는 모든 곳을 알고 싶습니다.
그래서 내가 정말로 찾고있는 것은 플러그인 루트 디렉토리가 주어지면 각 항목에 포함 된 목록을 만들 것입니다.
- 꼬리표
- 유형 (조치 또는 필터)
- 인수 수
- 소스에서 (
do_action()
또는을 통해apply_filter()
) 호출 된 곳
스크립트는 모든 것을 HTML로 멋지게 HTML 화하고 모든 플러그인의 관리자 UI에서 나에게 보여줄 수 있기 때문에 훌륭 할 것입니다. 그러나 유용한 정적 파일을 출력하는 명령 줄 스크립트도 좋습니다.
답변
내가 원하는 것을 할 수있는 스크립트 나 플러그인이 없습니다. 언급했듯이 현재 사용중인 필터 및 작업을 인쇄하는 데 사용할 수있는 스크립트 ( 전역 변수 )가 있습니다.
휴면 필터와 행동에 관해서는, 나는 (이 개 매우 기본적인 기능을 작성했습니다 여기에 몇 가지 도움을 거기에 ) 모든 발견되는 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의 코드를 사용하면 소스 코드에서 해당 파일과 행으로 이동 한 다음 필터 / 액션의 모든 유효한 매개 변수 값을 가져 오는 것이 쉬워집니다. 또한 중요한 것은 함수와 추가 컨텍스트를 얻는 것입니다. 필터 / 액션이 사용됩니다
답변
WP Parser 가 원하는 것을 수행하는 것처럼 들립니다 . 공식 개발자 참조 를 생성하는 데 사용됩니다 . 매개 변수, @since 태그 및 소스 참조를 나열합니다. 모든 WordPress 플러그인과 함께 작동하며 명령 줄을 통해 액세스 할 수 있습니다.
wp parser create /path/to/source/code --user=<id|login>
답변
분노의 질주
좋은 ol ‘ *nix
명령 줄은 항상 편리합니다.
# grep --line-number \
--exclude-dir=/path/to/some/directory \
--include=*.php \
--recursive \
"add_filter\|do_action\|apply_filters" \
/path/to/wp-content/plugins/some-plugin \
| less
를 통한 더 많은 옵션 #man grep
.
그런 다음 간단한 bash 스크립트를 만들 수도 있습니다 wp-search.sh
.
#!/bash/bin
grep --line-number \
--exclude-dir=/path/to/some/directory \
--include=*.$1 \
--recursive $2 $3
그리고 그것을 실행하십시오.
# bash wp-search.sh php "add_filter\|do_action\|apply_filters" /path/to/some-plugin
예쁜 출력
--color
속성을 사용 하여의 출력물을 채색 grep
할 수는 있지만 작동하지 않습니다 less
.
다른 옵션은 검색 결과에 대한 HTML 테이블을 생성하는 것입니다.
다음 awk
은 검색 결과를 HTML 테이블로 results.html
파일에 출력 하는 예제입니다 .
| sed 's/:/: /2' \
| awk ' \
BEGIN { \
print "<table><tr><th>Results</th><th>Location</th></tr>" \
} \
{ \
$1=$1; location=$1; $1=""; print "<tr><td>" $0 "</td><td>" location "</td><tr>" \
} \
END { \
print "</table>" \
}' \
> results.html
여기서이 트릭 을 사용 하여 모든 선행 공백을 제거 하고이 필드를 사용하여 첫 번째 필드를 제외한 모든 필드를 인쇄했습니다.
sed
여기에 :
공백이없는 경우를 대비 하여 두 번째 콜론 ( ) 뒤에 여분의 공간을 추가하기 위해 여기를 사용 합니다 .
스크립트
이것을 wp-search.sh
스크립트에 추가 할 수 있습니다 :
#!/bash/bin
grep --with-filename \
--line-number \
--exclude-dir=/path/to/some/directory \
--include=*.$1 \
--recursive $2 $3 \
| sed 's/:/: /2' \
| awk ' BEGIN { \
print "<table><tr><th>Results</th><th>Location</th></tr>" \
} \
{ \
$1=$1; location=$1; $1=""; print "<tr><td>" $0 "</td><td>" location "</td><tr>" \
} \
END { \
print "</table>" \
}' \
> /path/to/results.html
당신은 조정해야 할 곳 /path/to/some/directory
과 /path/to/results.html
필요에.
예-플러그인 검색
wordpress-importer
플러그인을 사용하여 다음을 시도하면 :
bash wp-search.sh php "add_filter\|do_action" /path/to/wp-content/plugins/wordpress-importer/
results.html
파일이 다음과 같이 표시됩니다.
예-코어 검색
나는 그것을 핵심 테스트했다.
time bash wp-search.sh php "add_filter\|do_action" /path/to/wordpress/core/
real 0m0.083s
user 0m0.067s
sys 0m0.017s
그리고 빠르다!
노트
추가 컨텍스트를 얻기 위해 -C NUMBER
of grep을 사용할 수 있습니다 .
다양한 방법으로 HTML 출력을 수정할 수 있지만 원하는대로 더 조정할 수 있기를 바랍니다.