В процессе работы сайта на WordPress часто возникает задача автоматически удалять старые записи, чтобы поддерживать актуальность контента и оптимизировать базу данных. В этой статье рассмотрим, как реализовать удаление устаревших записей с помощью встроенной системы планировщика задач WP-Cron, а также приведём примеры полезных функций и плагинов для удобства управления.
Что такое WP-Cron и почему он подходит для автоматизации удаления записей
WP-Cron — это встроенный механизм планировщика задач в WordPress, который позволяет выполнять определённые функции по расписанию без необходимости доступа к системному cron сервера. Он запускается при посещении сайта, проверяет запланированные задачи и выполняет их.
Для удаления старых записей WP-Cron идеально подходит, так как позволяет настроить регулярный запуск специальной функции, которая будет удалять записи старше определённого времени. Это особенно актуально для сайтов с новостями, блогами и другими типами контента, где важна актуальность.
Однако стоит учитывать, что WP-Cron запускается не по точному времени, а при посещении сайта, поэтому если трафик низкий, задача может выполниться с задержкой.
Как реализовать автоматическое удаление старых записей через WP-Cron
Для начала нужно создать функцию, которая будет находить и удалять записи старше заданного срока. Например, удалим записи, опубликованные более 180 дней назад.
function wpbe_auto_delete_old_posts() {
global $wpdb;
$days = 180; // Количество дней для хранения записей
$date_threshold = date('Y-m-d H:i:s', strtotime('-' . $days . ' days'));
$old_posts = get_posts([
'date_query' => [
[
'column' => 'post_date',
'before' => $date_threshold,
],
],
'post_type' => 'post',
'post_status' => 'publish',
'fields' => 'ids',
'numberposts' => -1,
]);
if (!empty($old_posts)) {
foreach ($old_posts as $post_id) {
wp_delete_post($post_id, true); // true — удалить без возможности восстановления
}
}
}Далее нужно зарегистрировать событие WP-Cron, которое будет запускать эту функцию, например, раз в сутки.
function wpbe_schedule_delete_old_posts() {
if (!wp_next_scheduled('wpbe_daily_delete_old_posts_event')) {
wp_schedule_event(time(), 'daily', 'wpbe_daily_delete_old_posts_event');
}
}
add_action('wp', 'wpbe_schedule_delete_old_posts');
add_action('wpbe_daily_delete_old_posts_event', 'wpbe_auto_delete_old_posts');Этот код проверит, есть ли уже запланированное событие, и если нет — создаст его. Затем при срабатывании события будет вызвана функция удаления.
Управление расписанием и дополнительные настройки WP-Cron
По умолчанию WordPress поддерживает несколько интервалов для WP-Cron: hourly, twicedaily и daily. Чтобы расширить возможности, можно добавить собственные интервалы, например, еженедельно.
function wpbe_custom_cron_schedules($schedules) {
$schedules['weekly'] = [
'interval' => 7 * 24 * 60 * 60, // 7 дней в секундах
'display' => __('Еженедельно')
];
return $schedules;
}
add_filter('cron_schedules', 'wpbe_custom_cron_schedules');После добавления интервала можно заменить 'daily' в wp_schedule_event на 'weekly' для запуска задачи раз в неделю.
Важно помнить, что при деактивации темы или плагина, где зарегистрирована задача, событие нужно удалять:
function wpbe_deactivate_delete_old_posts() {
$timestamp = wp_next_scheduled('wpbe_daily_delete_old_posts_event');
if ($timestamp) {
wp_unschedule_event($timestamp, 'wpbe_daily_delete_old_posts_event');
}
}
register_deactivation_hook(__FILE__, 'wpbe_deactivate_delete_old_posts');Использование плагинов для упрощения автоматического удаления записей
Если вы не хотите писать код, можно использовать плагины для управления автоматическим удалением записей:
- WP Bulk Delete — позволяет фильтровать записи по дате, категории, статусу и удалять их по расписанию. Поддерживает интеграцию с WP-Cron.
- Auto Delete Posts — простой плагин для автоматического удаления записей по времени.
При использовании плагинов стоит внимательно настраивать фильтры и тестировать работу на копии сайта, чтобы случайно не удалить важный контент.
Рекомендации по безопасности и резервному копированию
Удаление записей — операция необратимая, особенно если используется параметр wp_delete_post($post_id, true), который удаляет запись без помещения в корзину. Поэтому перед внедрением автоматического удаления обязательно настройте регулярное резервное копирование базы данных.
Также можно добавить логирование удалённых записей для мониторинга работы скрипта. Например, записывать ID и дату удаления в отдельный файл или таблицу.
function wpbe_log_deleted_post($post_id) {
$log_entry = date('Y-m-d H:i:s') . ' - Deleted post ID: ' . $post_id . PHP_EOL;
file_put_contents(WP_CONTENT_DIR . '/deleted-posts.log', $log_entry, FILE_APPEND);
}
function wpbe_auto_delete_old_posts() {
$days = 180;
$date_threshold = date('Y-m-d H:i:s', strtotime('-' . $days . ' days'));
$old_posts = get_posts([
'date_query' => [[ 'column' => 'post_date', 'before' => $date_threshold, ]],
'post_type' => 'post', 'post_status' => 'publish', 'fields' => 'ids', 'numberposts' => -1,
]);
if (!empty($old_posts)) {
foreach ($old_posts as $post_id) {
wp_delete_post($post_id, true);
wpbe_log_deleted_post($post_id);
}
}
}Заключение. Практика на wpbe.ru
Автоматизация удаления старых записей с помощью WP-Cron — это эффективный способ поддерживать чистоту контента и оптимизировать работу сайта. При грамотном подходе можно избежать нагрузки на сервер и ошибок.
На сайте WPSHOP вы также можете найти полезные инструменты и плагины для расширения возможностей WordPress, которые помогут в управлении контентом и автоматизации.