问题描述

对于版本控制目的,我们的客户端有一个 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 辅助翻译的英文资料结果。如果您对结果不满意,可以加入我们改善翻译效果:薇晓朵技术论坛。