Obtenez plugin_dir_url () d'un niveau au plus profond du plugin

13

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

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

Afin de profiter de l'OO et de la structuration globale de mon code

Dans le fichier de classe, il y a des moments où j'ai besoin d'obtenir l'URL du plugin de base ... J'ai utilisé ce qui suit, 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 avec laquelle j'ai joué é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.

setterGetter
la source

Réponses:

16

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

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

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

Je créerais une classe qui dirait aux autres classes le chemin ou l'URL à utiliser, la laisser implémenter une interface afin que vous puissiez réutiliser les autres classes peut-être 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 de 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 à l'interface dans leur constructeur, comme ceci:

public function __construct( DirectoryAddress $directory ) {}

Ils accèdent maintenant à l'URL et au chemin uniquement à partir de l'instance transmise.

fuxia
la source
Ensuite, le class.Plugin_Controller.phpfichier devrait être requis par le fichier dans le répertoire supérieur, n'est-ce pas?
MikeiLL
@MikeiLL Je viens de refactoriser le code. Utilisez un chargeur automatique pour inclure la classe. :)
fuxia
Je vous remercie. Besoin de me renseigner: php-autoloader.malkusch.de/en . Ce plugin doit être refactoré prochainement. Et quelques tests unitaires.
MikeiLL
1
@MikeiLL Essayez celui-ci . Voir l' explication sur la révision du code .
fuxia