Как принудительно обновить js и css-файлы в WordPress, закешированные в браузере пользователя
Сегодня разберёмся как принудительно обновить js и css-файлы в WordPress, закешированные в браузере пользователя.
Видеоверсия
При первом обращении к сайту браузер пользователя помещает полученные js и css файлы в кеш. При повторных посещениях закешированные файлы не запрашиваются с сервера.
Обновление закешированных файлов происходит с определённой периодичностью, заданной в настройках сервера. Этот интервал не связан с изменением самих файлов.
Соответственно, после изменений файлов на сервере, пользователи всё ещё будут видеть устаревшую версию файлов, пока не произойдет обновление, либо они вручную не очистят кеш браузера.
Чтобы исправить эту ситуацию, можно добавлять версию файла к его имени при каждом изменении. Например, так:
1 |
wp_enqueue_script( 'script-name', get_stylesheet_directory_uri() . '/js/example.js', array(), '1.1' ); |
Каждый раз изменять версию файла вручную довольно хлопотно, лучше делать это автоматизированно. Для этого добавим обертки для стандартных функций подключения js и css файлов в WordPress в файл functions.php активной темы.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 |
/** * Enqueues script with WordPress and adds version number that is a timestamp of the file modified date. * * @param string $handle Name of the script. Should be unique. * @param string|bool $src Path to the script from the theme directory of WordPress. Example: '/js/myscript.js'. * @param array $deps Optional. An array of registered script handles this script depends on. Default empty array. * @param bool $in_footer Optional. Whether to enqueue the script before </body> instead of in the <head>. * Default 'false'. */ function enqueue_versioned_script( $handle, $src = false, $deps = array(), $in_footer = false ) { wp_enqueue_script( $handle, get_stylesheet_directory_uri() . $src, $deps, filemtime( get_stylesheet_directory() . $src ), $in_footer ); } /** * Enqueues stylesheet with WordPress and adds version number that is a timestamp of the file modified date. * * @param string $handle Name of the stylesheet. Should be unique. * @param string|bool $src Path to the stylesheet from the theme directory of WordPress. Example: '/css/mystyle.css'. * @param array $deps Optional. An array of registered stylesheet handles this stylesheet depends on. Default empty array. * @param string $media Optional. The media for which this stylesheet has been defined. * Default 'all'. Accepts media types like 'all', 'print' and 'screen', or media queries like * '(orientation: portrait)' and '(max-width: 640px)'. */ function enqueue_versioned_style( $handle, $src = false, $deps = array(), $media = 'all' ) { wp_enqueue_style( $handle, get_stylesheet_directory_uri() . $src, $deps = array(), filemtime( get_stylesheet_directory() . $src ), $media ); } |
Подключим необходимые файлы через новые функции.
1 2 3 4 5 6 |
function themename_scripts() { enqueue_versioned_style( 'themename', '/style.css' ); enqueue_versioned_script( 'themename', '/js/scripts.js', array( 'jquery'), true ); } add_action( 'wp_enqueue_scripts', 'themename_scripts' ); |
В коде страницы это будет выглядит, примерно, так:
1 2 3 |
<link rel='stylesheet' id='themename-css' href='http://example.com/wp-content/themes/themename/style.css?ver=1429693860' type='text/css' media='all' /> <script type='text/javascript' src='http://example.com/wp-content/themes/themename/js/scripts.js?ver=1429694775'></script> |
Теперь посетители будут сразу видеть изменения на сайте без необходимости очищать кеш браузера.
Спасибо, выручили!
Вставил код и изменения на сайте отобразились
Нужно весь код добавить в functions.php темы? Не получается, не работает.
1. Что именно не получается и не работает?
2. Как у Вас сейчас выглядит вставленный код?
Круто! Всё работает, очень выручили!!!
Спасибо за дополнение!
Но с функцией
time()
я бы посоветовал быть осторожнее, т.к. она меняет значение при каждом обращении и в определенных случаях это может вызвать дополнительную нагрузку на сервер и увеличение времени загрузки страницы.Мне кажется, что использование функции
filemtime()
более предпочтительно в данной ситуации.Правильно ли я понял, что нужно добавить все три части кода в functions.php темы, что бы получилось вот так?
У меня не сработало.
Выглядит похоже.
1. А что именно не получилось?
2. Есть адрес сайта, где это можно увидеть?
В самой дочерней теме уже выполняется, видимо, подобная функция, потому что style.css уже имеет дописку в виде версии
/style.css?ver=4.9.10
и видимо это как то конфликтует с новой функцией.
Но найти, где это дописывается и от чего меняется версия я так и не смог 🙁
Сайт — izumrudnoe.ru
Подключение файлов стилей в Вашей теме должно быть вот в этой строке https://themes.trac.wordpress.org/browser/vantage/1.5.5/functions.php#L331 .
Я вижу у Вас в коде два подключения файла style.css:
Вы подключили файл стилей повторно? Как у Вас выглядит код в файле functions.php? Можете выложить на https://pastebin.com/ и прислать ссылку.
Упоминания дочерней темы в коде не увидел. Если Вы её уже активировали, то должен был подключиться style.css из дочерней темы.
Вордпресс по-умолчанию УЖЕ подключает style.css из корня папки текущей темы. Поэтому у человека два этих файла: подключенный ВП и подключенный по вашему рецепту.
Вопрос в том, как отключить файл, подключаемый ВП.
Представленный в статье код использует функцию filemtime, то есть в параметре ver должно быть время последнего изменения файла в Unix-формате.
У автора комментария ?ver=4.9.10 и ?ver=7. И тут вопрос в том как так вышло.
Желаю админу любви и процветания! Благодарю! Помог! Всё работает.
Как обновлять стили wp?
<link rel='stylesheet' id='dashicons-css' href='site/wp-includes/css/dashicons.min.css?ver=5.2.2'
<link rel='stylesheet' id='dashicons-css' href='site/wp-includes/css/dashicons.min.css?ver=5.2.2'
Стили дефолтные темы "style.css"
<link rel='stylesheet' id='style_theme-css' href='site/wp-content/themes/myTheme/style.css?ver=5.2.2
И т.д?
Стили в ядре WordPress изменяются только при обновлении на новую версию. Соответственно, после обновления, например на версию 5.2.3, ссылка изменится на site/wp-includes/css/dashicons.min.css?ver=5.2.3 и браузер автоматически скачает новую версию файла.
автор, у меня сайт на ВП, посетители не видят на главной новые статьи, как сделать так, чтобы кэш сбрасывался?
от души!! респект тебе!!
Денис добрый день!
Добавил в код в дочерний файл function.php не помогло. В чём моя ошибка.
Сайт: verybet.ru