web-dev-qa-db-fra.com

WP Le versionnage de script interrompt la mise en cache intersite

Je charge JQuery à partir de Google CDN en utilisant le code suivant:

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

Dans firebug, je vois que wordpress ajoute '? Ver = 3.0.4' à l'URL pour contrôler la mise en cache. En fait, il semble qu'il n'y ait aucun moyen d'empêcher WP d'ajouter quelque chose à l'URL - je peux fournir le mien. chaîne dans l'appel à wp_register_script () mais WP utilisera la valeur par défaut 'ver = 3.0.4' si je le laisse vide (ou "faux")

Je crois que la chaîne de version ajoutée empêche le navigateur de l'utilisateur de réutiliser une copie mise en cache du fichier qu'il aurait téléchargé depuis un site Web différent . Par exemple.

  1. L'utilisateur visite www.example.com qui charge ajax.googleapis.com/ajax/libs/jquery/1.4.4/jquery.min.js, de sorte qu'il est maintenant dans le cache du navigateur.
  2. L'utilisateur visite ensuite mon site qui charge ajax.googleapis.com/ajax/libs/jquery/1.4.4/jquery.min.js?ver=3.0.4
  3. Le navigateur de l'utilisateur n'utilise pas sa copie en cache car les URL sont différentes.

La mise en cache intersite étant l'une des principales raisons pour lesquelles je souhaite utiliser le CDN de Google, existe-t-il une solution autre que le chargement manuel du script (pas idéal) ou le piratage WP noyau?

TIA

/ Eoin /

3
Eoin Kelly

Utilisez null comme paramètre $ ver:

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

Sortie:

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

Je supprime la version comme celle-ci, peut être facilement écrite pour correspondre à plusieurs domaines:

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

Réponse courte: non.

J'ai regardé le code dans wp-includes/scriptloader.php et il n'y a rien qui indique une "option" sur la fourniture du numéro de version.

Cependant, vous pouvez simplement le mettre dans votre pied de page (ou en-tête) en tant que balise <script> explicite. Bien sûr, cela réfute complètement l’idée de wp_register_script(), mais c’est vrai avec un certain nombre de "fonctionnalités" dans WP. (Ne me lancez pas dans l'analyse syntaxique/morcelée des codes courts avec les expressions rationnelles.)

1
Peter Rowell

Utilisez-le dans le functions.php de votre thème

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

Si vous le souhaitez, vous pouvez également ajouter un autre filtre pour supprimer le contrôle de version des feuilles de style.

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

Je ne comprends pas pourquoi ils mettent cela dans le noyau. Non seulement cela dérange la mise en cache des scripts externes, mais il donne également des informations inutiles sur le site. J'utilise simplement les filtres ci-dessus et ajoute mes propres numéros de version à des scripts personnalisés, selon les besoins.

1
user2737

Merci à tous pour vos réponses. En fin de compte, c’est le code que j’ai utilisé (en l’affichant ici pour les futurs chercheurs):

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

Inclure jQuery à partir du CDN de Google nécessite également un code supplémentaire pour gérer le problème du mode noConflict.

Je suggère que, au lieu de rouler le vôtre, utilisez un plugin conçu pour le gérer correctement. Celui-ci fonctionne très bien: http://wordpress.org/extend/plugins/use-google-libraries/

Configuration simple sans tracas. Activez-le et il remplacera toutes les bibliothèques pertinentes par les versions CDN de Google.

1
Otto