web-dev-qa-db-ja.com

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

私はこの構造を使っていくつかのプラグインを書きました:

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

OOを利用して全体的に自分のコードを構築するために

クラスファイルの中から、ベースプラグインのURLを取得する必要がある場合があります...私は以下を使用してきましたが、もっと良い方法があると確信しています。

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

私が試したもう1つのアイデアは、プラグインのすべての設定を格納するシングルトンクラスを追加し、クラスファイルを介して抽象化層を追加することでした。

任意の助けは大歓迎です。

12
setterGetter

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

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

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

私は他のクラスにどのパスまたは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とパスにアクセスしています。

7
fuxia