add_action
钩子以什么顺序执行?即
init
wp_head
wp_footer
after_theme_setup
etc...
???
???
???
编辑:
我也发布了我的解决方案。
#1 楼
“数据!数据!数据!”他不耐烦地哭了。 “没有
黏土我就无法制造砖块。”
-铜山毛榉历险记
所以让我们从一个安装时不使用任何插件,并且仅使用一个Text窗口小部件即可激活TwentyTwelve主题。
对于主页,按以下顺序进行以下
do_action
调用:muplugins_loaded
registered_taxonomy
registered_taxonomy
registered_taxonomy
registered_taxonomy
registered_taxonomy
registered_post_type
registered_post_type
registered_post_type
registered_post_type
registered_post_type
plugins_loaded
sanitize_comment_cookies
setup_theme
unload_textdomain
load_textdomain
after_setup_theme
load_textdomain
load_textdomain
auth_cookie_malformed
auth_cookie_valid
set_current_user
init
registered_post_type
registered_post_type
registered_post_type
registered_post_type
registered_post_type
registered_taxonomy
registered_taxonomy
registered_taxonomy
registered_taxonomy
registered_taxonomy
widgets_init
register_sidebar
register_sidebar
register_sidebar
wp_register_sidebar_widget
wp_register_sidebar_widget
wp_register_sidebar_widget
wp_register_sidebar_widget
wp_register_sidebar_widget
wp_register_sidebar_widget
wp_register_sidebar_widget
wp_register_sidebar_widget
wp_register_sidebar_widget
wp_register_sidebar_widget
wp_register_sidebar_widget
wp_register_sidebar_widget
wp_loaded
parse_tax_query
parse_tax_query
posts_selection
template_redirect
admin_bar_init
add_admin_bar_menus
get_header
wp_head
wp_enqueue_scripts
wp_print_styles
wp_print_scripts
get_template_part_content
begin_fetch_post_thumbnail_html
end_fetch_post_thumbnail_html
get_template_part_content
get_template_part_content
get_template_part_content
get_template_part_content
get_template_part_content
get_template_part_content
get_template_part_content
get_template_part_content
get_template_part_content
begin_fetch_post_thumbnail_html
end_fetch_post_thumbnail_html
get_sidebar
dynamic_sidebar_before
dynamic_sidebar
dynamic_sidebar_after
get_footer
twentytwelve_credits
wp_footer
wp_print_footer_scripts
wp_before_admin_bar_render
wp_after_admin_bar_render
shutdown
如果要检查操作顺序以及每个操作被触发多少次,则可以使用例如:
add_action( 'shutdown', function(){
print_r( $GLOBALS['wp_actions'] );
});
或此美化版本:
add_action( 'shutdown', function(){
foreach( $GLOBALS['wp_actions'] as $action => $count )
printf( '%s (%d) <br/>' . PHP_EOL, $action, $count );
});
得到以下列表:
muplugins_loaded (1)
registered_taxonomy (10)
registered_post_type (10)
plugins_loaded (1)
sanitize_comment_cookies (1)
setup_theme (1)
unload_textdomain (1)
load_textdomain (3)
after_setup_theme (1)
auth_cookie_malformed (1)
auth_cookie_valid (1)
set_current_user (1)
init (1)
widgets_init (1)
register_sidebar (3)
wp_register_sidebar_widget (12)
wp_loaded (1)
parse_request (1)
send_headers (1)
parse_tax_query (2)
parse_query (1)
pre_get_posts (1)
posts_selection (1)
wp (1)
template_redirect (1)
wp_default_scripts (1)
wp_default_styles (1)
admin_bar_init (1)
add_admin_bar_menus (1)
get_header (1)
wp_head (1)
wp_enqueue_scripts (1)
wp_print_styles (1)
wp_print_scripts (1)
loop_start (1)
the_post (10)
get_template_part_content (10)
begin_fetch_post_thumbnail_html (2)
end_fetch_post_thumbnail_html (2)
loop_end (1)
get_sidebar (1)
dynamic_sidebar_before (1)
dynamic_sidebar (1)
dynamic_sidebar_after (1)
get_footer (1)
twentytwelve_credits (1)
wp_footer (1)
wp_print_footer_scripts (1)
admin_bar_menu (1)
wp_before_admin_bar_render (1)
wp_after_admin_bar_render (1)
shutdown (1)
PS:您还应该签出John Blackbourn伟大的Query Monitor插件。 (我与此插件无关)
评论
确实很好!
– jdm2112
15年3月19日在19:30
感谢您提及查询监视器。似乎是这种情况下的有用插件。
– D.A.H
2015年10月16日,9:53
@kraftner感谢您的更新,我一直计划(但忘了它)直接链接到故事本身作为适当的来历,显然我的Sherlock Holmes搜索foo当时并不理想;-)
–birgire
17 Mar 1 '17 at 13:22
我喜欢报价,并希望了解更多背景信息。因为我已经拥有了自己的链接,所以为什么不只在此处进行更新。 :)
–卡夫纳
17年1月1日在14:22
超过4年的帖子,仍然很有帮助。非常感谢!
–塞巴斯蒂安·卡兹马里克
19年2月5日在10:15
#2 楼
这是WordPress负载图表→来源@Rarst
评论
至少添加源,甚至更好:找到此问题的重复源。
– fuxia♦
2014年9月29日在8:36
其实我不知道我从哪里得到的。我已将此图像保存在PC上。否则我会那样做。
– Robert hue
2014-09-29 8:43
它也发布在Tom Mc Farlin主页上:WordPress页面生命周期-> tommcfarlin.com/wordpress-page-lifecycle
– D.A.H
15年10月16日在10:05
#3 楼
找到了解决方案!感谢@birgire提供不错的答案。我还要补充一点,有时不会触发
muplugins_loaded
,因此我将使用plugins_loaded
作为第一个钩子(但是那时,用户授权尚未完成。如果要检查用户的授权,则init
是最早的钩子。那)... 1)查询监视器-您可以看到页面加载时发生的一切,即每个执行函数的持续时间等等(查看插件页面上的所有屏幕截图):
2)WP-DEBUG-BAR + WP-DEBUG-SLOW-ACTIONS:
a)调试站点上的钩子(动作)运行列表。
b)查看每个操作的持续时间(不起作用):
#4 楼
没有两个请求是完全相同的。一种快速而肮脏(但非常准确)的方法来找出正在发生的情况是在do_action
中的wp-includes/plugin.php
函数的开头临时添加一行,该行记录$tag
,例如:if (isset($some_get_or_post_trigger_var)) file_put_contents(ABSPATH . 'action.log', "$tag\n", FILE_APPEND);
#5 楼
基本序列也可以在官方文档中找到:https://codex.wordpress.org/Plugin_API/Action_Reference
#6 楼
这类似于@birgire的答案,但是它提供了一个不错的报告,可以针对WordPress网站中的任何URL显示该报告。您需要以管理员级别用户身份登录,然后将?wp-hooks
添加到要测试的URL的末尾。/**
* WordPress Hooks Reference
*
* Dump all action and filter hooks at the bottom of any page
* by adding ?wp-hooks onto the end of the URL while logged-in
* as an Administrator level user.
*/
function kevinlearynet_hooks_reference() {
// Only shown for Administrator level users when ?list-wp-hooks is added to the URL
$trigger = isset( $_GET['wp-hooks'] ) && current_user_can( 'manage_options' );
if ( ! $trigger ) return;
// Capture and sort filters and hooks
$filters = array_keys( $GLOBALS['wp_filter'] );
sort( $filters );
$actions = array_keys( $GLOBALS['wp_actions'] );
// Output rough template
ob_start();
?>
<section class="wp-hooks">
<h1 class="wp-hooks__h1">WordPress Hooks Reference</h1>
<div class="wp-hooks__lists">
<div class="wp-hooks__col">
<h2 class="wp-hooks__h2">Actions</h2>
<?php foreach ( $actions as $hook ) : ?>
<p class="wp-hooks__hook"><?php echo $hook; ?></p>
<?php endforeach; ?>
</div>
<div class="wp-hooks__col">
<h2 class="wp-hooks__h2">Filters</h2>
<?php foreach ( $filters as $hook ) : ?>
<p class="wp-hooks__hook"><?php echo $hook; ?></p>
<?php endforeach; ?>
</div>
</div>
</section>
<style>
.wp-hooks {
padding: 30px;
margin: 30px;
border-radius: 4px;
background: white;
font-size: 16px;
line-height: 1.4;
height: 50vh;
min-height: 500px;
overflow-y: scroll;
}
.wp-hooks__lists {
display: flex;
}
.wp-hooks__col {
flex: 1;
width: 50%;
}
.wp-hooks__h1 {
margin: 0 0 20px;
}
.wp-hooks__h2 {
line-height: 1;
font-size: 18px;
margin: 0 0 10px;
}
.wp-hooks__hook {
padding: 0;
margin: 0;
}
</style>
<?php
ob_end_flush();
}
add_action( 'shutdown', 'kevinlearynet_hooks_reference' );
输出看起来像this:
我是自己写的,所以这里是原始参考。其中包括有关排序和功能背后决策的更多细节。
评论
我的消息于14年2月25日发布,可能与wordpress.stackexchange.com/questions/135857/…重复。后端VS前端:lance.bio/2017/10/11/…