プラグイン内の1つのレベルからplugin_dir_url()を取得します


13

構造を使用していくつかのプラグインを作成しました:

/plugins/myplugin/myplugin.php /plugins/myplugin/class/class-myclass.php

オブジェクト指向とコード全体の構造化を活用するために

クラスファイル内からベースプラグインのURLを取得する必要がある場合があります...私は次を使用していますが、より良い方法があると確信しています:

$this->plugin_location = substr(plugin_dir_url(__FILE__),0, strrpos(plugin_dir_url(__FILE__), "/",-2)) . "/";

もう1つのアイデアは、プラグインのすべての設定を保存する追加のシングルトンクラスを作成し、クラスファイルを介して抽象化レイヤーを追加することでした。

どんな助けも大歓迎です。

回答:


16

プラグインディレクトリ内のサブディレクトリでは、次のコードを使用できます。

$this->plugin_location = plugin_dir_url(dirname(__FILE__));

7

すべてのクラスを実際の場所から独立させる必要があります。そうすれば、クラスを簡単に移動したり、他のプロジェクトで再利用したりできます。

使用するパスまたはURLを他のクラスに伝えるクラスを作成し、インターフェイスを実装して、他のクラスをテーマ内またはWordPress以外で再利用できるようにします。

インターフェースの例:

interface DirectoryAddress
{
    /**
     * @return string Dir URL with trailing slash
     */
    public function url();

    /**
     * @return string Dir path with trailing slash
     */
    public function path();
}

プラグインの具体的な実装は次のようになります。

class PluginDirectoryAddress implements DirectoryAddress
{
    private $path;

    private $url;

    public function __construct( $dirpath )
    {
        $this->url  = plugins_url( '/', $dirpath );
        $this->path = plugin_dir_path( $dirpath );
    }

    /**
     * @return string Dir URL with trailing slash
     */
    public function url() {
        return $this->url;
    }

    /**
     * @return string Dir path without trailing slash
     */
    public function path() {
        return $this->path;
    }
}

次に、メインプラグインファイルにそのクラスのインスタンスを作成します。

$address = new PluginDirectoryAddress( __DIR__ );

そして、他のすべてのクラスは、次のように、コンストラクターのインターフェースに依存しています。

public function __construct( DirectoryAddress $directory ) {}

現在、渡されたインスタンスからのみURLとパスにアクセスしています。


次に、class.Plugin_Controller.php上位ディレクトリのファイルで必要になる必要がありますか?
MikeiLL

@MikeiLLコードをリファクタリングしました。オートローダーを使用してクラスを含めます。:)
fuxia

ありがとうございました。自分自身を教育する必要がありますphp-autoloader.malkusch.de/en。このプラグインは、すぐにリファクタリングする予定です。そしていくつかのユニットテスト。
MikeiLL

1
@MikeiLL これを試してみてください。Code Review説明を参照してください。
FUXIA
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.