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

10

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 plug-in de base ... J'utilise 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 stockait 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.

    
posée setterGetter 24.10.2012 - 21:42

2 réponses

12

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__));
    
réponse donnée Parham 24.10.2012 - 21:58
7

Vous devez créer toutes vos classes indépendamment de leur emplacement actuel 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, la laisse 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 plug-in 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;
    }
}

Vous créez maintenant 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 à l'URL et au chemin uniquement à partir de l'instance transmise maintenant.

    
réponse donnée fuxia 24.10.2012 - 21:51

Lire d'autres questions sur les étiquettes