web-dev-qa-db-ja.com

アクティブ化されたプラグインは自動的にそのメソッドが他の人に利用可能であることを意味しますか WP 関数?

私はこのようなWordPressのプラグインを作りました:

Class MY_CLASS {
//codes
}
Global $myclass;
$myclass = New MY_CLASS ();

プラグインをインストールして有効化した後、myclass.phpファイルを含めずに他のプラグインでこのクラスを使用できますか?例えば、他のプラグインでは:

Global $myclass;
$myclass->a = 'dog';
5
Jenny

技術的には可能です。しかし、私は少し違ったアプローチを使うでしょう。あなたの2番目のプラグインが最初にロードされている場合はエラーになります。他のプラグインのクラスを置き換えたい場合は、これを行うのは困難です。

そのため、オブジェクトを作成するために特定の優先度でplugins_loadedにフックし、優先度の低い(後で)同じフックの2番目のプラグインのオブジェクトを使用します。

プラグイン1

add_action( 'plugins_loaded', array ( 'My_Class', 'init' ), 10 );

class My_Class
{
    /**
     * Handler for the action 'init'. Instantiates this class.
     *
     * @since 0.1
     * @return void
     */
    public static function init()
    {
        // Named global variable to make access for other scripts easier.
        $GLOBALS[ __CLASS__ ] = new self;
    }
    public function __construct() { /* Do something awesome. */ }
}

プラグイン2

add_action( 'plugins_loaded', 'depending_operation', 11 );

function depending_operation()
{
    if ( empty ( $GLOBALS[ 'My_Class' ] ) )
    {
        return;
    }
    /* Do something awesome again. */
}

add_action()の10と11に注意してください。これにより、2番目のプラグインが最初のプラグインより前に実行されることは決してありません。最初のプラグインがアクティブで動作しているかどうかを確認する必要があります。

これで他のプラグインのクラスを置き換えることさえできます。

プラグイン3

add_action( 'plugins_loaded', 'replace_global_class', 12 );

function replace_global_class()
{
    $GLOBALS[ 'My_Class' ] = new Replacement_Class;
}

class Replacement_Class {}
17
fuxia

メインプラグインファイルのみが自動的に含まれます。だからあなたのプラグインがこのように構成されているなら:

  • wp-content/plugins/my-plugin/
    • my-plugin.php
    • my-class.php

WordPressに含まれるのはmy-plugin.phpだけです。 my-class.phpファイルからmy-plugin.phpを含めることで、MyClassが他の人にも利用可能であることを確認できます。

3
Jan Fabry

toschoの答えはとても役に立ちました!あなたがアドオンで拡張可能なプラグインを作っているのであれば、追加するだけで、アドオンはまだOOPになることができます。

プラグイン2

class My_Class_Addon(){
public function __construct() { /* Do something awesome as an addon to My_Class */ }
}

add_action( 'plugins_loaded', 'My_Class_Addon_loader', 11 );
function My_Class_Addon_loader(){
    if(empty($GLOBALS[ 'My_Class' ])){
        return;
    }
    $this_my_class = new My_Class_Addon();
}
0
adrock42