编辑:此处列出了插件。
#1 楼
@Arlen:正如Keith S指出的那样,Adam Brown的“钩子列表”是WordPress钩子的实际资源。但是,它并不完美:它没有按调用时的顺序显示挂钩,
在调用时不提供文件名或行号,
它不提供传递的大量参数,
它不是完整的列表,因为可以动态调用某些钩子,
它不显示插件的钩子。
因此,尽管Adam的列表是一个很好的资源,尤其是对于了解历史上添加了挂钩的时间而言,但它的作用几乎不如您能够在自己网站上的任何给定页面上检测到挂钩。 >我一直在想这个想法,所以您的问题促使我编写了一个名为“ Instrument Hooks for WordPress”的插件。您可以在屏幕截图下方找到完整的源,也可以从gist此处下载它。
因此,这是仪器外观的屏幕截图:
通过使用URL参数
instrument=hooks
触发检测,即:http://example.com?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;
}
}
}
评论
我会...这只是您可能只使用一两次的事情之一,但是当您使用它时,您要感谢星星:)
– Keith S.
2010年8月14日下午3:09
迈克,太酷了!但是,对于实际了解每个过滤器/操作的功能,您会建议什么呢?是否有一个文件列出所有这些文件及其“活动”?谢谢!
–提交
2010年8月14日13:10
@Amit-是的,这是一个很难的问题。 :)感谢您的询问。不幸的是,我看不到任何自动化方法,就像我上面列出的挂钩一样,因此我没有一个完美的答案。理想情况下,有人会为每个钩子写一个很棒的博客文章(或在这里问一个得到很好答案的问题),然后“ Google it”将是您的答案。照原样,我使用的是调试IDE(PhpStorm + XDEBUG,在2010年9月之前售价为49美元),并且设置了断点并仅跟踪执行的代码。不过,也许有更好的方法,如果有人想到了,请告诉我们!
– MikeSchinkel
2010年8月14日在22:44
哇,这是我见过的最好的答案。反正
– Arlen Beiler
10年8月16日在13:15
@Mike:一个简单的问题,为什么将它存储在数据库中而不是内存或临时流中?
– hakre
2010年8月18日在8:31
#2 楼
调试栏动作挂钩插件显示针对当前请求触发的动作列表。需要调试栏插件。
评论
还有“调试栏操作和过滤器插件”以及“调试栏挂钩日志”。
– Synetech
13年7月28日在17:24
#3 楼
食典有行动参考和过滤参考。亚当·布朗(Adam Brown)创建了一个钩子数据库,该钩子数据库在源代码中包含所有钩子,并从Wiki页面,版本信息和源代码链接中添加了文档。您可以通过在Codex中编写文档来改进它。当然,某些挂钩是动态的,具体取决于其他数据。使用
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
操作挂钩。评论
Adam Browns数据库不仅是这两个页面的组合,而且在WordPress中列出了每个动作和过滤器。还是那不是你的意思。
– Arlen Beiler
2010年8月13日在18:25
@Arlen:是的,的确,我重写了它,这样更清楚了。
– Jan Fabry
2010年8月13日在18:56
#4 楼
虽然原始,但此插件代码可能有帮助吗?如果要改为查看过滤器,请用“ add_filter”切换“ add_action”。加载插件,然后刷新网站的主页。加载后,停用非常麻烦,因此只需重命名plugins文件夹下的插件文件并再次刷新该站点即可,它将自动停用。我已经多次使用此技巧来解决问题或找到可以插入东西的地方。<?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;
}
评论
它可能并不漂亮,但实际上在某些情况下可能是最快,最简单的方法(我经常使用“ printf调试”来修复小型记事本和命令行项目中的小问题,而不是使用整个IDE)。
– Synetech
13年7月28日在17:02
#5 楼
我用这个来查找钩子的顺序。要获取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');
#6 楼
正如@kaiser建议不要仅发布链接,我正在改善它。但是不可能在这里使用整个代码,所以我在这里只用很少的图像来说明它如何完整地描述每个WordPress钩子。您可以在此处找到有关钩子,类,函数,插件的信息。描述每个
评论
当我在寻找钩子信息时,这是我的首选网站。WordPress钩子数据库WordPress终于记录了它的所有钩子。 :D您可以在那里浏览和搜索。