web-dev-qa-db-fra.com

Renommez le dossier UPLOADS avec WP_CONTENT_DIR personnalisé

Pour contrôler les versions, notre client dispose d’une application WordPress dotée d’une structure de répertoires semblable à celle-ci:

.
|_____app
|  |_____themes
|  |_____plugins
|  |_____uploads
|_____index.php
|_____WordPress
|_____wp-config.php

Dans wp-config.php:

define('WP_CONTENT_DIR', __DIR__ . '/app');
define('WP_CONTENT_URL', WP_HOME . '/app');

Maintenant, elle veut renommer tous les dossiers WordPress par défaut dans le répertoire app.

Avec plugins et themes, nous pouvons le faire facilement en utilisant WP_PLUGIN_DIR et register_theme_directory () . Mais, d’une certaine manière, il n’est pas facile de renommer le dossier uploads.

J'ai essayé de nombreuses modifications avec la constante UPLOADS, mais cela ne peut pas aider car le dossier de téléchargement personnalisé est toujours créé dans le répertoire WordPress.

Existe-t-il un moyen de résoudre ce problème?

7
MinhTri

Après avoir fouillé, j'ai fini par utiliser upload_dir filter.

Voici ce que j'ai essayé dans functions.php de changer uploads en media. J'espère que ça peut aider quelqu'un aussi :)

 add_filter('upload_dir', function($uploads)
 {
     $custom = [];

     foreach ($uploads as $key => $value) {
         if ( false !== strpos($value, '/app/uploads') ) {
             $custom[$key] = str_replace('/app/uploads', '/app/media', $value);
         } else {
             $custom[$key] = $value;
         }
     }

     return $custom;
 });

Merci beaucoup à @gmazzap pour les instructions et la suggestion concernant le filtre upload_dir!

5
MinhTri

Si vous regardez la source de _wp_upload_dir , vous verrez:

if (defined('UPLOADS') && ! (is_multisite() && get_site_option('ms_files_rewriting'))) {
    $dir = ABSPATH.UPLOADS;
    $url = trailingslashit($siteurl).UPLOADS;
}

Donc, UPLOADS ne peut être utilisé que pour définir un modificateur relatif à ABSPATH, qui, je suppose, est le dossier /WordPress dans votre configuration.

Dans la même fonction, vous pouvez voir que si get_option('upload_path') et get_option('upload_url_path') sont vides, le chemin et l'URL du dossier de téléchargement sont définis sur, respectivement, WP_CONTENT_DIR.'/uploads' et WP_CONTENT_URL.'/uploads', ce qui devrait être parfaitement correct pour vous, tant que vous définissez WP_CONTENT_DIR et WP_CONTENT_URL comme dans OP.

Si vous ne définissez pas UPLOADSat all et que le dossier uploads n'est toujours pas résolu en /app/uploads, il est fort probable que votre base de données contienne some valeur pour les options 'upload_path' et 'upload_url_path'.

Vous avez 2 possibilités:

  • supprimer ces options
  • utilisez "pre_option_{$option}" filters pour forcer get_option() à renvoyer quelque chose de vide pour ces options (mais pas false sinon les filtres seront ignorés).

Pour la deuxième possibilité, le code pourrait être quelque chose comme ceci:

add_filter('pre_option_upload_path', '__return_empty_string');
add_filter('pre_option_upload_url_path', '__return_empty_string');

Avec le code ci-dessus en place et sans aucune constante UPLOADS définie, tant que vous définissez WP_CONTENT_DIR et WP_CONTENT_URL, le dossier de téléchargement doit être résolu correctement.

Si cela ne se produit pas, il doit y avoir quelque chose qui agit sur some filter, par exemple upload_dir .

4
gmazzap