Lorsque je développe des plugins, je les teste sur plusieurs versions de WordPress en créant un lien symbolique vers mon répertoire de plugins dans les différents wp-content
répertoires. C'est génial car je n'ai à modifier les fichiers qu'une seule fois, mais cela casse une construction importante pour générer des références aux ressources dans mon plugin: __FILE__
fait référence à l'emplacement physique du plugin, pas celui de wp-content
. Comment dois-je résoudre ce problème?
Ma structure de répertoire ressemble à ceci:
/path/to/wordpress/development/dir/
plugin-development/
monkeyman-rewrite-analyzer/
monkeyman-rewrite-analyzer.php
js/
monkeyman-rewrite-analyzer.js
versions/
3.1/
wp-content/
plugins/
monkeyman-rewrite-analyzer
comme lien symbolique vers le plugin ci-dessus
3.1-multi-dir/
wp-content/
plugins/
monkeyman-rewrite-analyzer
comme lien symbolique vers le plugin ci-dessus
3.1-multi-domain/
wp-content/
plugins/
monkeyman-rewrite-analyzer
comme lien symbolique vers le plugin ci-dessus
Si je veux mettre le fichier Javascript en file d'attente, je devrais utiliser plugins_url( 'monkeyman-rewrite-analyzer.js', [base file] )
, mais l'utilisation __FILE__
ici ne fonctionnera pas, car le chemin d'accès au fichier sera /path/to/wordpress/development/dir/plugin-development/monkeyman-rewrite-analyzer/monkeyman-rewrite-analyzer.php
, non /path/to/wordpress/development/dir/versions/*/wp-content/plugins/monkeyman-rewrite-analyzer/monkeyman-rewrite-analyzer.php
, donc WordPress ne peut pas supprimer la première partie et générer une URL relative à l'installation de WordPress.
la source
WP_PLUGIN_URL
n'est pas recommandée car les administrateurs devraient être autorisés à changer le nom du répertoire de ce plugin spécifique, mais y a-t-il également une autre raison de l'éviter? Et en effet, votre ticket serait une solution simple./external/folder/banana-plugin/
l'administrateur est lié à ce répertoire/httpd-root/wp-content/plugins/apple-plugin/
? Ensuite, il essaiera d'aller vers/wp-content/plugins/banana-plugin/
, non? Et je crois que l'administrateur devrait être libre de choisir les noms de répertoire des plugins individuels?J'utilise actuellement une astuce pour obtenir l'emplacement du fichier relatif à WordPress:
wp_get_active_and_valid_plugins()
retourne les chemins d'accès aux fichiers, leswp_settings.php
boucle et inclut les fichiers . Ainsi, la$plugin
variable globale fera référence à votre plugin actuel (bien sûr uniquement lorsque le plugin est chargé, donc je l'enregistre dans une variable globale préfixée):Étant donné que les plugins peuvent également être chargés en tant que plugins à utiliser ou réseau et que ces boucles utilisent d'autres noms de variables , le code complet ressemble à ceci:
Le remplacement est toujours
__FILE__
, donc si quelqu'un change le nom de la variable de boucle à l'avenir, mon code devrait toujours fonctionner pour 99% de toutes les installations, seule ma configuration de développement échouera et je peux facilement publier une nouvelle version.la source
global
. Grâce à votre message ici, j'ai réalisé que je pouvais le rendre beaucoup plus simple. BTW, je teste égalementfalse === strpos( __FILE__, WP_CONTENT_DIR )
avant d'exécuter vos instructions if car je suppose que si le plugin est dans le,WP_CONTENT_DIR
il n'est pas lié par un lien symbolique; J'espère que c'est une logique valable.Un commentaire dans le bug 46260 suggère d'utiliser à la
$_SERVER["SCRIPT_FILENAME"]
place de__FILE__
. Est-ce que ça marche?la source
index.php
inclutlibrary.php
,$_SERVER['SCRIPT_FILENAME']
enlibrary.php
sera toujoursindex.php
. Mais merci pour la référence au bug, je vais le suivre de près!$_SERVER["SCRIPT_FILENAME"]
fonctionne si vous l'utilisez correctement. Il vous suffit de l'utiliser pour définir un chemin de base, puis d'inclure vos fichiers à l'aide d'un chemin relatif à ce chemin de base.Quelque chose comme:
Notez que cela est plus utile lorsque vous n'avez pas encore accès à wp-blog-header.php (c'est-à-dire lors du traitement d'une demande de formulaire basée sur ajax)
la source