Управление кешем в WordPress — важный аспект поддержания скорости и стабильности сайта. Со временем накопленный кеш может замедлить работу сайта или привести к конфликтам, если он устарел. В этой статье мы рассмотрим, как автоматизировать удаление старого кеша в WordPress с помощью различных подходов и плагинов, а также приведем примеры кода для собственной реализации.
Зачем нужна автоматизация удаления кеша в WordPress
Кеширование помогает ускорить загрузку страниц за счет быстрого доступа к сохраненным копиям контента. Однако, кеш может накапливаться бесконтрольно, занимая дисковое пространство и создавая риск отображения устаревшей информации на сайте. Ручное удаление кеша — затратный по времени процесс, особенно если сайт большой и обновляется часто.
Автоматизация удаления кеша позволяет:
- Обеспечить актуальность отображаемого контента.
- Избежать переполнения дискового пространства.
- Поддерживать стабильную производительность сайта.
- Снизить необходимость постоянного вмешательства администратора.
Рассмотрим, как можно реализовать такую автоматизацию.
Автоматическое удаление кеша с помощью популярных плагинов WordPress
Плагин W3 Total Cache
Один из самых популярных кеширующих плагинов. Позволяет настроить автоматическую очистку кеша по расписанию, например, ежедневно или еженедельно.
Для включения автоматической очистки:
- Перейдите в Performance > Page Cache.
- В разделе Cache Preload установите расписание обновления кеша.
- В разделе Empty Cache настройте автоматическую очистку устаревшего кеша.
Плагин WP Super Cache
Этот плагин также позволяет настроить автоматическую очистку кеша через интерфейс в разделе Advanced > Expiry Time & Garbage Collection. Можно указать время жизни кеша и периодичность очистки.
Если вы используете один из этих плагинов, достаточно настроить расписание, и плагин сам будет удалять старый кеш. Но что делать, если нужна кастомная логика? Ниже рассмотрим, как написать собственный код для очистки кеша.
Автоматизация удаления кеша с помощью WP-Cron и собственного кода
WordPress имеет встроенную систему планировщика задач — WP-Cron. С ее помощью можно создать задачу, которая будет регулярно удалять кеш определенного типа. Рассмотрим пошагово.
Регистрация задачи очистки кеша
Добавим в файл functions.php вашей темы или в собственный плагин следующий код:
function wpdetect_schedule_cache_cleanup() {
if (!wp_next_scheduled('wpdetect_cache_cleanup_event')) {
wp_schedule_event(time(), 'daily', 'wpdetect_cache_cleanup_event');
}
}
add_action('wp', 'wpdetect_schedule_cache_cleanup');Этот код регистрирует ежедневное событие wpdetect_cache_cleanup_event.
Обработчик события очистки кеша
Создадим функцию, которая будет запускаться при срабатывании WP-Cron задачи:
function wpdetect_handle_cache_cleanup() {
// Пример удаления кеш-файлов из папки wp-content/cache/
$cache_dir = WP_CONTENT_DIR . '/cache/';
if (!is_dir($cache_dir)) {
return;
}
$files = glob($cache_dir . '*');
$now = time();
$max_age = 24 * 60 * 60; // 24 часа
foreach ($files as $file) {
if (is_file($file)) {
if ($now - filemtime($file) > $max_age) {
unlink($file);
}
} elseif (is_dir($file)) {
// Рекурсивное удаление старых файлов в папках
wpdetect_recursive_cache_cleanup($file, $max_age, $now);
}
}
}
add_action('wpdetect_cache_cleanup_event', 'wpdetect_handle_cache_cleanup');
function wpdetect_recursive_cache_cleanup($dir, $max_age, $now) {
$items = glob($dir . '/*');
foreach ($items as $item) {
if (is_file($item)) {
if ($now - filemtime($item) > $max_age) {
unlink($item);
}
} elseif (is_dir($item)) {
wpdetect_recursive_cache_cleanup($item, $max_age, $now);
// После очистки поддиректорий, пытаемся удалить пустую папку
@rmdir($item);
}
}
@rmdir($dir);
}Этот код удаляет все кеш-файлы старше 24 часов из папки wp-content/cache/ и рекурсивно очищает вложенные папки.
Отмена задачи по необходимости
Для удаления задачи используйте следующий код (например, при деактивации плагина):
function wpdetect_remove_cache_cleanup_schedule() {
$timestamp = wp_next_scheduled('wpdetect_cache_cleanup_event');
if ($timestamp) {
wp_unschedule_event($timestamp, 'wpdetect_cache_cleanup_event');
}
}Очистка кеша объектов и транзиентов через код
Кроме файлового кеша, WordPress активно использует кеш объектов и транзиенты. Их тоже важно очищать своевременно.
Удаление всех транзиентов
Транзиенты — данные с ограниченным сроком хранения в базе данных или в памяти. Вот простой способ удалить все транзиенты:
function wpdetect_delete_all_transients() {
global $wpdb;
$transients = $wpdb->get_col("SELECT option_name FROM {$wpdb->options} WHERE option_name LIKE '_transient_%'");
foreach ($transients as $transient) {
$key = str_replace('_transient_', '', $transient);
delete_transient($key);
}
}Вы можете запускать эту функцию по расписанию через WP-Cron, аналогично удалению кеш-файлов.
Очистка кеша объекта
Для очистки кеша объекта используйте:
wp_cache_flush();Подобную команду также можно вызывать в рамках автоматической задачи.
Пример комплексного решения: плагин для автоматической очистки кеша
Ниже пример минимального плагина, который ежедневно удаляет кеш-файлы старше 24 часов и очищает транзиенты:
<?php
/**
* Plugin Name: WPDetect Auto Cache Cleaner
* Description: Автоматическая очистка старого кеша в WordPress.
* Version: 1.0
* Author: WPDetect
*/
register_activation_hook(__FILE__, 'wpdetect_schedule_cache_cleanup');
register_deactivation_hook(__FILE__, 'wpdetect_remove_cache_cleanup_schedule');
function wpdetect_schedule_cache_cleanup() {
if (!wp_next_scheduled('wpdetect_cache_cleanup_event')) {
wp_schedule_event(time(), 'daily', 'wpdetect_cache_cleanup_event');
}
}
function wpdetect_remove_cache_cleanup_schedule() {
$timestamp = wp_next_scheduled('wpdetect_cache_cleanup_event');
if ($timestamp) {
wp_unschedule_event($timestamp, 'wpdetect_cache_cleanup_event');
}
}
add_action('wpdetect_cache_cleanup_event', 'wpdetect_handle_cache_cleanup');
function wpdetect_handle_cache_cleanup() {
// Удаление кеш-файлов
$cache_dir = WP_CONTENT_DIR . '/cache/';
if (is_dir($cache_dir)) {
$files = glob($cache_dir . '*');
$now = time();
$max_age = 24 * 60 * 60;
foreach ($files as $file) {
if (is_file($file) && $now - filemtime($file) > $max_age) {
unlink($file);
} elseif (is_dir($file)) {
wpdetect_recursive_cache_cleanup($file, $max_age, $now);
}
}
}
// Очистка транзиентов
global $wpdb;
$transients = $wpdb->get_col("SELECT option_name FROM {$wpdb->options} WHERE option_name LIKE '_transient_%'");
foreach ($transients as $transient) {
$key = str_replace('_transient_', '', $transient);
delete_transient($key);
}
// Очистка кеша объекта
wp_cache_flush();
}
function wpdetect_recursive_cache_cleanup($dir, $max_age, $now) {
$items = glob($dir . '/*');
foreach ($items as $item) {
if (is_file($item)) {
if ($now - filemtime($item) > $max_age) {
unlink($item);
}
} elseif (is_dir($item)) {
wpdetect_recursive_cache_cleanup($item, $max_age, $now);
@rmdir($item);
}
}
@rmdir($dir);
}
?>Советы по оптимизации работы с кешем в WordPress
Кроме автоматической очистки, рекомендуется:
- Использовать кеш с разумным временем жизни, чтобы данные не устаревали слишком быстро.
- Настроить правильное исключение из кеша динамических элементов, например, корзину WooCommerce.
- Регулярно проверять состояние кеша и логи задач WP-Cron, чтобы убедиться, что очистка проходит успешно.
- В случае использования CDN учитывать их собственные механизмы очистки кеша.
Автоматизация удаления старого кеша — важная часть поддержания производительности и стабильности WordPress-сайта. Используйте готовые плагины для быстрых решений или внедряйте собственные скрипты для тонкой настройки.