La documentation WordPress relative à Détermination des répertoires de plug-in et de contenu indique que:
WordPress utilise les constantes suivantes pour déterminer le chemin d'accès au contenu et aux répertoires du plugin. Ceux-ci ne doivent pas être utilisés directement par des plugins ou des thèmes , mais sont listés ici par souci d'exhaustivité.
Il continue à lister WP_CONTENT_DIR
et WP_PLUGIN_DIR
parmi les constantes que les développeurs de thèmes et de plugins ne devraient pas utiliser, probablement à cause de ceci:
WordPress permet aux utilisateurs de placer leur répertoire wp-content où ils veulent, vous ne devez donc jamais présumer que les plugins seront dans wp-content/plugins, ou que les téléchargements seront dans wp-content/uploads, ou que les thèmes seront dans wp contenu/thèmes.
Mark Jaquith aussi commente ici que ces constantes ne doivent pas être utilisées:
N'utilisez pas WP_PLUGIN_URL ou WP_PLUGIN_DIR - les plugins ne sont peut-être pas dans le répertoire plugins.
Alors, quel est le moyen accepté de référencer le chemin complet des dossiers plugins, wp-content et themes sans utiliser ces constantes?
Comme exemple simple, pour afficher le chemin complet de tous les plugins installés, je peux faire ceci:
<?php
$plugins = get_plugins();
foreach ($plugins as $file => $details) {
echo WP_PLUGIN_DIR . '/' . $file . '<br>';
}
Ce qui produit une liste comme celle-ci:
/var/www/wp-content/plugins/akismet/akismet.php
/var/www/wp-content/plugins/debug-bar/debug-bar.php
/var/www/wp-content/plugins/hello.php
(Je souhaiterais peut-être faire cela si j'écrivais un plugin pour permettre à l'utilisateur d'archiver de manière sélective des plugins dans le cadre d'une sauvegarde de site, par exemple.)
Si utiliser WP_PLUGIN_DIR
est incorrect, quelle est la solution proposée? Il n'y a pas d'équivalent à wp_upload_dir()
pour les plugins, les thèmes et le dossier wp-content que je peux trouver, ce qui complique le référencement des répertoires de thèmes et de plugins potentiellement errants.
Pour référencer le chemin actuel
plugin_dir_path( __FILE__ )."further/nesting/here.css";
qui fonctionne dans Plugins et thèmes .
Pour pointer sur un plugin ou un fichier de thème, utilisez
plugins_url( "path/to/file", __FILE__ );
qui ne fonctionne que dans les plugins
wp-admin
Pointez-les toujours sur admin_url( 'some/path' );
. Il y a aussi get_admin_url()
.
wp-includes
Pointez-les sur includes_url( 'some/path' );
Il y a home_url( 'etc' );
ou get_home_url()
pour cela. Similaire est get_site_url()
et site_url()
. Ensuite, il y a aussi network_home_url()
. Et vous avez network_admin_url()
wp-content
ou le répertoire renomméVous pouvez redéfinir le nom du dossier wp-content
. Par conséquent, vous utilisez content_url()
there.
Si utiliser WP_PLUGIN_DIR est incorrect, quelle est la solution proposée?
Utilisez simplement plugins_url()
sans aucun paramètre.
Si vous l'utilisez pour un plugin, cela fonctionne aussi pour les plugins MU.
EDIT # 1 Si vous êtes intéressé par le chemin du plugin actuel, utilisez plugin_basename();
.
EDIT # 2 Si vous êtes intéressé par tous les plugins actifs sidewide, utilisez wp_get_active_network_plugins();
.
Si vous n'êtes pas sur multisite, utilisez wp_get_active_and_valid_plugins();
. Cela prendra en compte multisite/réseau. Gardez à l'esprit que cela les prendra en compte si vous n'êtes pas sur plusieurs sites, mais que vous avez un sunrise.php
dropin.
Vous pouvez ainsi les récupérer via get_option( 'active_plugins' );
, ce qui est non recommandé car il ne prend pas en compte les filtres et la validation des plugins, ce qui se produit à plusieurs reprises.
Cette liste s'allonge encore et encore. Consultez les résultats de la recherche sur QueryPosts.com pour plus d’informations.
Ce article entre dans profondeur absolue sur tous les chemins.
Ceci retourne le chemin du serveur du répertoire du plugin actuel:
plugin_dir_path(__FILE__)
// example: /home/myserver/public_html/wordpress_install/wp-content/plugins/exampleplugin/
Réf.: https://codex.wordpress.org/Function_Reference/plugin_dir_path
Ne pas confondre avec:
plugins_dir_path(__FILE__)
(Notez le pluriel "plugin s " à ce sujet.)
Puisque vous ne voulez pas que le nom du répertoire du plugin soit renvoyé, nous devons le supprimer. Voici une fonction qui renvoie le répertoire du plugin et le nom du fichier:
plugin_basename(__FILE__)
// example: exampleplugin/exampleplugin.php
Mais bien sûr, nous ne voulons pas non plus le nom de fichier du plugin, nous devrons donc commencer par le supprimer de plugin_basename(__FILE__)
. Pour retourner le nom du fichier du plugin:
basename(__FILE__)
// example: exampleplugin.php
Donc, pour les utiliser afin de construire un chemin vers le répertoire plugins, nous pouvons utiliser la fonction str_replace()
comme ceci:
$myBnm = basename(__FILE__); // value: exampleplugin.php
$myDir = plugin_basename(__FILE__); // value: exampleplugin/exampleplugin.php
$myStr = str_replace($myBnm,"",$myDir); // value: exampleplugin/
$myPth = plugin_dir_path(__FILE__); // value: /home/myserver/public_html/wordpress_install/wp-content/plugins/exampleplugin/
return str_replace($myStr,"",$myPth); // returns: /home/myserver/public_html/wordpress_install/wp-content/plugins/
Et si nécessaire, cette dernière ligne peut bien sûr être affectée à une variable, pour une utilisation répétée.
Au lieu de:
return str_replace($myStr,"",$myPth); // returns: /home/myserver/public_html/wordpress_install/wp-content/plugins/
Utilisez quelque chose comme:
$thePlgDir = str_replace($myStr,"",$myPth); // returns: /home/myserver/public_html/wordpress_install/wp-content/plugins/
Et plus tard, au besoin:
return $thePlgDir;