Отримайте plugin_dir_url () з одного рівня вглиб плагіна


13

Я написав кілька плагінів за допомогою структури:

/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)) . "/";

Ще одна ідея, з якою я виступав, - це створення додаткового однотонного класу, який зберігає всі параметри плагіна і додає шар абстракції через файли класу.

Будь-яка допомога дуже вдячна.

Відповіді:


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 Спробуйте це . Дивіться пояснення щодо перегляду коду .
fuxia
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.