Ottieni plugin_dir_url () da un livello profondo all'interno del plugin


13

Ho scritto diversi plugin usando la struttura:

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

Per sfruttare OO e strutturare il mio codice in generale

Dall'interno del file di classe ci sono volte in cui ho bisogno di ottenere l'URL del plugin di base ... Ho usato il seguente, ma sono sicuro che c'è un modo migliore:

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

Un'altra idea con cui mi sono divertito era quella di avere una classe singleton aggiuntiva che memorizza tutte le impostazioni per il plugin e l'aggiunta di un livello di astrazione tramite i file di classe.

Qualsiasi aiuto è molto apprezzato.

Risposte:


16

In una sottodirectory all'interno della directory del plug-in è possibile utilizzare il seguente codice:

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

7

Dovresti rendere tutte le tue lezioni indipendenti dalla loro posizione attuale, in modo da poterle spostare facilmente e magari riutilizzarle in altri progetti.

Vorrei creare una classe che indichi alle altre classi quale percorso o URL utilizzare, lasciandolo implementare un'interfaccia in modo da poter riutilizzare le altre classi magari anche in un tema o completamente al di fuori di WordPress.

Esempio per l'interfaccia:

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

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

L'implementazione concreta nel tuo plugin potrebbe apparire così:

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

Ora crei un'istanza di quella classe nel tuo file plugin principale:

$address = new PluginDirectoryAddress( __DIR__ );

E tutte le altre classi hanno solo una dipendenza dall'interfaccia nel loro costruttore, in questo modo:

public function __construct( DirectoryAddress $directory ) {}

Ora accedono all'URL e al percorso solo dall'istanza passata.


Quindi class.Plugin_Controller.phpdovrebbe essere richiesto dal file nella directory superiore, giusto?
MikeiLL,

@MikeiLL Ho appena refactored il codice. Utilizzare un caricatore automatico per includere la classe. :)
fuxia

Grazie. Ho bisogno di educarmi : php-autoloader.malkusch.de/en . Questo plug-in è previsto per un refactoring presto. E alcuni test unitari.
MikeiLL,

1
@MikeiLL Prova questo . Vedi la spiegazione su Revisione del codice .
fuxia
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.