add_action钩子以什么顺序执行?

init
wp_head
wp_footer
after_theme_setup 
etc...
???
???
???


编辑:
我也发布了我的解决方案。

评论

我的消息于14年2月25日发布,可能与wordpress.stackexchange.com/questions/135857/…重复。

后端VS前端:lance.bio/2017/10/11/…

#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:



我是自己写的,所以这里是原始参考。其中包括有关排序和功能背后决策的更多细节。