web-dev-qa-db-ja.com

プラグインで、プラグインがアクティブになる前にadd_action( 'init')が実行されないのはなぜですか?

私はWordpressの開発(そして一般的にはphp)に不慣れなので、私のプラグインのphpファイルの中の関数の実行について混乱しています。私はプラグインがアクティブになったときに実行されるregister_activation_hook関数を作成することを示す複数のガイドを見ました。ただし、activationフック関数の後には、データベースに多数のオプションを追加するadd_action('init')呼び出しが常にあります。

Wordpressが私のプラグインのphpファイルを評価してregister_activation_hook呼び出しを見つけたとき、なぜそれがafterプラグインがアクティブになるまで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);
}
2
Tyler Jones

WordPressはアプリケーションであり、そのアプリケーション内で実行されるすべてのものはフックによって呼び出されます。

その場合、2つのメインフック関数は add_actionadd_filter ですが、 register_activation_hookregister_deactivation_hook はアクティブ化と非アクティブ化のコンテキストで使用される他の関数です。

例えば wp_schedule_event のような時間に敏感なアクション(擬似クーロン)をフックする関数のような、フック定義関数がもっとあります。

コーデックスは add_actions と共に使用される利用可能なアクションフック(一般的にsequenceと呼ばれる順)の良いリストを提供し、 add_filter と共に使用されるフィルタを提供します。

私は関数を定義しているすべてのフックのためのそのようなリストを知りません。

私のコメントで述べたように、これらの関数のほとんどは、これらのフックに文脈を与えるPHPの call_user_func 関数の単なるインテリジェントラッパーです。

そのため、プラグインやテーマがインストールされると、それらのファイルが技術的に読み取られても(少なくともメインファイルが読み込まれても)自動的には実行されません。

plugin または theme のメインファイルには、テーマ名、作者、バージョンなど、プラグイン/テーマのパラメータを定義するコメントセクションがあります。

テーマでは、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のフックロードシーケンスに従って残りのファイルのロードを続け、開発者がこれらのアクションフックまたはフィルタにフックしたものすべてをロードします。

そしてそれらの開発者が作成した関数では、すべての魔法はその特定のプラグインまたはテーマに起こります。

WPロードシーケンスのかなり包括的で読む価値のある説明はuserabuser here によって作られました。

2
bynicolas