Как избежать кэширования во время разработки?
Существует ли простой способ предотвратить кэширование при тестировании изменений на сайте? Я использую WP Super Cache. Я могу удалить его кэш через предоставленную опцию, очистить кэш браузера, но некоторые изменения в CSS или виджетах все равно не обновляются. Я пробую другие обходные пути, такие как переключение браузеров или компьютеров, но должен быть более оптимизированный рабочий процесс, где я могу быть уверен, что вижу внесенные мной изменения, а не какой-то закэшированный ранее формат? Какое лучшее решение для этого?

Добавьте filemtime()
вашей таблицы стилей в качестве параметра версии. Предположим, ваша основная таблица стилей находится в css/default.css
и css/default.min.css
(не style.css
). Когда мы регистрируем таблицу стилей в хуке wp_loaded
(не init
), мы можем передать версию в качестве четвертого параметра. Это будет время последнего изменения файла, поэтому оно будет меняться каждый раз при изменении файла.
$min = WP_DEBUG ? '': '.min';
$file = "/css/default$min.css";
$url = get_template_directory_uri() . $file;
$path = get_template_directory() . $file;
$handle = get_stylesheet() . '-default';
// Переопределено в дочерней теме?
if ( is_child_theme() && is_readable( get_stylesheet_directory() . $file ) )
{
$url = get_stylesheet_directory_uri() . $file;
$path = get_stylesheet_directory() . $file;
}
$modified = filemtime( $path );
add_action( 'wp_loaded', function() use ( $handle, $url, $modified ) {
wp_register_style( $handle, $url, [], $modified );
});
add_action( 'wp_enqueue_scripts', function() use ( $handle ) {
wp_enqueue_style( $handle );
});
Если вы используете Node.js и Grunt, я настоятельно рекомендую Browsersync. Он будет отслеживать изменения в ваших файлах и мгновенно обновлять их при любом изменении. Также он может синхронизировать позицию прокрутки, отправку форм и многое другое между несколькими открытыми браузерами. Очень удобно.

Большое спасибо. Похоже, это также подход указанного плагина. В моем случае это не решило проблему, потому что мой DNS-провайдер (CloudFlare) кэшировал css-файл, поэтому мне пришлось очистить кэш там — думаю, простого обходного пути нет. В целом, однако, я считаю это лучшим ответом на подобную проблему, поэтому отмечу как принятый. Еще раз спасибо.

Почему бы не использовать локальную таблицу стилей во время разработки?

Некоторые облачные сервисы кэширования могут жестко кэшировать ваш файл на 8+ часов, так что вам либо придется запросить у них реализацию лучшего сервиса для версионирования (некоторые это делают), сменить сервис, либо перестать их использовать.

После многократных поисков простого решения я наконец нашел то, что работает!
Итак... после размышлений я обнаружил отличный способ обойти кэширование при разработке новых сайтов... (и это просто).
Нам нужно указать WordPress, что это новая версия CSS, вот так...
До изменений:
wp_enqueue_style( 'maincss', get_template_directory_uri() . '/css/style.css', array(), false, 'all' );
После изменений:
wp_enqueue_style( 'maincss', get_template_directory_uri() . '/css/style.css?v='.time(), array(), false, 'all' );
Вот что мы добавили:
?v='.time()
Объяснение:
Мы добавляем динамический номер версии к CSS-файлу, что заставляет браузер загружать новый CSS каждый раз при его обновлении.
Не забудьте убрать это после завершения разработки, иначе кэширование для этого файла не будет работать, и он будет загружаться для возвращающихся пользователей снова и снова.
Эта техника работает для CSS и JS файлов - надеюсь, это поможет ;)

Довольно неплохо, но еще лучше просто использовать time() в качестве 4-го параметра, который отвечает за версию. Это даст вам: wp_enqueue_style( 'maincss', get_template_directory_uri() . '/css/style.css', array(), time(), 'all' );

Использование time() в качестве 4-го параметра может привести к тому, что Chrome будет удерживать эту версию. Особенно это актуально, если вы кэшируете все остальное во время работы на живом сайте. Таким образом, вы отправляете "новый файл" в Chrome, который он будет использовать, вместо того чтобы пытаться сохранить "старую" версию в течение определенного времени (как установлено для других ресурсов).

+1 - Я использую панель "Web Developer" для Firefox, которая позволяет очень быстро отключать кеш (среди прочего)

