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

15

La documentation WordPress pour déterminer le plugin et les répertoires de contenu indique que:

WordPress utilise les constantes suivantes pour déterminer le chemin d'accès aux répertoires de contenu et de plug-in. Ceux-ci ne doivent pas être utilisés directement par les plugins ou les thèmes , mais sont répertoriés ici pour être complets.

Il énumère WP_CONTENT_DIRet WP_PLUGIN_DIRparmi les constantes que les développeurs de thèmes et de plugins ne devraient pas utiliser, probablement à cause de cela:

WordPress permet aux utilisateurs de placer leur répertoire wp-content où ils veulent, vous ne devez donc jamais supposer 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 commente également ici que ces constantes ne doivent pas être utilisées:

N'utilisez pas WP_PLUGIN_URL ou WP_PLUGIN_DIR - les plugins peuvent ne pas être dans le répertoire plugins.

Alors, quelle est la façon acceptée de référencer le chemin d'accès complet aux plugins, au contenu wp et aux dossiers de thèmes sans utiliser ces constantes?

Comme exemple simple, pour sortir le chemin complet de tous les plugins installés, je peux le faire:

<?php
$plugins = get_plugins();

foreach ($plugins as $file => $details) {
    echo WP_PLUGIN_DIR . '/' . $file . '<br>';
}

Ce qui produit une liste comme ça:

/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 pourrais vouloir le faire si j'écrivais un plugin pour permettre à l'utilisateur d'archiver sélectivement des plugins dans le cadre d'une sauvegarde de site, par exemple.)

Si l'utilisation WP_PLUGIN_DIRest incorrecte, quelle est l'alternative suggéré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 rend problématique le référencement des thèmes et des répertoires racine des plugins potentiellement errants.

pseudo
la source
Jetez un œil à l'article du Codex sur la détermination des plug-ins et des répertoires de contenu .
Charles Clarkson
2
@CharlesClarkson Je fais référence à cette page dans la première phrase de ma question. Il dit de ne pas utiliser les constantes ci-dessus, mais ne suggère pas d'alternative à des choses comme WP_PLUGIN_DIR, d'où ma question ici.
Nick

Réponses:

17

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

Pour référencer le chemin actuel

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

qui fonctionne dans les plugins et les thèmes .

Référence URl / URi dans un plugin

Pour pointer vers 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 wp-admindossier

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

Référence URl / Uri dans le wp-includesdossier

Dirigez-les vers includes_url( 'some/path' );

Un URl / URi par rapport aux sites home

Il y a home_url( 'etc' );ou get_home_url()pour ça. Similaire est get_site_url()et site_url(). Et puis il y en a aussi network_home_url(). Et tu asnetwork_admin_url()

wp-content ou le répertoire renommé

Vous pouvez redéfinir le wp-contentnom du dossier. C'est pourquoi vous l'utilisez content_url().

Comment obtenir l'URL du dossier des plugins?

Si l'utilisation de WP_PLUGIN_DIR est incorrecte, quelle est l'alternative suggéré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 vers le plugin actuel, utilisez plugin_basename();.

EDIT # 2 Si vous êtes intéressé par tous les plugins actifs latéraux, utilisez wp_get_active_network_plugins();.

Si vous n'êtes pas sur multisite, allez-y wp_get_active_and_valid_plugins();. Cela prendra en compte le multisite / réseau. Gardez à l'esprit que cela en tiendra compte si vous n'êtes pas sur plusieurs sites, mais que vous avez obtenu un sunrise.phpdropin.

Vous pouvez également les récupérer via get_option( 'active_plugins' );, ce qui n'est pas 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. Jetez un œil aux résultats de recherche sur QueryPosts.com pour plus d'informations.

Cet article va en profondeur absolue sur tous les chemins.

kaiser
la source
3
Merci pour cela, mais votre réponse semble concerner des URL plutôt que des chemins de serveur absolus, ce qui m'intéressait. Par exemple, plugins_url()renvoie l'URL vers le dossier des plugins, pas le chemin complet vers le répertoire sur le serveur. Existe-t-il des fonctions similaires pour gérer les répertoires que je ne connais pas? Ou est-ce que le conseil de ne pas utiliser la WP_PLUGIN_DIRconstante est tout simplement faux?
Nick
(Je suis spécifiquement intéressé à trouver le chemin complet vers les plugins installés autres que le plugin qui contient mon propre code, au cas où cela aiderait à expliquer.)
Nick
@Nick Voir la mise à jour.
kaiser
L'article qui "va en profondeur sur tous les plugins" n'est plus disponible. Et je ne comprends toujours pas comment obtenir le chemin absolu vers le répertoire des plugins sans utiliser WP_PLUGIN_DIR.
XedinUnknown
4
  1. Cela renvoie 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 retourné, 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 devons donc le supprimer en plugin_basename(__FILE__)premier. Pour renvoyer le nom de fichier du plugin:

    basename(__FILE__)
    
    // example: exampleplugin.php
  4. Donc, pour les utiliser pour construire un chemin vers le répertoire des plugins , nous pouvons utiliser la str_replace()fonction quelque chose 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, en cas de besoin:

    return $thePlgDir;
Joe Rhoney
la source