Obtenga plugin_dir_url () desde un nivel profundo dentro del complemento

13

He escrito varios complementos usando la estructura:

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

Para aprovechar OO y estructurar mi código en general

Desde el archivo de clase hay veces que necesito obtener la URL del complemento base ... He estado usando lo siguiente, pero estoy seguro de que hay una mejor manera:

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

Otra idea con la que jugué fue tener una clase singleton adicional que almacena todas las configuraciones para el complemento y agregar una capa de abstracción a través de los archivos de clase.

Cualquier ayuda es muy apreciada.

setterGetter
fuente

Respuestas:

16

En un subdirectorio dentro de su directorio de complementos puede usar el siguiente código:

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

Debe hacer que todas sus clases sean independientes de su ubicación real, de modo que pueda moverlas fácilmente y quizás reutilizarlas en otros proyectos.

Crearía una clase que les diga a las otras clases qué ruta o URL usar, deje que implemente una interfaz para que pueda reutilizar las otras clases, incluso en un tema o completamente fuera de WordPress.

Ejemplo para la interfaz:

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

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

La implementación concreta en su complemento podría verse así:

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;
    }
}

Ahora crea una instancia de esa clase en su archivo de complemento principal:

$address = new PluginDirectoryAddress( __DIR__ );

Y todas las otras clases tienen solo una dependencia de la interfaz en su constructor, así:

public function __construct( DirectoryAddress $directory ) {}

Están accediendo a la URL y la ruta solo desde la instancia pasada ahora.

fuxia
fuente
Entonces el class.Plugin_Controller.phparchivo debe ser requerido por el archivo en el directorio superior, ¿correcto?
MikeiLL
@MikeiLL Acabo de refactorizar el código. Use un autocargador para incluir la clase. :)
fuxia
Gracias. Necesito educarme: php-autoloader.malkusch.de/en . Este plugin se refactorizará pronto. Y algunas pruebas unitarias.
MikeiLL
1
@MikeiLL Prueba este . Consulte la explicación en Revisión de código .
fuxia