web-dev-qa-db-fra.com

Que devrais-je utiliser à la place de WP_CONTENT_DIR et WP_PLUGIN_DIR?

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.

14
Nick

Fichier de référence dans le chemin actuel ou plus profond imbriqué

Pour référencer le chemin actuel

plugin_dir_path( __FILE__ )."further/nesting/here.css";

qui fonctionne dans Plugins et thèmes .

Référence URl/URi dans un plugin

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

Référence URl/URi dans le dossier wp-admin

Pointez-les toujours sur admin_url( 'some/path' );. Il y a aussi get_admin_url().

Référence URl/Uri dans le dossier wp-includes

Pointez-les sur includes_url( 'some/path' );

Un URl/URi par rapport au site home

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.

Comment obtenir l'URL du dossier des plugins?

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.


Lectures complémentaires

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.

13
kaiser
  1. 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.)

  2. 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
    
  3. 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
    
  4. 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/
    
  5. 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;
    
4
Joe Rhoney