Вопрос или проблема
Мы написали шорткод, который возвращает разный контент в зависимости от временной метки.
Типичный бизнес-кейс:
“До 1 января отображать “регистрация откроется 1 января”, а после этой даты “зарегистрироваться здесь””
Поэтому очень важно, чтобы этот фрагмент контента не кэшировался.
Существует ли способ в коде шорткода указать, что этот фрагмент контента не должен кэшироваться (зная, что механизм кэширования еще не выбран – nginx, memcache, total cache и т.д.)?
Поскольку кэширование обычно работает не на частях страницы, а на всей странице, нельзя просто отменить кэширование этой конкретной части (х well, можно использовать ESI/Edge Side Includes, но это не вариант для всех реализаций).
Что вы могли бы сделать, так это написать хук, который проверяет, используются ли эти шорткоды, и корректировать заголовки, указывающие на то, что это может не кэшироваться или кэшироваться только до X секунд (с указанным максимальным сроком действия, который совпадает с датой и временем, когда вы хотите показать измененный контент).
Или вы могли бы парсить шорткоды, когда посты обновляются, и добавлять задания WP cron, которые будут незаметно обновлять пост. Скорее всего, у вас есть некий механизм очистки в вашей реализации кэширования, который удаляет закэшированный результат, если пост обновляется.
Ответ или решение
Для того чтобы отключить кеширование контента, возвращаемого шорткодом, необходимо учитывать несколько вариантов решения, в зависимости от вашего окружения и механизмов кеширования. Прежде всего, давайте разберемся с задачей более детально.
Задача
Вы создали шорткод, который отображает различный контент в зависимости от времени — до 1 января показывается сообщение: "Регистрация откроется 1 января", а после — "Зарегистрируйтесь здесь". Важно, чтобы этот контент не кешировался, так как информация меняется в зависимости от времени.
Потенциальные решения
Есть несколько подходов к решению данной проблемы:
1. Установка заголовков HTTP
Хотя кеширование часто происходит на уровне страницы, вы можете установить специальные HTTP-заголовки для указания, что контент не следует кешировать:
function your_shortcode_function() {
// Установите заголовки, чтобы предотвратить кеширование
header("Cache-Control: no-cache, no-store, must-revalidate"); // HTTP 1.1
header("Pragma: no-cache"); // HTTP 1.0
header("Expires: 0"); // Предшествующий кеш должен истечь моментально
// Код вашего шорткода
if (current_time('Y-m-d') < '2023-01-01') {
return 'Регистрация откроется 1 января';
} else {
return 'Зарегистрируйтесь здесь';
}
}
add_shortcode('your_shortcode', 'your_shortcode_function');
Этот метод сообщит браузерам и системам кеширования, что данный контент не должен сохраняться.
2. Использование хука и временных меток
Для более тонкой настройки вы можете использовать хук, чтобы регулировать заголовки в зависимости от наличия вашего шорткода на странице:
function add_no_cache_headers() {
if (has_shortcode(get_post()->post_content, 'your_shortcode')) {
header("Cache-Control: no-cache, no-store, must-revalidate");
header("Pragma: no-cache");
header("Expires: 0");
}
}
add_action('wp', 'add_no_cache_headers');
Это решение применимо только для тех страниц, которые содержат ваш шорткод.
3. Использование WP Cron для обновления контента
Если вы хотите реализовать более строгий контроль кеширования, вы можете воспользоваться системой события WP Cron. Установите периодические задачи, которые будут обновлять посты в определенное время. Это позволяет вашему коду пересоздавать контент в зависимости от времени.
if (!wp_next_scheduled('update_shortcode_content')) {
wp_schedule_event(strtotime('2022-12-31 23:59:59'), 'hourly', 'update_shortcode_content');
}
add_action('update_shortcode_content', 'update_content');
function update_content() {
// Логика для обновления поста, где используется шорткод.
}
Это не отключает кеширование, но позволяет обновлять контент в определённые моменты времени, что может быть хорошей альтернативой.
Заключение
К сожалению, прямого способа указать, что конкретный шорткод не должен кешироваться на уровне кеширования всей страницы, не существует. Однако применение заголовков, хуков и периодических задач может существенно помочь в вашей ситуации.
Основная цель — обеспечить, чтобы контент был актуальным, сохраняя при этом производительность сайта. Сочетание разных подходов может дать оптимальные результаты в зависимости от вашего конкретного окружения и требований.