Como o W3 Total Cache CDN URL reescreva o trabalho?

Acabei de configurar W3 Total Cache S3 CDN (push de origem) e a maioria dos URLs está sendo reescrita corretamente, mas temos alguns plugins personalizados onde os URLs não estão sendo reescritos. Como faço para pegar o URL reescrito do W3TC a partir de outro plugin? Atualmente, estou usando o seguinte código para pegar a imagem:

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

Estou assumindo que existe um filtro de algum tipo que apenas substitua o URL original “origem” com o URL do recurso no balde S3, mas não consegui encontrar onde no código.

Solutions Collecting From Web of "Como o W3 Total Cache CDN URL reescreva o trabalho?"

O W3 Total Cache plugin altera o URL de vários arquivos em /w3-total-cache/lib/W3/Plugin/Cdn.php na function * ob_callback *. Ele usa uma série de callbacks para modificar um buffer de saída. O código corre assim:

  • w3_total_cache.php chama $root->run(); root- $root->run();
  • W3_Root :: run calls $plugin->run() para cada plugin em $this->_loaded_plugins
  • W3_Plugin_TotalCache :: run inicia um buffer de saída que chama W3_Plugin_TotalCache :: ob_callback
  • W3_Plugin_TotalCache :: ob_callback chama w3tc_do_ob_callbacks () que executa qualquer retorno de chamada armazenado em $GLOBALS['_w3tc_ob_callbacks']
  • O CDN adiciona seu próprio retorno de chamada ao global em W3_Plugin_Cdn :: run. Esse retorno de chamada é W3_Plugin_Cdn :: ob_callback

O callbacks então executado é infelizmente codificado na linha: $buffer = w3tc_do_ob_callbacks(array('minify', 'newrelic', 'cdn', 'browsercache', 'pagecache'), $buffer);

Porque isso é codificado, se você precisar modificar o que está incluído e o que não é, você terá que mudar seu retorno de chamada.

Exemplo:

Eu tenho um plugin que exporta JSON, eo aspecto CDN do W3 Total Cache não está alterando URLs para pedidos JSON. Acontece que minha saída estava falhando no teste w3_is_xml($buffer) .

Eu corri-o, transformando sua única chamada de CDN em múltiplos, como este:

 // 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'); } 

Em seguida, faça as mudanças que eu preciso, certificando-se de chamar sua chamada de retorno original no meio.

 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; } 

Eu tive um problema semelhante ao renderizar um modelo.

Eu tive que invocar o plugin W3_Plugin_Cdn programaticamente.

Conforme indicado corretamente por Tyler V., o w3_is_xml($buffer) falhará se $ buffer não parecer HTML ou XML, por isso estou colocando no início da parte do modelo.

Aqui está um exemplo sobre como eu fiz.

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

Eu tive os mesmos problemas e também não consegui responder. No entanto, eu encontrei onde no database WP está armazenando as inputs para as imagens anexadas e usou isso para criar meus próprios URLs reescritos.

Se você olhar na tabela _postmeta há uma meta_key “_wp_attached_file” que armazena o caminho da pasta para as imagens anexadas. Com essa informação, eu só precisava adicionar a estrutura de URL para onde o nosso balde S3 está localizado.

 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];