web-dev-qa-db-ja.com

カスタムWP_CONTENT_DIRでUPLOADSフォルダの名前を変更する

バージョン管理の目的で、私たちのクライアントはこのようなディレクトリ構造を持つWordPressアプリを持っています。

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

wp-config.php内:

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

今、彼女はアプリディレクトリ内のすべてのデフォルトのWordPressフォルダの名前を変更したいです。

pluginsthemesでは、WP_PLUGIN_DIRregister_theme_directory() を使うことで簡単にできます。しかし、どういうわけか、uploadsフォルダの名前を変更するのは簡単ではありません。

私はUPLOADS定数を使って多くの修正を試みましたが、カスタムアップロードフォルダは常にWordPressディレクトリの中に作成されるため、役に立ちません。

この問題を回避する方法はありますか?

7
MinhTri

調べた後、私は upload_dir filterを使用することになりました。

これがuploadsmediaに変更するためにfunctions.phpで試したものです。誰かに役立つことを願っています:)

 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;
 });

ガイドラインとupload_dirフィルタに関する提案を寄せてくれた @gmazzap に感謝します。

5
MinhTri

_wp_upload_dir のソースを見ると、次のようになります。

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

そのため、UPLOADSABSPATHに対する相対的なfoderを定義するためにのみ使用できます。これはあなたの設定の/WordPressフォルダであると思います。

同じ関数で、get_option('upload_path')get_option('upload_url_path')が空の場合、WP_CONTENT_DIR.'/uploads'WP_CONTENT_URL.'/uploads'を定義する限り、アップロードフォルダのパスとURLがそれぞれWP_CONTENT_DIRWP_CONTENT_URLに設定されていることがわかります。 OPで。

UPLOADSat allを定義せず、uploadsフォルダがまだ/app/uploadsに解決されない場合、データベースに'upload_path'および'upload_url_path'オプションの some 値が含まれている可能性があります。

2つの可能性があります。

  • それらのオプションを削除する
  • "pre_option_{$option}" filtersを使用して、これらのオプションに対してget_option()に空の値を強制的に返すようにします(ただし、falseではなく、フィルターは無視されます)。

2番目の可能性としては、コードは次のようになります。

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

WP_CONTENT_DIRWP_CONTENT_URLを定義している限り、上記のコードを配置し、UPLOADS定数を定義せずに、uploadsフォルダを正しく解決する必要があります。

それが起こらないなら、 some filterに作用する何か、例えば upload_dir がなければなりません。

4
gmazzap