Управление версиями сценариев 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', если я оставлю его пустым (или "ложным")
Я считаю, что добавленная строка версии останавливает браузер пользователя от повторного использования кэшированной копии файла, который он мог загрузить с другого веб-сайта. Например.
- Посещения пользователей www.example.com который загружает ajax.googleapis.com/ajax/libs/jquery/1.4.4/jquery.min.js так что теперь он находится в кэше браузера.
- Затем пользователь посещает мой сайт, который загружает ajax.googleapis.com/ajax/libs/jquery/1.4.4/jquery.min.js?ver=3.0.4
- Браузер пользователя не использует его кэшированную копию, потому что URL-адреса другой.
Поскольку кэширование между сайтами является одной из основных причин, по которой я хочу использовать CDN Google, существуют ли какие-либо решения для этого, кроме загрузки скрипта вручную (не идеально) или взлома WP core?
ТИА
/Eoin/
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>
Я удаляю такую версию, которую можно легко записать для соответствия нескольким доменам:
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;
}
Короткий ответ: Нет.
Я посмотрел код в wp-includes/scriptloader.php
, и там нет ничего, что указывало бы на "опцию" при указании номера версии.
Однако вы можете просто поместить это в нижний колонтитул (или верхний колонтитул) в виде явного тега <script>
. Конечно, это полностью разрушает всю идею wp_register_script()
, но это верно для ряда "функций" в WP. (Не заставляйте меня начинать с безмозглого/сломанного анализа коротких кодов с регулярными выражениями.)
Используйте это в своей теме 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 );
Я не понимаю, почему они поместили это в ядро. Это не только мешает кэшированию внешних скриптов, но и выдает ненужную информацию о сайте. Я просто использую фильтры выше и добавляю свои собственные номера версий в пользовательские сценарии по мере необходимости.
Для включения jQuery из CDN Google также требуется дополнительный код для решения проблемы с режимом noConflict.
Я предлагаю вместо того, чтобы запускать свой собственный, использовать плагин, предназначенный для правильной обработки. Этот отлично работает: http://wordpress.org/extend/plugins/use-google-libraries/
Простая настройка без проблем. Просто активируйте его, и он заменит все соответствующие библиотеки версиями CDN Google.
Спасибо всем вам за ваши ответы. В конце концов, это код, который я использовал (публикуя здесь для будущих поисковиков):
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);