
春节前1月份接到一个简单的中文的wordpress建站项目,使用到了阿里云的OSS对象存储,再配合水煮鱼大神的wpjam basic插件,可以把网站的图片和其它媒体文件镜像对阿里云OSS,前端媒体文件替换为oss地址,可以提高图片加载速度。但是在这个网站中遇到一个小问题,就是插件没能把WordPress媒体库文件的URL替换为OSS地址,还有部分页面模块的背景图片也没有被替换。
折腾很久也没找到好办法,猜测可能是和使用的主题和页面编辑器插件有关,最终在AI的帮助下写了一个补充代码:
function enhance_cdn_url_replacement($url) {
// 从WordPress选项表中获取我们设置的OSS域名
$oss_domain = get_option('wpjam_oss_domain');
// 如果没有设置OSS域名或者URL为空,则直接返回原URL
if (empty($oss_domain) || empty($url)) {
return $url;
}
// 获取本地站点域名,用于匹配需要被替换的URL
$local_domain = get_site_url(); // 获取站点主域名,如 https://example.com
$local_domain_parsed = parse_url($local_domain);
$local_host = $local_domain_parsed['host']; // 提取出纯域名部分,如 example.com
// 需要被CDN替换的静态文件扩展名
$extensions = array('png', 'jpg', 'jpeg', 'gif', 'ico', 'css', 'js', 'webp', 'bmp', 'avif', 'svg', 'mp4', 'mp3', 'pdf', 'doc', 'docx');
$ext_pattern = implode('|', $extensions);
// 情况1:标准的完整URL(http://或https://)
if (strpos($url, $local_host) !== false) {
// 检查URL路径是否包含指定的文件扩展名
$path = parse_url($url, PHP_URL_PATH);
if ($path && preg_match("/\.({$ext_pattern})$/i", $path)) {
// 将本地域名替换为OSS域名
$url = str_replace($local_host, $oss_domain, $url);
}
}
// 情况2:协议相对URL(以//开头)
elseif (strpos($url, '//') === 0 && strpos($url, $local_host) !== false) {
$path = parse_url($url, PHP_URL_PATH);
if ($path && preg_match("/\.({$ext_pattern})$/i", $path)) {
// 直接将协议相对URL中的本地域名替换为OSS域名
$url = str_replace($local_host, $oss_domain, $url);
}
}
return $url;
}
// 应用于前台内容的URL替换
add_filter('wp_get_attachment_url', 'enhance_cdn_url_replacement', 999);
add_filter('the_content', function($content) {
// 使用正则匹配替换内容中的图片链接,包括可能被遗漏的格式
$local_domain = get_site_url();
$local_domain_parsed = parse_url($local_domain);
$local_host = $local_domain_parsed['host'];
$oss_domain = get_option('wpjam_oss_domain');
if (empty($oss_domain)) return $content;
// 替换标准src="http://xxx" 或 src='http://xxx'
$content = preg_replace(
'/(src=[\'\"])https?:\/\/' . preg_quote($local_host, '/') . '(\/[^\'\"]*\.(png|jpg|jpeg|gif|ico|webp))([\'\"])/i',
'$1//' . $oss_domain . '$2$4',
$content
);
// 替换内联样式中的背景图片 background-image: url(...)
$content = preg_replace(
'/(background-image:\s*url\(\s*[\'\"]?)https?:\/\/' . preg_quote($local_host, '/') . '(\/[^\'\"]*\.(png|jpg|jpeg|gif|ico|webp))([\'\"]?\s*\))/i',
'$1//' . $oss_domain . '$2$4',
$content
);
return $content;
}, 999);
// 应用于后台媒体库列表和编辑页面的URL替换
add_filter('wp_get_attachment_url', 'enhance_cdn_url_replacement', 999);
add_filter('attachment_link', 'enhance_cdn_url_replacement', 999); // 附件页面链接
function wpjam_register_oss_domain_setting() {
// 注册一个新的设置项到‘general’页面
register_setting('general', 'wpjam_oss_domain', array(
'type' => 'string',
'description' => '用于CDN加速的OSS域名,例如:cdn.yourdomain.com',
'sanitize_callback' => 'wpjam_sanitize_domain',
'show_in_rest' => false,
));
// 在常规设置页面添加字段
add_settings_field(
'wpjam_oss_domain_field', // 字段ID
'<label for="wpjam_oss_domain">OSS域名</label>', // 字段标签
'wpjam_oss_domain_field_html', // 用于输出字段HTML的回调函数
'general', // 设置页面slug
'default', // 部分ID(使用默认的‘default’部分)
array('label_for' => 'wpjam_oss_domain') // 额外参数,将label与input关联
);
}
// 定义字段的HTML输出
function wpjam_oss_domain_field_html() {
$oss_domain = get_option('wpjam_oss_domain');
// 输出input字段,建议使用纯域名,不要带http://
echo '<input type="text" id="wpjam_oss_domain" name="wpjam_oss_domain" value="' . esc_attr($oss_domain) . '" class="regular-text code" placeholder="e.g., cdn.yourdomain.com" />';
echo '<p class="description">请在此处填写您的OSS域名(不带<code>http://</code>或<code>https://</code>),用于替换网站静态资源的地址。</p>';
}
// 简单的域名清理函数,确保输入的是有效的域名格式
function wpjam_sanitize_domain($input) {
$domain = trim($input);
// 移除可能误输入的协议头
$domain = preg_replace('#^https?://#', '', $domain);
// 简单的有效性检查
if (!empty($domain) && !preg_match('/^[a-zA-Z0-9-\.]+\.[a-zA-Z]{2,}$/', $domain)) {
// 如果不符合基本域名格式,可以给出警告或清空,这里选择清空
$domain = '';
}
return $domain;
}
// 将设置初始化挂钩到‘admin_init’
add_action('admin_init', 'wpjam_register_oss_domain_setting');
把上面的代码添加到主题的functions.php文件,或者是添加到wp code之类的代码管理插件中。

代码正确添加并生效后,打开wordpress网站后台的【设置】,然后在底部的【OSS域名】处填写你的阿里云OSS域名(如果使用了自定义OSS域名,就填写自定义域名),最后保存即可。

浏览器刷新一下,或者清空一下缓存,然后重新进入wordpress网站媒体库,打开图片或文件可以看到,url已经替换成oss地址了。
注意:我遇到的情况只是个例,大多数情况可能并不会遇到,安装并配置好wpjam插件即可,并不需要如上处理。
© Copyright 2024. 悦然网络工作室/悦然wordpress建站 专注中小企业wordpress建站 All Rights Reserved.网站地图
本站图片来源为Pexels、Pixabay、Freepik、Unsplash等图片库的免费许可,CC0协议;还有部分为自己手绘,版权碰瓷请自重!法律服务:law@yueranseo.com 蜀ICP备20016391号-1 川公网安备 51011502000367号