it-swarm.com.de

Wie funktioniert das Umschreiben der W3 Total Cache CDN-URL?

Ich habe gerade W3 Total Cache S3-CDN (Origin Push) eingerichtet und die meisten URLs werden korrekt umgeschrieben, aber wir haben einige benutzerdefinierte Plugins, in denen die URLs nicht umgeschrieben werden. Wie hole ich mir die umgeschriebene URL von W3TC von einem anderen Plugin? Ich verwende derzeit den folgenden Code, um das Bild zu erfassen:

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

Ich gehe davon aus, dass es einen Filter gibt, der nur die ursprüngliche "Origin" -URL durch die Asset-URL im S3-Bucket ersetzt, aber ich konnte nicht herausfinden, wo im Code.

6
JSP

Das W3 Total Cache Plugin ändert die URL verschiedener Dateien in /w3-total-cache/lib/W3/Plugin/Cdn.php in der Funktion * ob_callback *. Es verwendet eine Reihe von Rückrufen, um einen Ausgabepuffer zu ändern. Der Code läuft wie folgt ab:

  • w3_total_cache.php ruft $root->run(); auf
  • W3_Root :: run ruft $plugin->run() für jedes Plugin in $this->_loaded_plugins auf
  • W3_Plugin_TotalCache :: run startet einen Ausgabepuffer, der W3_Plugin_TotalCache :: ob_callback aufruft
  • W3_Plugin_TotalCache :: ob_callback ruft w3tc_do_ob_callbacks () auf, das jeden in $GLOBALS['_w3tc_ob_callbacks'] gespeicherten Callback ausführt.
  • Das CDN fügt dem Global in W3_Plugin_Cdn :: run einen eigenen Rückruf hinzu. Dieser Rückruf ist W3_Plugin_Cdn :: ob_callback

Welche Callbacks dann laufen ist leider in dieser Zeile fest codiert: $buffer = w3tc_do_ob_callbacks(array('minify', 'newrelic', 'cdn', 'browsercache', 'pagecache'), $buffer);

Da dies fest codiert ist, müssen Sie den Rückruf ändern, wenn Sie jemals ändern müssen, was enthalten ist und was nicht.

Beispiel:

Ich habe ein Plugin, das JSON exportiert, und der CDN-Aspekt von W3 Total Cache hat keine URLs für JSON-Anforderungen geändert. Es stellt sich heraus, dass meine Ausgabe den w3_is_xml($buffer)-Test nicht bestanden hat.

Ich habe das Problem behoben, indem ich den einzelnen CDN-Rückruf in ein Vielfaches umgewandelt habe:

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

Nehmen Sie dann die gewünschten Änderungen vor und stellen Sie sicher, dass Sie den ursprünglichen Rückruf in der Mitte aufrufen.

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;
}
5
Tyler V.

Ich hatte ein ähnliches Problem beim Rendern eines Vorlagenteils.

Ich musste das W3_Plugin_Cdn-Plugin programmgesteuert aufrufen.

Wie von Tyler V. richtig angegeben, schlägt die w3_is_xml($buffer) fehl, wenn $ buffer nicht wie HTML oder XML aussieht. Deshalb setze ich <html> am Anfang des Vorlagenteils.

Hier ist ein Beispiel, wie ich es gemacht habe.

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

Ich hatte die gleichen Probleme und konnte auch keine Antwort bekommen. Ich habe jedoch herausgefunden, wo in der Datenbank WP die Einträge für die angehängten Bilder gespeichert sind und habe diese verwendet, um meine eigenen umgeschriebenen URLs zu erstellen.

Wenn Sie in die _postmeta-Tabelle schauen, gibt es einen Metaschlüssel "_wp_attached_file", der den Ordnerpfad zu den angehängten Bildern speichert. Mit diesen Informationen musste ich nur die URL-Struktur hinzufügen, in der sich unser S3-Bucket befindet.

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