Получить 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)) . "/";

Еще одна идея, с которой я играл, заключалась в том, чтобы иметь дополнительный синглтон-класс, в котором хранятся все настройки для плагина, и добавить слой абстракции через файлы классов.

Любая помощь очень ценится.

setterGetter
источник

Ответы:

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