问题描述
对于版本控制目的,我们的客户端有一个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文件夹。
使用plugins和themes,我们可以通过使用WP_PLUGIN_DIR和register_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_DIR和WP_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_DIR和WP_CONTENT_URL,则应正确解析uploads文件夹。
如果没有发生这种情况,必须有某些过滤器,例如upload_dir。
参考文献
注:本文内容整合自Google/Baidu/Bing辅助翻译的英文资料结果。如果您对结果不满意,可以加入我们改善翻译效果:薇晓朵技术论坛。