WordPress开发笔记

WordPress重写图片上传目录,并使用专门的图片域名实现代码

满足以下两个需求,我们需要哪些操作?

  • 使用独立图片域名/CDN
  • 自定义文件存储结构

第一步:解析图片独立域名到根目录中images

假设我们要将重写的图片上传目录都集中在images中。在你的网站根目录中创建images文件夹。

你的专门的图片域名为img.***.com,将该域名解析并绑定到网站根目录的images文件夹。

第二步:将实现代码放入你的插件中

代码:

if ( ! function_exists( 'your_revise_upload_dir' ) ) :
    function your_revise_upload_dir($upload) {
        $site_url = get_home_url(get_main_site_id());
        $site_url = str_replace('www', 'img', $site_url);
        $site_id = get_current_blog_id();

        $custom_dir = '/images';

        $relpath = ABSPATH;

        $imgbase_path = $relpath. $custom_dir.'/sites'.$site_id;
        
        if ( ! file_exists( $imgbase_path ) ) { 
            wp_mkdir_p( $imgbase_path ); //如果这些目录不存在,则进行创建
        }

        
        $upload['path'] = $imgbase_path.$upload['subdir'];
        $upload['url'] = $site_url . $custom_dir.'/sites'.$site_id.$upload['subdir'];
        // $upload['subdir'] = $custom_dir;
        $upload['basedir'] = $imgbase_path;
        $upload['baseurl'] = $site_url . $custom_dir.'/sites'.$site_id;

        return $upload;
    }
endif;
add_filter('upload_dir', 'your_revise_upload_dir');

这个函数通过修改 WordPress 的 upload_dir 过滤器,将媒体文件上传到自定义的目录结构,而不是默认的 wp-content/uploads 目录。

1. 函数定义和存在性检查

if ( ! function_exists( 'your_revise_upload_dir' ) ) :
function your_revise_upload_dir($upload) {
  • 防止函数重复定义
  • $upload 参数包含 WordPress 默认的上传目录设置

2. 获取站点信息

$site_url = get_home_url(get_main_site_id());
$site_url = str_replace('www', 'img', $site_url);
$site_id = get_current_blog_id();
  • 获取主站点的首页 URL
  • 将 URL 中的 “www” 替换为 “img”(可能是为了使用 CDN 或专门的图片域名)
  • 获取当前站点的 ID(支持多站点)

3. 设置自定义目录

$custom_dir = '/images';
$relpath = ABSPATH;
$imgbase_path = $relpath. $custom_dir.'/sites'.$site_id;
  • 定义自定义目录为 /images
  • 构建完整的物理路径:网站根目录/images/sites{站点ID}

4. 创建目录

if ( ! file_exists( $imgbase_path ) ) { 
    wp_mkdir_p( $imgbase_path );
}
  • 如果目标目录不存在,自动创建(包括所有父级目录)

5. 修改上传路径配置

$upload['path'] = $imgbase_path.$upload['subdir'];
$upload['url'] = $site_url . $custom_dir.'/sites'.$site_id.$upload['subdir'];
$upload['basedir'] = $imgbase_path;
$upload['baseurl'] = $site_url . $custom_dir.'/sites'.$site_id;

修改了四个关键参数:

  • path: 物理路径
  • url: 访问 URL
  • basedir: 基础物理路径
  • baseurl: 基础 URL

6. 挂载过滤器

add_filter('upload_dir', 'your_revise_upload_dir');

将函数挂载到 upload_dir 过滤器上。

最后:启动你的插件

建议整合到你自己的插件中。启动插件测验一下吧!

效果示例

假设:

  • 站点 ID: 2
  • 域名: www.example.com
  • WordPress 安装在: /var/www/html

那么:

  • 物理路径: /var/www/html/images/sites2/2024/01/
  • 访问 URL: http://img.example.com/images/sites2/2024/01/

使用场景

这种配置常用于:

  • 多站点网络的媒体文件管理
  • 使用独立图片域名/CDN
  • 自定义文件存储结构
  • 分离静态资源与程序文件

这个实现确保了在多站点环境中每个站点都有独立的媒体存储空间,同时支持按年月自动组织文件。