web-dev-qa-db-ja.com

アクションとフィルタをフックするためにどのようにプラグインボイラープレートローダクラスを使用しますか?

WordPress Plugin BoilerplatePlugin_Name_Loader クラスは、WordPressアクションにフックするか、プラグインからフィルタをかける必要がある場合に非常に便利です。最初の作者であるTom McFarlinは、 ローダーについて

このファイルの目的は、フックの登録をカプセル化し、プラグインがロードされた適切な時点でアクションとフィルタの両方を実行することです。

多くの場合、適切なアクションやフィルタにフックする必要があります。では、どのようにしてプラグインの定型句のローダクラスを利用し、それを使用してアクションやフィルタにフックするのでしょうか。

3
iyrin

この答えはクラスとオブジェクトを扱うことの基本的な理解を仮定します。完全な答えは少し長いので、あなたが焦っているのであれば、一番下のチェックリストの要約までスキップしてください。要約がわからない場合は、答え全体を読んでそれに従ってください。


ローダーの使い方を理解するために、コアプラグインクラスのソースPlugin_Name in class-plugin-name.php を見てください。

このクラスの コードの最初のブロック は、プライベートコンテナ$loaderを宣言しています。

protected $loader;

次に、 構文 内で、関数load_dependenciesおよびdefine_public_hooks()が呼び出されていることがわかります。

public function __construct() {
    $this->plugin_name = 'plugin-name';
    $this->version = '1.0.0';
    // Our fearless loader is called from within this class object.
    $this->load_dependencies();
    $this->set_locale();
    $this->define_admin_hooks();
    $this->define_public_hooks();
}

構文の後に、関数 load_dependencies() が定義されているのがわかります。ここがプラグインによって使用されるクラスのリソースファイルが呼び出される場所です。最初のクラスのリソースファイルは ここで必要なのはplugin-name-loader.php です。

require_once plugin_dir_path( dirname( __FILE__ ) ) . 'includes/class-plugin-name-loader.php';

これを行う:

load_dependencies()関数内でプラグインが依存している追加のクラスファイルが必要です。

たとえば、プラグインのincludesディレクトリにあるファイルPlugin_Name_Alertclass-plugin-name-alert.phpというクラスを定義した場合は、次の行をload_dependencies()に追加することによってそれを要求します。

require_once plugin_dir_path( dirname( __FILE__ ) ) . 'includes/class-plugin-name-alert.php';

最初のステップは完了です。


検討を続けると、この関数の 最後に 、以前宣言された$loaderというコンテナーは、クラスPlugin_Name_Loaderの新しいオブジェクトとして定義されています。この機能:

$this->loader = new Plugin_Name_Loader();

それではスキップして define_public_hooks() を見てみましょう。これは、以前に構成体から呼び出された別の関数です。これはあなたのプラグインが使うフックを整理するのに最適な場所です。外観は次のとおりです。

private function define_public_hooks() {
    // Instantiates a new object of the class Plugin_Name_Public.
    $plugin_public = new Plugin_Name_Public( $this->get_plugin_name(), $this->get_version() );
    // This is where the loader's add_action hooks the callback function of the class object. 
    $this->loader->add_action( 'wp_enqueue_scripts', $plugin_public, 'enqueue_styles' );
    // Another action is passed to the class object.
    $this->loader->add_action( 'wp_enqueue_scripts', $plugin_public, 'enqueue_scripts' );
}

ここで2つの重要なことが起こっているのがわかります。

  1. クラスのオブジェクトがインスタンス化されます。

  2. オブジェクトを引数として受け入れるローダーのカスタムバージョンのadd_action()が実行されます。

これがローダーが私たちにとって役に立つところです。フックとコールバック関数だけをadd_action()に渡す代わりに、ローダーは独自のカスタムadd_action()add_filter()関数を使用します。これにより、hook、class、およびコールバック関数の3つの引数を渡すことができます。このようにそれはあなたのクラスで関数を見つける方法を知っています。

参考までに、ローダーのバージョンのadd_action()によるすべての 許容される引数 を次に示します。

add_action( $hook, $component, $callback, $priority = 10, $accepted_args = 1 )

WordPressのadd_action()add_filter()にクラス関数を渡す方法はありますが、これはボイラープレートのローダーを通して行う方法です。

これをやりなさい:

関数define_public_hooks()の中で、あなたは今調べた2つのステップを繰り返すでしょう。覚えておいてほしいのは、これはPlugin_Name_Alertのためのクラスファイルが以前に必要だったからです。

1.あなたのクラスのオブジェクトをインスタンス化します:

$plugin_alert = new Plugin_Name_Alert();

2.ローダーのadd_action()を使用して$plugin_alertの関数をフックします。

$this->loader->add_action( 'init', $plugin_alert, 'my_alert_function' );

それがすべてです。これはあなたがあなたがする必要があるすべてをしたことを確かめるためのチェックリストです。


チェックリストのまとめ

0.クラスを作成してください。 上記の例ではPlugin_Name_Alertincludes/class-plugin-name-alert.phpとして定義されています。これはテストのために使うことができる非常に単純なクラスです。これはWordPressが初期化されるたびに警告メッセージを表示するために使います。

<?php

class Plugin_Name_Alert {

    public function my_alert_function() {
        ?> <script>alert("VAE VICTIS!");</script> <?php
    }

}

1. load_dependencies()関数内にクラスを必要とします。 この例では使用しました:require_once plugin_dir_path( dirname( __FILE__ ) ) . 'includes/class-plugin-name-alert.php';

2.関数define_public_hooks()内でクラスのオブジェクトをインスタンス化します。 これが例です:
$plugin_alert = new Plugin_Name_Alert();

3.最後に、あなたのクラスからの関数をactionまたはfilterにフックします。これはdefine_public_hooks()内で行います。 これが例です:
$this->loader->add_action( 'init', $plugin_alert, 'my_alert_function' );

4
iyrin