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

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

Любая справка значительно ценится.

13
24.10.2012, 22:42
2 ответа

В подкаталоге в рамках Вашего сменного каталога можно использовать следующий код:

$this->plugin_location = plugin_dir_url(dirname(__FILE__));
16
19.02.2020, 21:59

Необходимо сделать все классы независимыми от их фактического местоположения, таким образом, можно переместить их легко и возможно снова использовать их в других проектах.

Я создал бы класс, который говорит другие классы, что путь или 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
19.02.2020, 21:59
  • 1
    Затем class.Plugin_Controller.php должен был бы требоваться файлом в более высоком каталоге, корректном? –  MikeiLL 27.02.2017, 18:09
  • 2
    @MikeiLL я только что осуществил рефакторинг код. Используйте автопогрузчик для включения класса. :) –  fuxia♦ 27.02.2017, 18:38
  • 3
    . Потребность обучиться: php-autoloader.malkusch.de/en. Этот плагин скоро подлежит рефакторингу. И некоторые модульные тесты. положительная сторона –  MikeiLL 27.02.2017, 20:59
  • 4
    Попытка @MikeiLL этот. Посмотрите объяснение на Обзоре Кода. –  fuxia♦ 27.02.2017, 21:32

Теги

Похожие вопросы