Управление версиями сценариев WP нарушает межсайтовое кэширование?


Я загружаю jQuery из CDN Google, используя следующий код:

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

В firebug я вижу, что wordpress добавляет '?ver=3.0.4' к URL-адресу для управления кэшированием. На самом деле, похоже, нет никакого способа запретить WP добавлять что-то к URL-адресу - я могу указать свою собственную строку в вызове wp_register_script(), но WP будет использовать значение по умолчанию 'ver=3.0.4', если я оставлю его пустым (или "ложным")

Я считаю, что добавленная строка версии останавливает браузер пользователя от повторного использования кэшированной копии файла, который он мог загрузить с другого веб-сайта. Например.

  1. Посещения пользователей www.example.com который загружает ajax.googleapis.com/ajax/libs/jquery/1.4.4/jquery.min.js так что теперь он находится в кэше браузера.
  2. Затем пользователь посещает мой сайт, который загружает ajax.googleapis.com/ajax/libs/jquery/1.4.4/jquery.min.js?ver=3.0.4
  3. Браузер пользователя не использует его кэшированную копию, потому что URL-адреса другой.

Поскольку кэширование между сайтами является одной из основных причин, по которой я хочу использовать CDN Google, существуют ли какие-либо решения для этого, кроме загрузки скрипта вручную (не идеально) или взлома WP core?

ТИА

/Eoin/

Author: Eoin Kelly, 2011-01-26

6 answers

Используйте null в качестве параметра $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');

Вывод:

<script type='text/javascript' src='https://ajax.googleapis.com/ajax/libs/jquery/1.4.2/jquery.min.js'></script>
 2
Author: lemats, 2011-02-09 17:03:00

Я удаляю такую версию, которую можно легко записать для соответствия нескольким доменам:

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
Author: Rarst, 2011-01-26 06:39:07

Короткий ответ: Нет.

Я посмотрел код в wp-includes/scriptloader.php, и там нет ничего, что указывало бы на "опцию" при указании номера версии.

Однако вы можете просто поместить это в нижний колонтитул (или верхний колонтитул) в виде явного тега <script>. Конечно, это полностью разрушает всю идею wp_register_script(), но это верно для ряда "функций" в WP. (Не заставляйте меня начинать с безмозглого/сломанного анализа коротких кодов с регулярными выражениями.)

 1
Author: Peter Rowell, 2011-01-26 03:21:54

Используйте это в своей теме functions.php

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

При желании вы также можете добавить другой фильтр, чтобы удалить управление версиями из таблиц стилей.

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

Я не понимаю, почему они поместили это в ядро. Это не только мешает кэшированию внешних скриптов, но и выдает ненужную информацию о сайте. Я просто использую фильтры выше и добавляю свои собственные номера версий в пользовательские сценарии по мере необходимости.

 1
Author: Rarst, 2011-01-26 06:35:52

Для включения jQuery из CDN Google также требуется дополнительный код для решения проблемы с режимом noConflict.

Я предлагаю вместо того, чтобы запускать свой собственный, использовать плагин, предназначенный для правильной обработки. Этот отлично работает: http://wordpress.org/extend/plugins/use-google-libraries/

Простая настройка без проблем. Просто активируйте его, и он заменит все соответствующие библиотеки версиями CDN Google.

 1
Author: Otto, 2011-01-27 06:41:04

Спасибо всем вам за ваши ответы. В конце концов, это код, который я использовал (публикуя здесь для будущих поисковиков):

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
Author: Eoin Kelly, 2012-09-20 11:39:55