W3 Total缓存CDN URL重写是如何工作的?

时间:2013-02-04 作者:JSP

我刚刚设置了W3 Total Cache S3 CDN(源推送),大多数URL都被正确重写,但我们有一些自定义插件,其中URL没有被重写。如何从另一个插件获取W3TC的重写URL?我目前正在使用以下代码获取图像:

wp_get_attachment_image_src( get_post_thumbnail_id(), \'car-thumb\');

我假设有一个某种过滤器,它只是用S3 bucket上的资产url替换原始“源”url,但我无法找到代码中的位置。

3 个回复
SO网友:Tyler V.

W3 Total Cache插件更改W3 Total Cache/lib/W3/plugin/Cdn中各种文件的URL。函数*ob\\u callback*中的php。它使用一系列回调来修改输出缓冲区。代码如下所示:

w3\\u total\\u缓存。php调用$root->run();

  • W3\\u根::运行调用$plugin->run() 对于中的每个插件$this->_loaded_plugins
  • W3\\u Plugin\\u TotalCache::run启动一个输出缓冲区,该缓冲区调用W3\\u Plugin\\u TotalCache::ob\\u callbacks(),它运行存储在中的任何回调$GLOBALS[\'_w3tc_ob_callbacks\'],不幸的是,随后运行的回调在这一行中是硬编码的:$buffer = w3tc_do_ob_callbacks(array(\'minify\', \'newrelic\', \'cdn\', \'browsercache\', \'pagecache\'), $buffer);

    因为这是硬编码的,如果您需要修改包含的内容和不包含的内容,那么您必须更改它们的回调。

    Example:

    我有一个导出JSON的插件,W3 Total Cache的CDN方面没有更改JSON请求的任何URL。结果是我的输出没有通过w3_is_xml($buffer) 测验

    我通过将单个CDN回调转换为多个来修复它,如下所示:

    // Modify the output buffer callbacks of W3 Total Cache to work with the JSON API
    if (!empty($GLOBALS[\'_w3tc_ob_callbacks\']) && isset($GLOBALS[\'_w3tc_ob_callbacks\'][\'cdn\'])) {
        // Back-up the original value of $GLOBALS[\'_w3tc_ob_callbacks\'][\'cdn\']
        // This should be W3_Plugin_Cdn::ob_callback
        $this->cdn_ob_callback = $GLOBALS[\'_w3tc_ob_callbacks\'][\'cdn\'];
    
        // Replace $GLOBALS[\'_w3tc_ob_callbacks\'][\'cdn\'] with out own method
        // which will call the original callback in between two of our own
        $GLOBALS[\'_w3tc_ob_callbacks\'][\'cdn\'] = array($this, \'do_multiple_cdn_ob_callbacks\');
    }
    
    然后做我需要的更改,确保在中间调用他们原来的回调。

    public function do_multiple_cdn_ob_callbacks(&$buffer) {
        // Frist run our own callback to add an XML string to the buffer
        // so that the content passes the w3_is_xml($buffer) test
        $buffer = $this->w3_total_cache_ob_callback_start($buffer);
    
        // Next run the original callback, which will replace the asset URLs
        $buffer = call_user_func($this->cdn_ob_callback, $buffer);
    
        // Finally, run another callback of our own to remove the XML string
        $buffer = $this->w3_total_cache_ob_callback_end($buffer);
        return $buffer;
    }
    

  • SO网友:ermannob

    在渲染模板部件时,我遇到了类似的问题。

    我必须以编程方式调用W3\\u Plugin\\u Cdn插件。

    正如Tyler V.所正确指出的w3_is_xml($buffer) 如果$buffer看起来不像HTML或XML,就会失败,这就是为什么我要<html> 在模板零件的开头。

    这里有一个关于我是如何做到的例子。

    if (class_exists(\'W3_Plugin_Cdn\')) {
        $cdn_handler = new W3_Plugin_Cdn();
        ob_start();
        echo \'<html>\';
        get_template_part($templatepart, $templatepartdetail);
        $buffer = ob_get_contents();
        $cdn_handler->ob_callback($buffer);
        $buffer = substr($buffer, strlen(\'<html>\'));
        ob_end_clean();
        echo $buffer;
    }
    

    SO网友:Dak

    我也有同样的问题,也找不到答案。然而,我确实找到了WP在数据库中存储附加图像条目的位置,并使用它创建了我自己的重写URL。

    如果查看\\u postmeta表,则有一个meta\\u键“\\u wp\\u attached\\u file”,用于存储附加图像的文件夹路径。有了这些信息,我只需要添加S3 bucket所在位置的URL结构。

    global $postid;
    $bucketName = "your_bucket_name_goes_here";
    $postThumbNailID = get_post_meta($post->ID, \'_thumbnail_id\');
    $postThumbNailUrl = get_post_meta($postThumbNailID[0], \'_wp_attached_file\');
    $s3BucketURL = "http://".$bucketName.".s3.amazonaws.com/files/".$postThumbNailUrl[0];
    

    结束

    相关推荐

    如何将特定模板排除在CDN缓存之外

    我在自己的WordPress博客上使用一个特定的模板来显示一个包含随机帖子的页面。最近,我将W3 Total Cache配置为使用内容交付网络(CDN)。当用户未以管理员身份登录时,将通过CDN提供站点的某些元素,而不是从其所在的原始服务器获取“实时”版本。我注意到,如果站点通过CDN提供服务,那么随机化将不起作用,但如果直接从原始服务器提供服务,则效果会非常好。更准确地说,第一次调用随机帖子页面时,将显示随机帖子。但是,如果再次调用页面(或从浏览器刷新),将再次显示相同的帖子。然而,正常工作时,每次访问

    W3 Total缓存CDN URL重写是如何工作的? - 小码农CODE - 行之有效找到问题解决它

    W3 Total缓存CDN URL重写是如何工作的?

    时间:2013-02-04 作者:JSP

    我刚刚设置了W3 Total Cache S3 CDN(源推送),大多数URL都被正确重写,但我们有一些自定义插件,其中URL没有被重写。如何从另一个插件获取W3TC的重写URL?我目前正在使用以下代码获取图像:

    wp_get_attachment_image_src( get_post_thumbnail_id(), \'car-thumb\');

    我假设有一个某种过滤器,它只是用S3 bucket上的资产url替换原始“源”url,但我无法找到代码中的位置。

    3 个回复
    SO网友:Tyler V.

    W3 Total Cache插件更改W3 Total Cache/lib/W3/plugin/Cdn中各种文件的URL。函数*ob\\u callback*中的php。它使用一系列回调来修改输出缓冲区。代码如下所示:

    w3\\u total\\u缓存。php调用$root->run();

  • W3\\u根::运行调用$plugin->run() 对于中的每个插件$this->_loaded_plugins
  • W3\\u Plugin\\u TotalCache::run启动一个输出缓冲区,该缓冲区调用W3\\u Plugin\\u TotalCache::ob\\u callbacks(),它运行存储在中的任何回调$GLOBALS[\'_w3tc_ob_callbacks\'],不幸的是,随后运行的回调在这一行中是硬编码的:$buffer = w3tc_do_ob_callbacks(array(\'minify\', \'newrelic\', \'cdn\', \'browsercache\', \'pagecache\'), $buffer);

    因为这是硬编码的,如果您需要修改包含的内容和不包含的内容,那么您必须更改它们的回调。

    Example:

    我有一个导出JSON的插件,W3 Total Cache的CDN方面没有更改JSON请求的任何URL。结果是我的输出没有通过w3_is_xml($buffer) 测验

    我通过将单个CDN回调转换为多个来修复它,如下所示:

    // Modify the output buffer callbacks of W3 Total Cache to work with the JSON API
    if (!empty($GLOBALS[\'_w3tc_ob_callbacks\']) && isset($GLOBALS[\'_w3tc_ob_callbacks\'][\'cdn\'])) {
        // Back-up the original value of $GLOBALS[\'_w3tc_ob_callbacks\'][\'cdn\']
        // This should be W3_Plugin_Cdn::ob_callback
        $this->cdn_ob_callback = $GLOBALS[\'_w3tc_ob_callbacks\'][\'cdn\'];
    
        // Replace $GLOBALS[\'_w3tc_ob_callbacks\'][\'cdn\'] with out own method
        // which will call the original callback in between two of our own
        $GLOBALS[\'_w3tc_ob_callbacks\'][\'cdn\'] = array($this, \'do_multiple_cdn_ob_callbacks\');
    }
    
    然后做我需要的更改,确保在中间调用他们原来的回调。

    public function do_multiple_cdn_ob_callbacks(&$buffer) {
        // Frist run our own callback to add an XML string to the buffer
        // so that the content passes the w3_is_xml($buffer) test
        $buffer = $this->w3_total_cache_ob_callback_start($buffer);
    
        // Next run the original callback, which will replace the asset URLs
        $buffer = call_user_func($this->cdn_ob_callback, $buffer);
    
        // Finally, run another callback of our own to remove the XML string
        $buffer = $this->w3_total_cache_ob_callback_end($buffer);
        return $buffer;
    }
    

  • SO网友:ermannob

    在渲染模板部件时,我遇到了类似的问题。

    我必须以编程方式调用W3\\u Plugin\\u Cdn插件。

    正如Tyler V.所正确指出的w3_is_xml($buffer) 如果$buffer看起来不像HTML或XML,就会失败,这就是为什么我要<html> 在模板零件的开头。

    这里有一个关于我是如何做到的例子。

    if (class_exists(\'W3_Plugin_Cdn\')) {
        $cdn_handler = new W3_Plugin_Cdn();
        ob_start();
        echo \'<html>\';
        get_template_part($templatepart, $templatepartdetail);
        $buffer = ob_get_contents();
        $cdn_handler->ob_callback($buffer);
        $buffer = substr($buffer, strlen(\'<html>\'));
        ob_end_clean();
        echo $buffer;
    }
    

    SO网友:Dak

    我也有同样的问题,也找不到答案。然而,我确实找到了WP在数据库中存储附加图像条目的位置,并使用它创建了我自己的重写URL。

    如果查看\\u postmeta表,则有一个meta\\u键“\\u wp\\u attached\\u file”,用于存储附加图像的文件夹路径。有了这些信息,我只需要添加S3 bucket所在位置的URL结构。

    global $postid;
    $bucketName = "your_bucket_name_goes_here";
    $postThumbNailID = get_post_meta($post->ID, \'_thumbnail_id\');
    $postThumbNailUrl = get_post_meta($postThumbNailID[0], \'_wp_attached_file\');
    $s3BucketURL = "http://".$bucketName.".s3.amazonaws.com/files/".$postThumbNailUrl[0];
    

    相关推荐

    隐藏本地CDN创建的子域

    不知道我的问题是否有意义。我创建了一个子域来存储一些静态文件(如图像)。因此,一些图像现在从http://imgs.example.com/imagefilename.png现在,问题是,存储在这个子域下的所有文件http://imgs.example.com/ 是公开可见的,我想隐藏、重定向或显示404。你知道如何做到这一点吗?当前子域中的文件显示--Index of /<一个视频文件。mp4一个图像文件。imgs的Apache服务器。iconicwebteam。com端口80