web-dev-qa-db-fra.com

Récupère plugin_dir_url () à un niveau au sein du plugin

J'ai écrit plusieurs plugins en utilisant la structure:

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

Afin de tirer parti de OO et de la structuration globale de mon code

Dans le fichier de classe, il me faut parfois obtenir l'URL du plugin de base ... J'ai utilisé les éléments suivants, mais je suis sûr qu'il existe un meilleur moyen:

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

Une autre idée à laquelle je me suis habitué était d'avoir une classe singleton supplémentaire qui stocke tous les paramètres du plugin et d'ajouter une couche d'abstraction via les fichiers de classe.

Toute aide est grandement appréciée.

12
setterGetter

Dans un sous-répertoire de votre répertoire de plug-in, vous pouvez utiliser le code suivant:

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

Vous devez rendre toutes vos classes indépendantes de leur emplacement réel, afin de pouvoir les déplacer facilement et éventuellement les réutiliser dans d'autres projets.

Je créerais une classe qui indique aux autres classes le chemin ou l'URL à utiliser, laissez-la implémenter une interface afin que vous puissiez réutiliser les autres classes, même dans un thème ou complètement en dehors de WordPress.

Exemple pour l'interface:

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

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

L'implémentation concrète dans votre plugin pourrait ressembler à ceci:

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

Maintenant, vous créez une instance de cette classe dans votre fichier de plugin principal:

$address = new PluginDirectoryAddress( __DIR__ );

Et toutes les autres classes ont juste une dépendance sur l'interface dans leur constructeur, comme ceci:

public function __construct( DirectoryAddress $directory ) {}

Ils accèdent maintenant à l'URL et au chemin depuis l'instance passée.

7
fuxia