Спасибо - нужно ли отключать только кеш браузера? Будет ли WP SuperCache по-прежнему предоставлять закешированный контент? Мой DNS-сервис тоже кеширует, поэтому я не уверен, нужно ли отключать каждый кеш (WP, браузер, DNS и т.д.) отдельно.

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

Я знаю, что на этот вопрос уже есть принятый ответ, но мне кажется, что он все еще слишком сложный для данной проблемы и может быть даже некорректным в зависимости от пользователя (без обид), поэтому я хотел бы поделиться своим способом обхода кэширования во время разработки (не только в WordPress).
Большинство современных браузеров имеют так называемый режим инкогнито. В этом режиме ничего на вашем компьютере не кэшируется, поэтому каждая перезагрузка — это свежая загрузка с сервера. В Internet Explorer это комбинация Ctrl + Shift + P
. В Firefox и Chrome — Ctrl + Shift + N
.
Если ваш браузер не поддерживает режим инкогнито, вы можете принудительно выполнить жесткую перезагрузку страницы с помощью Ctrl + F5
в IE или Ctrl + Shift + R
в Firefox и Chrome.
Что касается вашего вопроса о CSS-файлах (и, по сути, всех ассет-файлах, таких как изображения и JavaScript), они никак не кэшируются WP Super Cache. Настройки и/или использование этого плагина не влияют на то, как эти файлы отдаются. Их кэширует ваш браузер, и именно поэтому вы делаете жесткую перезагрузку.
Что делает плагин — он анализирует, как WordPress генерирует HTML-файлы (через PHP), сохраняет копию, и при следующем запросе того же поста, страницы или чего-либо еще он отдает эту копию, не пересчитывая PHP-сгенерированный HTML заново, тем самым экономя время загрузки страниц. (Надеюсь, это понятно.)
Проблема в том, что если вы добавляете временную метку к URL ваших CSS-файлов через PHP-функцию, это является PHP-генерацией HTML, и это будет кэшировано WP Super Cache. Каждый запрос к тому же посту будет содержать одинаковую временную метку, потому что пользователям отдается копия оригинального результата генерации. (Поправьте, если я ошибаюсь.)
Правильный способ обхода кэширования WP Super Cache — установить опцию Don't cache for known users
в значение true
на странице настроек плагина.
Наконец (и это личное предпочтение, так как я очень щепетилен в вопросах кодинга), использование режима инкогнито или принудительной жесткой перезагрузки избавляет вас от необходимости добавлять лишнюю разметку в HTML-страницы. Конечно, добавление временной метки — это всего лишь около 13 байт на статический файл за запрос, но, как я уже сказал, я придирчив к таким вещам. Это все равно 13 лишних байт.

Что сработало для меня при запуске WordPress на стеке Bitnami под Windows — это редактирование файла php.ini и перезапуск сервера.
В секции [opcache] измените значение opcache.revalidate_freq на 1:
opcache.revalidate_freq=1
После этого я перезапустил серверы, и теперь изменения в моих плагинах отображаются на страницах сразу.

О, тут есть несколько способов решения! Прежде всего, вы затронули две разные вещи: WP Super Cache и CSS-файлы. Они кешируются по-разному и в разных местах, поэтому важно понять, в чём именно ваша проблема.
Если дело в WP Super Cache, вы можете определить константу DONOTCACHEPAGE
в файле functions.php во время разработки, чтобы WP Super Cache ничего не кешировал. Только не забудьте убрать это перед запуском сайта!
define('DONOTCACHEPAGE', true);
Кроме того, у каждого сайта есть уникальный ключ, который можно добавить к URL, чтобы загрузить свежую версию страницы. Его можно найти во вкладке "Advanced", если я не ошибаюсь.
Если говорить о более правильном решении, стоит настроить отдельные среды для разработки и продакшена, где в среде разработки WP Super Cache будет отключён (опять же, если проблема именно в нём).
Если же проблема связана с файлами CSS/JS, то обратите внимание на ответ toscho и последующий комментарий m0r7if3r выше.

Как уже говорилось для wp super cache, но для общего кеширования WordPress в файле wp-config.php
Измените на следующее:
define( 'WP_CACHE', false );
Ссылка: codex.wordpress.org

Вы можете использовать этот сниппет https://gist.github.com/jhayiwg/92bae4330aeb738a98022d7ab63ce9b1
Он будет генерировать новую версию CSS и JS вашей активной темы при каждой загрузке страницы
