IT博客汇
  • 首页
  • 精华
  • 技术
  • 设计
  • 资讯
  • 扯淡
  • 权利声明
  • 登录 注册

    WordPress非插件实现静态资源CDN功能

    小残发表于 2015-06-20 10:54:07
    love 0

    题目可能有些扯远了,实际上我想表达的是既然我们用上了七牛的源站加速这一功能,不如再做到底——将缓存插件的CDN功能关掉,我们自己添加代码实现。方法也很简单,主要就是将静态资源地址更换为另外一个地址。

    (例如,所有的图片地址为www.exehack.net更改为 cdn.exehack.net即可以使用所述代码) 不知道小残这样描述大家能不能听懂


    将本地图片地址替换为CDN地址:

    添加至主题目录functions.php中:

    define('CDN_HOST','//cdn.exehack.net');
    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);
      }

    注意

    define('CDN_HOST','//www.exehack.net'); 

    需要替换为你自己的CDN地址。

    将主题静态资源地址替换为CDN地址:

    添加至主题目录functions.php中:

    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://www.exehack.net');//wordpress网站网址
    define('FocusCDNRemote','http://cdn.exehack.net');//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 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);
    }
    }

    如果您并没有使用前面的“将本地图片地址替换为CDN地址”代码,还需补充一条:

    define('CDN_HOST','//cdn.exehack.net');
    小残博客 点击此处订阅博客 作者:小残博客网
    本站部分文章来自网络,版权归原作者,转载请保留原作者署名!
    本文来自小残博客>>文章地址:“http://www.exehack.net/187.html”


沪ICP备19023445号-2号
友情链接