在插件中,为什么在激活插件之前不执行Add_action(‘init’)?

时间:2016-08-29 作者:Tyler Jones

我对Wordpress开发(以及php开发)是新手,所以我对插件php文件中函数的执行感到困惑。我已经看到多个指南显示如何创建register_activation_hook 函数,该函数在插件激活时执行。但是,在激活挂钩功能之后,始终会出现add_action(\'init\') 这个调用为数据库添加了一组选项。

所以我的问题是:当Wordpress评估我插件的php文件,并找到register_activation_hook 调用,为什么不执行add_action(\'init\') 是否在插件激活后调用直到插件激活?如果Wordpress评估我插件的php文件,并且有一个函数调用add_action(\'init\') 在文件中,似乎在计算页面时会执行该函数调用,因为它不在控件结构中。

我知道Wordpress在激活这个文件之前会对它进行评估,因为它知道我的插件名、作者以及所有这些。因此,如果它正在评估文件,为什么它不执行add_action(\'init\') 呼叫

我的问题有意义吗?有人能帮我理解为什么事情是这样的吗?

下面是我所说的一个例子:

register_activation_hook(__FILE__, \'halloween_store_install\');

function halloween_store_install() {
    $hween_options_arr = array(
        \'currency_sign\' => \'$\'
    );

    //save our default option values
    update_option( \'halloween_options\', $hween_options_arr );
}

add_action( \'init\', \'halloween_store_init\' ); // <-- why is this not executed until my plugin is activated?

function halloween_store_init(){
    $labels = array(
        \'name\' => __( \'Products\', \'halloween-plugin\' ),
        \'singular_name\' => __( \'Product\', \'halloween-plugin\' ),
        \'add_new\' => __( \'Add New\', \'halloween-plugin\' ),
        \'add_new_item\' => __( \'Add New Product\', \'halloween-plugin\' ),
        \'edit_item\' => __( \'Edit Product\', \'halloween-plugin\' ),
        \'new_item\' => __( \'New Product\', \'halloween-plugin\' ),
        \'all_items\' => __( \'All Products\', \'halloween-plugin\' ),
        \'view_item\' => __( \'View Product\', \'halloween-plugin\' ),
        \'search_items\' => __( \'Search Products\', \'halloween-plugin\' ),
        \'not_found\' => __( \'No products found\', \'halloween-plugin\' ),
        \'not_found_in_trash\' => __( \'No products found in Trash\', \'halloween-plugin\' ),
        \'menu_name\' => __( \'Products\', \'halloween-plugin\' )
    );

    $args = array(
        \'labels\' => $labels,
        \'public\' => true,
        \'publicly_queryable\' => true,
        \'show_ui\' => true,
        \'show_ui_menu\' => true,
        \'query_var\' => true,
        \'rewrite\' => true,
        \'capability_type\' => \'post\',
        \'has_archive\' => true,
        \'hierarchical\' => false,
        \'menu_position\' => null,
        \'supports\' => array( \'title\', \'editor\', \'thumbnail\', \'excerpt\' )
    );

    register_post_type( \'halloween-products\', $args);
}

1 个回复
最合适的回答,由SO网友:bynicolas 整理而成

WordPress是一个应用程序,在该应用程序中运行的所有内容都由挂钩调用。

然后有两个主要挂钩功能add_actionadd_filter, 但正如你所见,register_activation_hookregister_deactivation_hook 是在激活和停用上下文中使用的其他功能。

还有更多的钩子定义函数,比如钩子时间敏感操作(伪cron)的函数,比如wp_schedule_event 例如。

codex提供了一个很好的可用动作挂钩列表(按其一般称为序列排序),可用于add_actions 和过滤器一起使用add_filter.

我不知道所有定义函数的钩子都有这样的列表。

正如我在评论中所说,这些函数中的大多数只是PHP的智能包装器call_user_func 为这些挂钩提供上下文的函数。

因此,当安装插件或主题时,它不会自动运行,即使从技术上来说,它们的文件是可以读取的(至少主文件是)。

在的主文件中plugintheme, 您将找到一个注释部分,定义插件/主题的参数,如主题名称、作者、版本等。

在主题中style.css 文件将被读取并包含类似的内容

/*
 Theme Name: Twenty Thirteen
 Theme URI: http://wordpress.org/themes/twentythirteen
 Author: the WordPress team
 Author URI: http://wordpress.org/
 Description: The 2013 theme for WordPress takes us back to the blog, featuring a full range of post formats, each displayed beautifully in their own unique way. Design details abound, starting with a vibrant color scheme and matching header images, beautiful typography and icons, and a flexible layout that looks great on any device, big or small.
 Version: 1.0
 License: GNU General Public License v2 or later
 License URI: http://www.gnu.org/licenses/gpl-2.0.html
 Tags: black, brown, orange, tan, white, yellow, light, one-column, two-columns, right-sidebar, flexible-width, custom-header, custom-menu, editor-style, featured-images, microformats, post-formats, rtl-language-support, sticky-post, translation-ready
 Text Domain: twentythirteen

 This theme, like WordPress, is licensed under the GPL.
 Use it to make something cool, have fun, and share what you\'ve learned with others.
*/
类似地,在插件的主PHP文件中,您会发现一个注释部分,其中包含类似的内容

/*
 Plugin Name: My Toolset
 Plugin URI:  http://URI_Of_Page_Describing_Plugin_and_Updates
 Description: This describes my plugin in a short sentence
 Version:     1.5
 Author:      John Smith
 Author URI:  http://URI_Of_The_Plugin_Author
 License:     GPL2
 License URI: https://www.gnu.org/licenses/gpl-2.0.html
 Domain Path: /languages
 Text Domain: my-toolset
*/
最后,一旦一个主题/插件被激活,它将继续按照WP的钩子加载顺序加载其余的文件,并加载开发人员钩住这些操作钩子或过滤器的所有内容。

在这些开发人员创建的函数中,对于特定的插件或主题,所有的魔法都会发生。

userabuser对WP加载顺序做了一个非常全面且值得一读的解释here.

相关推荐

自定义发布类型的POST_ROW_ACTIONS

我正在使用this 在WordPress Admin中具有重复post函数的代码。但是,当我为自定义帖子类型添加过滤器时,如下所示:add_filter( \'directory_row_actions\', \'rd_duplicate_post_link\', 10, 2 ); (自定义帖子类型的注册名称为directory) - 它不会将其添加到条目标题下的操作行中。当我为帖子或页面执行此操作时,如下所示:add_filter( \'post_row_actions\', \'rd_dup