Ведение сайта на WordPress часто сопровождается накоплением большого объёма устаревшего контента — старых записей, новостей, черновиков или других типов постов. Это может негативно влиять на производительность базы данных и усложнять администрирование. Чтобы избежать подобных проблем, полезно настроить автоматическое удаление таких записей через систему WP-Cron.
Что такое WP-Cron и почему он важен для автоматизации задач в WordPress
WP-Cron — это виртуальный планировщик задач, встроенный в WordPress. Он позволяет запускать задачи по расписанию, например, проверять обновления, удалять устаревший контент или выполнять резервное копирование. В отличие от системного cron на сервере, WP-Cron запускается при обращении посетителя к вашему сайту, что важно учитывать при настройке.
Для удаления старых записей мы можем создать собственную функцию и повесить её на периодическое событие WP-Cron, например, раз в сутки. Это позволит автоматически очищать базу от ненужных данных, не занимаясь этим вручную.
Как написать функцию для удаления старых записей в WordPress
Рассмотрим пример простой функции, которая удаляет записи старше 90 дней из определённого типа постов. В данном случае мы будем использовать пользовательский тип записи 'post', но вы можете адаптировать код под свои типы.
function wpconfig_delete_old_posts() {
global $wpdb;
$days = 90; // Минимальный возраст записи в днях
$post_type = 'post'; // Тип записей для удаления
$date_threshold = date('Y-m-d H:i:s', strtotime("-{$days} days"));
$old_posts = $wpdb->get_col($wpdb->prepare(
"SELECT ID FROM {$wpdb->posts} WHERE post_type = %s AND post_date < %s AND post_status IN ('publish', 'draft')",
$post_type, $date_threshold
));
if (!empty($old_posts)) {
foreach ($old_posts as $post_id) {
wp_delete_post($post_id, true); // true для полного удаления без перемещения в корзину
}
}
}
В этом коде мы выбираем все записи нужного типа старше 90 дней и удаляем их безвозвратно. Использование функции wp_delete_post с параметром true гарантирует, что записи не будут попадать в корзину.
Безопасность и тестирование функции удаления
Перед тем как запускать автоматическое удаление, настоятельно рекомендуем протестировать функцию вручную, например, вызвав её единожды через админ-панель или через WP-CLI, чтобы избежать случайной потери нужного контента.
Как зарегистрировать крон-задачу для автоматического удаления
Добавим запуск функции в расписание WP-Cron. Для этого создадим событие, которое будет срабатывать ежедневно.
// Добавление нового интервала, если нужно
function wpconfig_add_cron_interval($schedules) {
if (!isset($schedules['daily'])) {
$schedules['daily'] = array(
'interval' => 86400, // 24 часа
'display' => __('Once Daily')
);
}
return $schedules;
}
add_filter('cron_schedules', 'wpconfig_add_cron_interval');
// Регистрация события при активации плагина или темы
function wpconfig_schedule_delete_old_posts() {
if (!wp_next_scheduled('wpconfig_daily_delete_old_posts')) {
wp_schedule_event(time(), 'daily', 'wpconfig_daily_delete_old_posts');
}
}
add_action('wp', 'wpconfig_schedule_delete_old_posts');
// Привязка функции удаления к крон-событию
add_action('wpconfig_daily_delete_old_posts', 'wpconfig_delete_old_posts');
// Очистка расписания при деактивации
function wpconfig_deactivate_cron() {
$timestamp = wp_next_scheduled('wpconfig_daily_delete_old_posts');
if ($timestamp) {
wp_unschedule_event($timestamp, 'wpconfig_daily_delete_old_posts');
}
}
register_deactivation_hook(__FILE__, 'wpconfig_deactivate_cron');
Этот код добавляет ежедневное событие, которое вызывает нашу функцию удаления. Используйте его в плагине или в файле functions.php темы.
Плагины для автоматического удаления старого контента
Если вы предпочитаете готовые решения, рассмотрите эти плагины с возможностью автоматизации удаления:
- Auto Delete Posts — позволяет настроить автоматическое удаление записей по времени, статусу и типу.
- Advanced Cron Manager — удобный инструмент для управления WP-Cron задачами, с помощью которого можно создавать и удалять задачи.
- Clearfy Pro — плагин с набором оптимизаций, включая управление кроном и очистку базы.
Все эти плагины можно адаптировать под ваши задачи, но ручное решение с собственным кодом даёт больше контроля и гибкости.
Советы по безопасности и оптимизации при автоматическом удалении записей
Автоматическое удаление — мощный инструмент, но требует аккуратности:
- Всегда делайте резервные копии базы перед внедрением автоматического удаления.
- Тестируйте функции на тестовом сайте, чтобы избежать случайной потери данных.
- Используйте параметры выбора записей с осторожностью: учитывайте статусы, категории, пользовательские поля.
- Оптимизируйте запросы, чтобы не перегружать базу, особенно на больших сайтах.
- Следите за логами ошибок и при необходимости добавляйте уведомления о выполнении задач.
Пример расширенной функции с фильтрацией по категории
function wpconfig_delete_old_posts_by_category($category_slug) {
$days = 90;
$date_threshold = date('Y-m-d H:i:s', strtotime("-{$days} days"));
$args = array(
'post_type' => 'post',
'posts_per_page' => -1,
'date_query' => array(
array('before' => $date_threshold),
),
'category_name' => $category_slug,
'post_status' => array('publish', 'draft')
);
$old_posts = get_posts($args);
foreach ($old_posts as $post) {
wp_delete_post($post->ID, true);
}
}
Такой подход позволяет точечно удалять записи по категориям, что полезно для крупных проектов с разделением контента.
Используя описанные методы, вы сможете эффективно управлять устаревшим контентом на вашем WordPress-сайте, поддерживая базу данных в оптимальном состоянии и повышая производительность.