Obtenha plugin_dir_url () de um nível profundo no plugin

13

Eu escrevi vários plugins usando a estrutura:

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

Para tirar proveito do OO e da estruturação geral do meu código

No arquivo de classe, há momentos em que preciso obter o URL do plug-in base ... 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 idéia com a qual eu brinquei foi ter uma classe singleton adicional que armazena todas as configurações do plug-in e adiciona uma camada de abstração através dos arquivos da classe.

Qualquer ajuda é muito apreciada.

setterGetter
fonte

Respostas:

16

Em um subdiretório dentro do diretório do plug-in, você pode usar o seguinte código:

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

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

Eu criaria uma classe que dissesse às outras classes qual caminho ou URL usar, que implementasse uma interface para que você pudesse reutilizar as outras classes, talvez até 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 plugin 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 você cria uma instância dessa classe no seu arquivo principal de plug-in:

$address = new PluginDirectoryAddress( __DIR__ );

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

public function __construct( DirectoryAddress $directory ) {}

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

fuxia
fonte
Então, o class.Plugin_Controller.phparquivo no diretório superior precisaria ser solicitado, correto?
27617 MikeiLL
@ MikeiLL Acabo de refatorar o código. Use um carregador automático para incluir a classe. :)
fuxia
Obrigado. Preciso me educar: php-autoloader.malkusch.de/en . Este plug-in deve ser refatorado em breve. E alguns testes de unidade.
MikeiLL 27/02
1
@ MikeiLL Experimente este . Veja a explicação em Revisão de código .
fuxia