首页 > 技术 > 网站 > WordPress纯代码将本地图片地址替换为CDN地址

之前我尝试了Vercel反代,想着加速博客的静态资源,把Vercel当CDN用,但是由于速度原因放弃了。后俩在认识到了Vercel加速节点后,速度的缺点解决,于是想着拿它当CDN用

但是替换文章内图片地址失败了,便想到了这个方法

食用

单纯将本地图片地址替换为CDN地址把这个代码加到主题的functions.php里去:

define('CDN_HOST','https://yourcdn.com'); 
add_filter('the_content','z_cdn_content'); 
function z_cdn_content($content){ 
  return str_replace(home_url().'/wp-content/uploads', CDN_HOST.'/wp-content/uploads', $content); 
  } 
  add_filter('wp_get_attachment_url','z_get_attachment_url',10,2); 
function z_get_attachment_url($url, $post_id){ 
  return str_replace(home_url(), CDN_HOST, $url); 
  } 

yourcdn.com是你的cdn域名

要把主题静态资源地址替换为CDN地址加个这个:

add_filter('stylesheet_directory_uri','z_cdn_stylesheet_directory_uri',10,3); 
function z_cdn_stylesheet_directory_uri($stylesheet_dir_uri, $stylesheet, $theme_root_uri) { 
   return str_replace(home_url(), CDN_HOST, $stylesheet_dir_uri); 
} 
add_filter('template_directory_uri','z_cdn_template_directory_uri',10,3); 
function z_cdn_template_directory_uri($template_dir_uri, $template, $theme_root_uri)
{ 
   return str_replace(home_url(), CDN_HOST, $template_dir_uri); 
} 

想要把 wp-content / wp-includes 静态资源替换为CDN地址这个:

define('FocusCDNHost','http://yourblog.com');//wordpress网站网址 
define('FocusCDNRemote','http://yourcdn.com');//cdn域名 
define('FocusCDNIncludes','wp-content,wp-includes');//设置加速目录 
define('FocusCDNExcludes','.php|.xml|.html|.po|.mo');//设置文件白名单 
define('FocusCDNRelative','');//Check this if you want to have links like <wp-content/abc.png> rewritten - i.e. without your blog's domain as prefix. 
   
function do_cdnrewrite_ob_start() { 
$rewriter = new FocusCDNRewriteWordpress(); 
$rewriter->register_as_output_buffer(); 
} 
add_action('template_redirect', 'do_cdnrewrite_ob_start'); 
   
class FocusCDNRewriteWordpress extends FocusCDNRewrite 
{ 
function __construct() { 
$excl_tmp = FocusCDNExcludes; 
$excludes = array_map('trim', explode('|', $excl_tmp)); 
   
parent::__construct( 
FocusCDNHost, 
FocusCDNRemote, 
FocusCDNIncludes, 
$excludes, 
!!FocusCDNRelative 
); 
} 
public function register_as_output_buffer() { 
if ($this->blog_url != FocusCDNRemote) { 
ob_start(array(&$this, 'rewrite')); 
} 
} 
   
} 
   
class FocusCDNRewrite { 
var $blog_url    = null; 
var $cdn_url     = null; 
var $include_dirs   = null; 
var $excludes    = array(); 
var $rootrelative   = false; 
   
function __construct($blog_url, $cdn_url, $include_dirs, array $excludes, $root_relative) { 
$this->blog_url   = $blog_url; 
$this->cdn_url    = $cdn_url; 
$this->include_dirs  = $include_dirs; 
$this->excludes   = $excludes; 
$this->rootrelative  = $root_relative; 
} 
   
protected function exclude_single(&$match) { 
foreach ($this->excludes as $badword) { 
if (stristr($match, $badword) != false) { 
return true; 
} 
} 
return false; 
} 
   
protected function rewrite_single(&$match) { 
if ($this->exclude_single($match[0])) { 
return $match[0]; 
} else { 
if (!$this->rootrelative || strstr($match[0], $this->blog_url)) { 
return str_replace($this->blog_url, $this->cdn_url, $match[0]); 
} else { 
return $this->cdn_url . $match[0]; 
} 
} 
} 
   
protected function include_dirs_to_pattern() { 
$input = explode(',', $this->include_dirs); 
if ($this->include_dirs == '' || count($input) < 1) { 
return 'wp/-content|wp/-includes'; 
} else { 
return implode('|', array_map('quotemeta', array_map('trim', $input))); 
} 
} 
   
public function rewrite(&$content) { 
$dirs = $this->include_dirs_to_pattern(); 
$regex = '#(?<=[(/"/'])'; 
$regex .= $this->rootrelative 
? ('(?:'.quotemeta($this->blog_url).')?') 
: quotemeta($this->blog_url); 
$regex .= '/(?:((?:'.$dirs.')[^/"/')]+)|([^//"/']+/.[^//"/')]+))(?=[/"/')])#'; 
return preg_replace_callback($regex, array(&$this, 'rewrite_single'), $content); 
} 
   
} 

相关文章