Obtenha o plugin_dir_url () de um nível profundo dentro do plugin

10

Eu escrevi vários plugins usando a estrutura:

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

Para aproveitar o OO e estruturar todo o meu código

Dentro do arquivo de classe, há momentos em que preciso obter o URL do plug-in básico ... Estou usando o seguinte, mas tenho certeza de que há uma maneira melhor:

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

Outra ideia com a qual eu brincava era ter uma classe singleton adicional que armazenasse todas as configurações do plug-in e adicionasse uma camada de abstração por meio dos arquivos de classe.

Qualquer ajuda é muito apreciada.

    
por setterGetter 24.10.2012 / 21:42

2 respostas

12

Em um subdiretório dentro do seu diretório de plugins, você pode usar o seguinte código:

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

Você deve tornar todas as suas turmas independentes de sua localização real, para que você possa movê-las facilmente e reutilizá-las em outros projetos.

Eu criaria uma classe que informa às outras classes qual caminho ou URL usar, deixe-a implementar uma interface para que você possa reutilizar as outras classes, talvez até mesmo em um tema ou completamente fora do WordPress.

Exemplo para a interface:

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

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

A implementação concreta no seu plug-in pode ser assim:

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

Agora crie uma instância dessa classe no seu arquivo de plug-in principal:

$address = new PluginDirectoryAddress( __DIR__ );

E todas as outras classes têm apenas uma dependência na interface em seu construtor, assim:

public function __construct( DirectoryAddress $directory ) {}

Eles estão acessando a URL e o caminho somente a partir da instância passada agora.

    
por fuxia 24.10.2012 / 21:51