Obtenga plugin_dir_url () desde un nivel dentro del complemento

10

He escrito varios complementos utilizando la estructura:

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

Para aprovechar las ventajas de OO y la estructuración general de mi código

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é era tener una clase de singleton adicional que almacena todas las configuraciones para el complemento y agrega una capa de abstracción a través de los archivos de la clase.

Cualquier ayuda es muy apreciada.

    
pregunta setterGetter 24.10.2012 - 21:42

2 respuestas

12

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

$this->plugin_location = plugin_dir_url(dirname(__FILE__));
    
respondido por el Parham 24.10.2012 - 21:58
7

Debes hacer que todas tus clases sean independientes de su ubicación real, para que puedas moverlas fácilmente y quizás reutilizarlas en otros proyectos.

Yo crearía una clase que le diga a las otras clases qué ruta o URL usar, dejaré 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 tu 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 creas una instancia de esa clase en tu archivo de complemento principal:

$address = new PluginDirectoryAddress( __DIR__ );

Y todas las demás clases solo tienen una dependencia de la interfaz en su constructor, como esto:

public function __construct( DirectoryAddress $directory ) {}

Ahora están accediendo a la URL y la ruta solo desde la instancia pasada.

    
respondido por el fuxia 24.10.2012 - 21:51

Lea otras preguntas en las etiquetas