如何获得WordPress的钩子/动作运行顺序?


Answers:


82

“数据!数据!数据!” 他不耐烦地哭了。“我不能没有粘土就制造砖头。”

-铜山毛榉历险记

因此,让我们从没有插件的安装中收集一些真实数据,并且仅通过单个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

感谢您提及查询监视器。似乎是这种情况下的有用插件。
DAH,2015年

@kraftner,谢谢您的更新,我一直计划(但忘了它)作为故事的直接来源直接链接到故事本身,显然我的夏洛克·福尔摩斯搜索foo当时并不理想;-)
birgire

1
我喜欢报价,并希望了解更多背景信息。因为我已经拥有了自己的链接,所以为什么不只在此处进行更新。:)
kraftner,2017年

1
超过4年的帖子,仍然很有帮助。非常感谢!
Sebastian Kaczmarek


2

找到解决方案!

感谢@birgire提供了不错的答案。我还要补充一点,muplugins_loaded有时它不会被解雇,所以我将使用它plugins_loaded作为第一个钩子(但是那时,用户授权还没有完成。如果要检查用户的授权,那么init最早的钩子是)。 ..

ps存在优秀的插件:

1)查询监视器 -您可以看到页面加载时发生的一切,即每个执行函数的持续时间等等(查看插件页面上的所有屏幕截图):

在此处输入图片说明

2)WP-DEBUG-BAR + WP-DEBUG-SLOW-ACTIONS
a)在您的站点上调试钩子(actions)运行列表。
b)查看每个动作的持续时间(不起作用): 在此处输入图片说明


1

没有两个请求是完全相同的。一种快速而肮脏(但非常准确)的方法来找出正在发生的情况是在函数的开头临时添加一行,do_actionwp-includes/plugin.php其中记录$tag,例如:

if (isset($some_get_or_post_trigger_var)) file_put_contents(ABSPATH . 'action.log', "$tag\n", FILE_APPEND);

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.