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.

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__));

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.


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
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.