Transient API в WordPress — мощный инструмент для временного хранения данных в базе данных с установкой срока жизни. Однако со временем в базе накапливаются устаревшие или неиспользуемые transientы, которые могут замедлять работу сайта и увеличивать размер базы. В этой статье мы подробно рассмотрим, как безопасно и эффективно удалить такие transientы, чтобы оптимизировать производительность вашего сайта.
Что такое transientы в WordPress и зачем их удалять
Transientы — это временные данные, которые хранятся в таблице wp_options с префиксом _transient_ и имеют ограниченный срок жизни. Они широко используются разработчиками плагинов и тем для кэширования результатов запросов к API, сложных вычислений и других ресурсов, чтобы снизить нагрузку на сервер.
Однако если transientы не очищаются автоматически (например, из-за ошибок в коде плагинов или тем), с течением времени они накапливаются, занимая место и замедляя работу запросов к базе данных. Особенно это заметно на крупных сайтах с множеством плагинов.
Удаление устаревших transientов позволяет:
- Снизить размер таблицы
wp_options, улучшая скорость запросов; - Уменьшить время загрузки страниц;
- Избежать проблем с кэшированием и устаревшими данными.
Способы удаления неиспользуемых transientов
Существует несколько подходов к очистке transientов. Рассмотрим их с примерами.
Удаление transientов через WP-CLI
Если у вас есть доступ к консоли сервера, WP-CLI — самый быстрый и безопасный способ удалить устаревшие transientы. Для этого выполните команду:
wp transient delete-expired
Эта команда удалит все просроченные transientы из базы. Чтобы удалить все transientы, включая активные (что не рекомендуется без веской причины), используйте:
wp transient delete --all
WP-CLI гарантирует корректную очистку, не затрагивая другие данные.
Удаление transientов при помощи SQL-запросов
Если WP-CLI недоступен, можно удалить transientы напрямую через SQL. Например, для удаления всех просроченных transientов выполните запрос:
DELETE a, b FROM wp_options a
LEFT JOIN wp_options b ON b.option_name = REPLACE(a.option_name, '_transient_', '_transient_timeout_')
WHERE a.option_name LIKE '_transient_%' AND b.option_value < UNIX_TIMESTAMP();
Обратите внимание, что префикс таблицы wp_ может отличаться, замените его на свой. Этот запрос удалит все transientы, срок действия которых истек.
Для удаления всех transientов (активных и просроченных) можно использовать:
DELETE FROM wp_options WHERE option_name LIKE '_transient_%';
Но такой подход опасен, рекомендуется делать резервную копию базы перед выполнением.
Использование плагинов для очистки transientов
Для тех, кто предпочитает графический интерфейс, существуют плагины:
- Transient Cleaner — простой плагин для удаления expired и всех transientов;
- Clearfy Pro — многофункциональный плагин для оптимизации, включая очистку transientов;
- WPRemark — инструмент для управления кэшами и transientами с расширенными возможностями.
Плагины удобны, но могут нагрузить сайт, если у вас большой объем данных.
Как написать свою функцию для удаления устаревших transientов
Для разработчиков полезно иметь в арсенале код, который можно запускать вручную или по расписанию (через cron) для очистки transientов. Пример функции для удаления просроченных transientов:
function wpclean_delete_expired_transients() {
global $wpdb;
// Получаем все устаревшие transientы
$expired = $wpdb->get_col(
"SELECT option_name FROM {$wpdb->options} WHERE option_name LIKE '_transient_timeout_%' AND option_value < UNIX_TIMESTAMP()"
);
if ( empty($expired) ) {
return;
}
foreach ( $expired as $timeout_option ) {
// Формируем имя transient без префикса timeout
$transient_name = str_replace('_transient_timeout_', '_transient_', $timeout_option);
// Удаляем transient и его timeout
delete_option( $transient_name );
delete_option( $timeout_option );
}
}
// Пример вызова функции
wpclean_delete_expired_transients();
Эту функцию можно добавить в файл functions.php вашей темы или создать отдельный плагин. Для автоматизации можно запускать её по hook wp_cron.
Автоматизация очистки transientов через WP-Cron
Чтобы регулярно очищать устаревшие transientы, создайте задачу cron в WordPress. Пример регистрации события и хука:
function wpclean_schedule_transient_cleanup() {
if ( ! wp_next_scheduled( 'wpclean_cron_cleanup_transients' ) ) {
wp_schedule_event( time(), 'daily', 'wpclean_cron_cleanup_transients' );
}
}
add_action( 'wp', 'wpclean_schedule_transient_cleanup' );
add_action( 'wpclean_cron_cleanup_transients', 'wpclean_delete_expired_transients' );
Эта конструкция запустит функцию очистки раз в сутки. Вы можете изменить частоту на hourly или twicedaily по необходимости.
Советы по работе с transientами
- Всегда делайте резервную копию базы перед массовой очисткой transientов;
- Проверяйте, какие плагины используют transientы и как они управляют ими — иногда лучше обновить или заменить плагин;
- Не удаляйте активные transientы без веской причины — это может привести к снижению производительности;
- Используйте WP-CLI или специализированные плагины для регулярной очистки;
- Внедряйте автоматическую очистку через WP-Cron для поддержания базы в оптимальном состоянии.