Transient API в WordPress — это удобный механизм для временного хранения данных в базе, который позволяет значительно ускорить работу сайта. Однако иногда кэшированные transient-значения устаревают или вызывают проблемы, и их нужно удалить вручную или программно. В этой статье подробно разберём, как работать с transient, почему возникает необходимость удаления кэша, и приведём практические примеры кода для удаления transient в WordPress.
Что такое transient в WordPress и зачем его удалять
Transient — это временный кэш, который хранится в базе данных или в объектном кэше, например Redis или Memcached. Он имеет время жизни (TTL), после которого автоматически удаляется. Но бывают ситуации, когда:
- Данные устарели, но TTL ещё не вышел.
- Произошли изменения, и нужно сбросить кэш вручную.
- Появились ошибки из-за повреждённых или некорректных данных в transient.
В таких случаях нужно уметь удалять transient, чтобы WordPress заново получил актуальные данные.
Удаление transient через административную панель и плагины
Для тех, кто не хочет погружаться в код, есть несколько плагинов, которые позволяют управлять transient:
- Clearfy Pro — содержит инструменты для очистки базы данных, в том числе transient. Позволяет удалить все или выборочные transient.
- Transient Manager — бесплатный плагин для просмотра, удаления и поиска transient в базе.
Использование плагинов удобно, но не всегда эффективно при массовой очистке или автоматизации. Для этого лучше использовать код.
Программное удаление transient в WordPress
Удаление конкретного transient
Если вы знаете имя transient, его легко удалить с помощью функции delete_transient. Например, для transient с именем wpteam_cache_data:
function wpteam_delete_specific_transient() {
delete_transient('wpteam_cache_data');
}
Вызывайте эту функцию в нужном месте вашего плагина или темы, когда нужно сбросить кэш.
Удаление опкэша объекта transient
Если transient хранится в объектном кэше, иногда полезно вызвать сброс кэша и там, особенно при использовании Redis или Memcached:
function wpteam_delete_transient_with_cache($transient_name) {
global $wpdb;
delete_transient($transient_name);
// Очистка объекта кэша
wp_cache_delete('_transient_' . $transient_name, 'options');
wp_cache_delete('_transient_timeout_' . $transient_name, 'options');
}
Массовое удаление всех transient через код
Если требуется удалить все transient из базы, можно использовать прямой SQL-запрос. Будьте осторожны и обязательно сделайте резервную копию базы.
function wpteam_delete_all_transients() {
global $wpdb;
$transient_name = '_transient_%';
$transient_timeout = '_transient_timeout_%';
$wpdb->query( "DELETE FROM $wpdb->options WHERE option_name LIKE '{$transient_name}'" );
$wpdb->query( "DELETE FROM $wpdb->options WHERE option_name LIKE '{$transient_timeout}'" );
}
Этот код удалит все transient и таймауты к ним из таблицы опций.
Автоматическое удаление устаревших transient с WP-Cron
Иногда полезно регулярно очищать transient, чтобы не засорять базу. Для этого можно создать задачу на WP-Cron.
function wpteam_schedule_transient_cleanup() {
if (!wp_next_scheduled('wpteam_cleanup_transients_hook')) {
wp_schedule_event(time(), 'daily', 'wpteam_cleanup_transients_hook');
}
}
add_action('wp', 'wpteam_schedule_transient_cleanup');
function wpteam_cleanup_transients() {
wpteam_delete_all_transients();
}
add_action('wpteam_cleanup_transients_hook', 'wpteam_cleanup_transients');
Так вы будете автоматически удалять все transient раз в сутки.
Особенности работы с persistent object cache и transient
Если на сайте настроен persistent object cache (Redis, Memcached), transient хранятся в кэше, а не в базе. В этом случае удаление через базу не всегда эффективно. Рекомендуется использовать функции delete_transient и wp_cache_delete, чтобы удалить transient из кэша.
Проверить наличие persistent cache можно через плагин Clearfy Pro, который позволяет управлять кэшем и transient.
Пример использования transient с удалением и обновлением данных
Рассмотрим пример, где мы кэшируем запрос к внешнему API и умеем сбрасывать кэш по кнопке в админке:
function wpteam_get_api_data() {
$cache_key = 'wpteam_api_data';
$data = get_transient($cache_key);
if ($data === false) {
// Запрос к API
$response = wp_remote_get('https://api.example.com/data');
if (is_wp_error($response)) {
return [];
}
$data = json_decode(wp_remote_retrieve_body($response), true);
// Кэшируем на 12 часов
set_transient($cache_key, $data, 12 * HOUR_IN_SECONDS);
}
return $data;
}
// Функция для удаления transient по запросу
function wpteam_clear_api_cache() {
if (isset($_GET['clear_api_cache']) && current_user_can('manage_options')) {
delete_transient('wpteam_api_data');
wp_safe_redirect(remove_query_arg('clear_api_cache'));
exit;
}
}
add_action('admin_init', 'wpteam_clear_api_cache');
Такой подход позволяет минимизировать количество запросов к API и быстро сбрасывать кэш при необходимости.
Резюме и рекомендации
Удаление transient — важный инструмент для разработки и поддержки WordPress-сайтов. Знание методов удаления transient помогает решать проблемы с устаревшими данными и оптимизировать работу сайта. Используйте как готовые плагины, так и программные методы для гибкости и контроля.
Для продвинутых пользователей рекомендуем ознакомиться с плагином Clearfy Pro — он значительно упрощает управление transient и кэшами.