В процессе эксплуатации сайта на WordPress со временем накапливается большое количество устаревших записей, черновиков и ревизий, которые занимают место в базе данных и могут замедлять работу сайта. Автоматизация удаления таких записей поможет поддерживать базу данных в оптимальном состоянии без ручного вмешательства. В этой статье мы рассмотрим, как настроить удаление старых записей в WordPress с помощью встроенного механизма WP-Cron и собственных функций.
Что такое WP-Cron и зачем он нужен для автоматизации
WP-Cron — это внутренний планировщик задач WordPress, который позволяет запускать определённые функции в заданное время или с определённой периодичностью. В отличие от системного cron Linux, WP-Cron запускается при посещении сайта, что позволяет реализовать автоматизацию на любом хостинге, без доступа к системным задачам.
Используя WP-Cron, можно автоматизировать процессы, которые требуют регулярного выполнения, например, очистку базы от старых записей, отправку писем, обновление данных и пр.
Как настроить автоматическое удаление старых записей
Для примера создадим функцию, которая будет удалять записи кастомного типа event, созданные более 180 дней назад. Этот пример можно адаптировать для любых типов записей, включая стандартные post, page и другие.
Создание функции удаления старых записей
function wppartner_delete_old_events() {
global $wpdb;
$days = 180; // число дней для хранения записей
$date_threshold = date('Y-m-d H:i:s', strtotime("-{$days} days"));
// Получаем ID записей типа 'event' старше $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', 'pending')",
'event', $date_threshold
));
if (!empty($old_posts)) {
foreach ($old_posts as $post_id) {
// Удаляем запись без возможности восстановления (force delete)
wp_delete_post($post_id, true);
}
}
}
В функции мы используем глобальный объект $wpdb для выборки записей, чтобы избежать лишних запросов и повысить производительность.
Регистрация события WP-Cron
Теперь нужно зарегистрировать событие, которое будет регулярно запускать эту функцию. Например, один раз в сутки.
function wppartner_schedule_old_events_deletion() {
if (!wp_next_scheduled('wppartner_daily_old_events_cleanup')) {
wp_schedule_event(time(), 'daily', 'wppartner_daily_old_events_cleanup');
}
}
add_action('wp', 'wppartner_schedule_old_events_deletion');
add_action('wppartner_daily_old_events_cleanup', 'wppartner_delete_old_events');
Объяснение кода:
wppartner_schedule_old_events_deletionпроверяет, запланировано ли событие с хук-событиемwppartner_daily_old_events_cleanup, если нет — создает планировщик с частотойdaily.- При срабатывании события вызывается функция
wppartner_delete_old_events, которая удаляет старые записи.
Дополнительные настройки и улучшения
Настройка времени запуска
Если нужно запускать задачу не ежедневно, а с другой периодичностью, можно добавить собственный интервал:
function wppartner_custom_cron_schedules($schedules) {
if (!isset($schedules['weekly'])) {
$schedules['weekly'] = array(
'interval' => 604800, // 7 дней в секундах
'display' => __('Еженедельно')
);
}
return $schedules;
}
add_filter('cron_schedules', 'wppartner_custom_cron_schedules');
После этого в wp_schedule_event можно указать 'weekly'.
Удаление не только записей, но и связанных данных
Иногда необходимо удалять не только посты, но и связанные метаданные или таксономии. В этом случае можно расширить функцию:
function wppartner_delete_old_events_extended() {
global $wpdb;
$days = 180;
$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', 'pending')",
'event', $date_threshold
));
if (!empty($old_posts)) {
foreach ($old_posts as $post_id) {
// Удаляем метаданные
delete_post_meta($post_id);
// Удаляем связи с таксономиями
wp_set_object_terms($post_id, null, 'event_category');
// Удаляем сам пост
wp_delete_post($post_id, true);
}
}
}
Использование плагинов для управления очисткой базы
Если вы не хотите писать собственный код, существуют плагины, которые помогут с автоматической очисткой:
- Clearfy Pro — плагин для оптимизации и очистки базы, включая удаление ревизий и устаревших записей.
- WPRemark — инструмент для автоматизации работы с контентом, который можно настроить и для удаления устаревшего контента.
Однако собственный код даёт максимальный контроль и гибкость под конкретные задачи.
Отладка и мониторинг выполнения WP-Cron
Проверить, что задачи WP-Cron запускаются корректно, можно с помощью плагина WP Crontrol. Он позволяет просматривать, запускать и удалять запланированные задачи.
Если WP-Cron не срабатывает, возможно, на вашем хостинге стоит системный cron, который отключает внутренний планировщик WordPress. В этом случае настройте запуск wp-cron.php через системный cron вручную.
Итог
Автоматизация удаления старых записей в WordPress с помощью WP-Cron и собственных функций позволяет поддерживать базу данных в чистоте, улучшать производительность сайта и экономить место на сервере. В статье приведен подробный пример кода, который можно быстро адаптировать под свои типы записей и задачи.