it-swarm.com.de

WP Skriptversionierung bricht Cross-Site-Caching?

Ich lade JQuery aus dem Google CDN mit dem folgenden Code:

wp_deregister_script('jquery'); 
 wp_register_script(
    'jquery', // handle - WP uses this name to refer to script
    'http://ajax.googleapis.com/ajax/libs/jquery/1.4.4/jquery.min.js',
     array(), // Array of handles representing scripts that this one depends on.
     false, // Version number - defaults to false.
     false // false = put script in header, true = put in footer
 );
wp_enqueue_script('jquery');

In Firebug sehe ich, dass WordPress '? Ver = 3.0.4' an die URL anhängt, um das Caching zu steuern. Tatsächlich scheint es keine Möglichkeit zu geben, WP daran zu hindern, der URL etwas anzuhängen - ich kann es selbst bereitstellen String im Aufruf von wp_register_script (), aber WP verwendet den Standardwert 'ver = 3.0.4', wenn ich ihn leer lasse (oder "false")

Ich glaube, die angehängte Versionszeichenfolge hindert den Browser des Benutzers daran, eine zwischengespeicherte Kopie der Datei, die er möglicherweise von einer anderen Website heruntergeladen hat, erneut zu verwenden. Z.B.

  1. Der Benutzer besucht www.example.com, das ajax.googleapis.com/ajax/libs/jquery/1.4.4/jquery.min.js lädt, sodass es sich jetzt im Browser-Cache befindet.
  2. Der Nutzer besucht dann meine Website, die ajax.googleapis.com/ajax/libs/jquery/1.4.4/jquery.min.js?ver=3.0.4 lädt
  3. Der Browser des Benutzers verwendet die zwischengespeicherte Kopie nicht, da die URLs unterschiedlich sind.

Da Cross-Site-Caching einer der Hauptgründe ist, warum ich Googles CDN verwenden möchte, gibt es dafür andere Lösungen als das manuelle Laden des Skripts (nicht ideal) oder das Hacken von WP Core?

TIA

/ Eoin /

3
Eoin Kelly

Verwenden Sie null als $ ver-Parameter:

wp_deregister_script( 'jquery' );
wp_register_script( 'jquery', 'https://ajax.googleapis.com/ajax/libs/jquery/1.4.2/jquery.min.js', false, null);
wp_enqueue_script('jquery');

Ausgabe:

<script type='text/javascript' src='https://ajax.googleapis.com/ajax/libs/jquery/1.4.2/jquery.min.js'></script>
2
lemats

Ich entferne Version wie diese, kann leicht ausgeschrieben werden, um mit mehreren Domains übereinzustimmen:

add_filter( 'script_loader_src', 'jquery_unversion' );

function jquery_unversion( $src ) {

    if( strpos( $src, 'ajax.googleapis.com' ) )
        $src = remove_query_arg( 'ver', $src );

    return $src;
}
7
Rarst

Kurze Antwort: Nein.

Ich habe mir den Code in wp-includes/scriptloader.php angesehen und es gibt nichts, was auf eine "Option" zur Angabe der Versionsnummer hinweist.

Sie können dies jedoch einfach in Ihre Fußzeile (oder Kopfzeile) als explizites <script>-Tag einfügen. Dies beseitigt natürlich die ganze Idee von wp_register_script(), aber das stimmt mit einer Reihe von "Features" in WP. (Bringen Sie mich nicht dazu, das hirntote/kaputte Parsen von Shortcodes mit regulären Ausdrücken zu lernen.)

1
Peter Rowell

Verwenden Sie dies in der functions.php Ihres Themas

function remove_wp_script_version( $src ){

    global $wp_version;

  $version_str = '?ver='.$wp_version;
  $version_str_offset = strlen( $src ) - strlen( $version_str );

  if( substr( $src, $version_str_offset ) == $version_str )
    return substr( $src, 0, $version_str_offset );
  else
    return $src;
}
add_filter( 'script_loader_src', 'remove_wp_script_version', 15, 1 ); 

Wenn Sie möchten, können Sie auch einen weiteren Filter hinzufügen, um die Versionierung aus Stylesheets zu entfernen.

add_filter( 'style_loader_src', 'remove_script_version', 15, 1 );

Ich verstehe nicht, warum sie das in den Kern stecken. Dies beeinträchtigt nicht nur das Zwischenspeichern von externen Skripten, sondern gibt auch unnötige Informationen über die Site aus. Ich benutze einfach die oben genannten Filter und füge nach Bedarf meine eigenen Versionsnummern zu benutzerdefinierten Skripten hinzu.

1
user2737

Vielen Dank für Ihre Antworten. Am Ende ist dies der Code, den ich verwendet habe (hier für zukünftige Sucher posten):

function control_wp_url_versioning($src)
{
    // $src is the URL that WP has generated for the script or stlye you added 
    // with wp_enqueue_script() or wp_enqueue_style(). This function currently 
    // removes the version string off *all* scripts. If you need to do something 
    // different, then you should do it here.
    $src = remove_query_arg( 'ver', $src );
    return $src;
}

// The default script priority is 10. We load these filters with priority 15 to 
// ensure they are run *after* all the default filters have run. 
add_filter('script_loader_src', 'control_wp_url_versioning', 15); 
add_filter('style_loader_src', 'control_wp_url_versioning', 15); 
1
Eoin Kelly

Das Einbinden von jQuery aus Googles CDN erfordert außerdem zusätzlichen Code, um das Problem des NoConflict-Modus zu lösen.

Ich schlage vor, anstatt Ihr eigenes Plugin zu erstellen, ein Plugin zu verwenden, das dafür ausgelegt ist, es richtig zu handhaben. Dieser funktioniert hervorragend: http://wordpress.org/extend/plugins/use-google-libraries/

Einfache und problemlose Einrichtung. Aktivieren Sie es einfach und alle relevanten Bibliotheken werden durch die CDN-Versionen von Google ersetzt.

1
Otto