問題描述

對於版本控制目的,我們的客户端有一個 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 目錄中。

有沒有辦法解決這個問題?

最佳解決方案

在挖掘之後,我最終用 upload_dir 過濾器。

這是我在 functions.php 中嘗試將 uploads 更改為 media 。希望它可以幫助某人:)

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

非常感謝 @gmazzap 的指南和關於 upload_dir 過濾器的建議!

次佳解決方案

如果您查看_wp_upload_dir 的來源,您會看到:

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

所以 UPLOADS 只能用於定義一個相對於 ABSPATH 的編碼器,我猜是你的設置中的/WordPress 文件夾。

在同一功能中,您可以看到,如果 get_option('upload_path')get_option('upload_url_path')為空,則上傳文件夾的路徑和 URL 分別設置為 WP_CONTENT_DIR.'/uploads'WP_CONTENT_URL.'/uploads',對於您來説應該是完美的,只要您定義 WP_CONTENT_DIRWP_CONTENT_URL,就像在 OP 。

如果您根本沒有定義 UPLOADS,並且 uploads 文件夾仍然未解析到/app/uploads,那麼很可能您的數據庫包含'upload_path''upload_url_path'選項的某些值。

你有兩種可能:

  • 刪除這些選項

  • 使用"pre_option_{$option}"過濾器強制 get_option()為這些選項返回一些空白 (但不是 false 或過濾器將被忽略) 。

對於第二種可能性,代碼可能是這樣的:

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

使用上述代碼,並且沒有任何 UPLOADS 常量定義,只要您定義 WP_CONTENT_DIRWP_CONTENT_URL,則應正確解析 uploads 文件夾。

如果沒有發生這種情況,必須有某些過濾器,例如 upload_dir

參考文獻

注:本文內容整合自 Google/Baidu/Bing 輔助翻譯的英文資料結果。如果您對結果不滿意,可以加入我們改善翻譯效果:薇曉朵技術論壇。