답변:
@Arlen : Keith S가 지적한 것처럼 Adam Brown의 후크 목록은 WordPress에 대한 후크의 사실상의 자원입니다. 그러나 완벽하지는 않습니다.
따라서 Adam의 목록은 특히 과거에 후크가 추가 된 시점을 이해하는 데 유용한 리소스이지만 사이트의 특정 페이지에서 후크를 계측 할 수있는 것만 큼 유용하지는 않습니다.
나는이 아이디어를 잠시 동안 놀아 왔기 때문에 귀하의 질문으로 인해 " WordPress 용 기기 후크 "라는 플러그인 을 작성하게 되었습니다 . 스크린 샷 아래 에서 전체 소스를 찾을 수 있으며 여기 에서 요점 에서 다운로드 할 수도 있습니다 .
인스 트루먼 테이션의 스크린 샷은 다음과 같습니다.
URL 매개 변수를 사용하여 인스 트루먼 테이션을 트리거하십시오 instrument=hooks
.
약속 한대로 여기 소스가 있습니다 (또는 여기에서 다운로드 하십시오 ).
<?php
/*
Plugin Name: Instrument Hooks for WordPress
Description: Instruments Hooks for a Page. Outputs during the Shutdown Hook.
Version: 0.1
Author: Mike Schinkel
Author URI: http://mikeschinkel.com
*/
if ($_GET['instrument']=='hooks') {
add_action('shutdown','instrument_hooks');
function instrument_hooks() {
global $wpdb;
$hooks = $wpdb->get_results("SELECT * FROM wp_hook_list ORDER BY first_call");
$html = array();
$html[] = '<style>#instrumented-hook-list table,#instrumented-hook-list th,#instrumented-hook-list td {border:1px solid gray;padding:2px 5px;}</style>
<div align="center" id="instrumented-hook-list">
<table>
<tr>
<th>First Call</th>
<th>Hook Name</th>
<th>Hook Type</th>
<th>Arg Count</th>
<th>Called By</th>
<th>Line #</th>
<th>File Name</th>
</tr>';
foreach($hooks as $hook) {
$html[] = "<tr>
<td>{$hook->first_call}</td>
<td>{$hook->hook_name}</td>
<td>{$hook->hook_type}</td>
<td>{$hook->arg_count}</td>
<td>{$hook->called_by}</td>
<td>{$hook->line_num}</td>
<td>{$hook->file_name}</td>
</tr>";
}
$html[] = '</table></div>';
echo implode("\n",$html);
}
add_action('all','record_hook_usage');
function record_hook_usage($hook){
global $wpdb;
static $in_hook = false;
static $first_call = 1;
static $doc_root;
$callstack = debug_backtrace();
if (!$in_hook) {
$in_hook = true;
if ($first_call==1) {
$doc_root = $_SERVER['DOCUMENT_ROOT'];
$results = $wpdb->get_results("SHOW TABLE STATUS LIKE 'wp_hook_list'");
if (count($results)==1) {
$wpdb->query("TRUNCATE TABLE wp_hook_list");
} else {
$wpdb->query("CREATE TABLE wp_hook_list (
called_by varchar(96) NOT NULL,
hook_name varchar(96) NOT NULL,
hook_type varchar(15) NOT NULL,
first_call int(11) NOT NULL,
arg_count tinyint(4) NOT NULL,
file_name varchar(128) NOT NULL,
line_num smallint NOT NULL,
PRIMARY KEY (first_call,hook_name))"
);
}
}
$args = func_get_args();
$arg_count = count($args)-1;
$hook_type = str_replace('do_','',
str_replace('apply_filters','filter',
str_replace('_ref_array','[]',
$callstack[3]['function'])));
$file_name = str_replace($doc_root,'',$callstack[3]['file']);
$line_num = $callstack[3]['line'];
$called_by = $callstack[4]['function'];
$wpdb->query("INSERT wp_hook_list
(first_call,called_by,hook_name,hook_type,arg_count,file_name,line_num)
VALUES ($first_call,'$called_by()','$hook','$hook_type',$arg_count,'$file_name',$line_num)");
$first_call++;
$in_hook = false;
}
}
}
코덱스에는 액션 레퍼런스 와 필터 레퍼런스가 있습니다. Adam Brown 은 소스 코드에 모든 후크가 포함 된 후크 데이터베이스 를 작성 했으며 위키 페이지의 문서, 버전 정보 및 소스 코드 링크를 추가합니다. 코덱스에 문서를 작성하여 개선 할 수 있습니다.
물론 다른 데이터에 따라 일부 후크는 동적입니다. 테이크 wp_transition_post_status
기능 :
function wp_transition_post_status($new_status, $old_status, $post) {
do_action('transition_post_status', $new_status, $old_status, $post);
do_action("${old_status}_to_$new_status", $post);
do_action("${new_status}_$post->post_type", $post->ID, $post);
}
사용자 정의 게시물 유형 event
및 사용자 정의 게시물 상태 를 등록 cancelled
하면 cancelled_event
작업 후크가 있습니다.
원시적이지만이 플러그인 코드가 도움이 될 수 있습니까? 대신 필터를 보려면 "add_filter"로 "add_action"을 전환하십시오. 플러그인을로드 한 다음 사이트 홈페이지를 새로 고칩니다. 일단로드되면 비활성화하기가 매우 어려우므로 플러그인 폴더에서 플러그인 파일 이름을 바꾸고 사이트를 다시 새로 고치면 자동으로 비활성화됩니다. 이 트릭을 사용하여 문제를 해결하거나 무언가를 삽입 할 수있는 장소를 찾았습니다.
<?php
/*
Plugin Name: Hooks
Plugin URI: http://example.com/
Description: Hooks
Version: 1.00
Author: Hooks
Author URI: http://example.com/
*/
add_action('all','hook_catchall');
function hook_catchall(&$s1 = '', &$s2 = '', &$s3 = '', &$s4 = '') {
echo "<h1>1</h1>\n";
print_r($s1);
echo "<br />\n";
echo "<h1>2</h1>\n";
print_r($s2);
echo "<br />\n";
echo "<h1>3</h1>\n";
print_r($s3);
echo "<br />\n";
echo "<h1>4</h1>\n";
print_r($s4);
echo "<br />\n";
return $s1;
}
나는 이것을 사용하여 후크의 순서를 찾습니다. 에 대한 filters
변경 사항 add_action
을 받으려면 add_filter
.
function echo_all_hooks() {
$not_arr = array('gettext','sanitize_key','gettext_with_context','attribute_escape');
if(!in_array(current_filter(),$not_arr)) echo current_filter()."<br/>";
}
add_action('all','echo_all_hooks');
https://wordpress.org/plugins/query-monitor/ 쿼리 모니터 플러그인을 사용할 수 있습니다.