Автоматизация очистки базы данных от устаревшего контента — важный аспект поддержки производительности и актуальности вашего сайта на WordPress. В этой статье мы подробно разберём, как настроить автоматическое удаление старых записей (постов) через встроенный планировщик задач WP-Cron. Вы получите готовые решения с примерами кода, которые легко интегрировать в свою тему или плагин.
Что такое WP-Cron и зачем использовать его для удаления старых записей
WP-Cron — это внутренний механизм планирования событий в WordPress, который позволяет выполнять задачи по расписанию без необходимости обращения к серверному cron. Он запускается при посещении сайта, что удобно для хостингов без доступа к системному cron.
Удаление старых записей помогает:
- освободить место в базе данных;
- повысить производительность запросов;
- сохранить актуальность контента;
- снизить нагрузку на сервер.
Однако важно делать это аккуратно, чтобы не удалить полезные данные и не повредить структуру сайта.
Как создать функцию для удаления записей старше определённого времени
Для начала напишем функцию, которая будет удалять записи по условию — например, все записи типа post, опубликованные более 180 дней назад. Используем WP_Query для выборки и функцию wp_delete_post() для удаления.
function wpturbo_delete_old_posts() {
$days = 180; // количество дней
$date_query = array(
'column' => 'post_date',
'before' => date('Y-m-d H:i:s', strtotime('-' . $days . ' days')),
);
$query = new WP_Query(array(
'post_type' => 'post',
'post_status' => 'publish',
'date_query' => array($date_query),
'posts_per_page' => 50, // ограничение на удаление за раз
'fields' => 'ids',
'no_found_rows' => true,
));
if ($query->have_posts()) {
foreach ($query->posts as $post_id) {
wp_delete_post($post_id, true); // true — удаление без перемещения в корзину
}
}
}Важные моменты:
- Мы ограничиваем количество записей за одну итерацию, чтобы избежать таймаутов.
- Удаляем без перемещения в корзину для полной очистки. При необходимости можно изменить на
false.
Регистрация задачи в WP-Cron для периодического запуска удаления
Теперь нужно настроить периодический запуск функции. Для этого зарегистрируем собственное событие WP-Cron и хук для вызова функции.
function wpturbo_schedule_old_posts_deletion() {
if (!wp_next_scheduled('wpturbo_delete_old_posts_event')) {
wp_schedule_event(time(), 'daily', 'wpturbo_delete_old_posts_event');
}
}
add_action('wp', 'wpturbo_schedule_old_posts_deletion');
add_action('wpturbo_delete_old_posts_event', 'wpturbo_delete_old_posts');Объяснение:
wp_schedule_event()планирует ежедневный запуск событияwpturbo_delete_old_posts_event.- Хук
add_action('wpturbo_delete_old_posts_event', ...)привязывает нашу функцию удаления. - Функция
wpturbo_schedule_old_posts_deletion()вызывается при каждом заходе на сайт и проверяет, не запланировано ли событие уже.
Как безопасно удалить записи и избежать проблем
Удаление данных — операция рискованная. Чтобы минимизировать ошибки, учтите следующие рекомендации:
- Перед удалением сделайте резервную копию базы данных.
- Используйте флаг
force_delete=trueвwp_delete_post(), если хотите удалить записи без перемещения в корзину. - Добавьте логирование, чтобы отслеживать, какие записи удаляются. Пример:
function wpturbo_delete_old_posts() {
$days = 180;
$date_query = array(
'column' => 'post_date',
'before' => date('Y-m-d H:i:s', strtotime('-' . $days . ' days')),
);
$query = new WP_Query(array(
'post_type' => 'post',
'post_status' => 'publish',
'date_query' => array($date_query),
'posts_per_page' => 50,
'fields' => 'ids',
'no_found_rows' => true,
));
if ($query->have_posts()) {
foreach ($query->posts as $post_id) {
if(wp_delete_post($post_id, true)) {
error_log('WPturbo: deleted post ID ' . $post_id);
} else {
error_log('WPturbo: failed to delete post ID ' . $post_id);
}
}
}
}Использование плагина Clearfy для управления задачами WP-Cron
Если вы не хотите писать код вручную, рекомендую обратить внимание на плагин Clearfy Pro. Он позволяет управлять WP-Cron задачами, отключать ненужные, оптимизировать расписания и создавать пользовательские задачи через интерфейс.
Преимущества Clearfy:
- Удобный интерфейс для настройки событий и интервалов.
- Мониторинг и логирование выполнения задач.
- Возможность отключать конфликтующие или устаревшие задачи.
Расширение: удаление записей по пользовательским условиям
В реальном проекте может потребоваться удалять записи по другим критериям: по категориям, тегам или пользовательским полям. Вот пример, как удалить записи, относящиеся к категории с ID 12, старше 90 дней:
function wpturbo_delete_old_category_posts() {
$days = 90;
$date_query = array(
'column' => 'post_date',
'before' => date('Y-m-d H:i:s', strtotime('-' . $days . ' days')),
);
$query = new WP_Query(array(
'post_type' => 'post',
'post_status' => 'publish',
'category__in' => array(12),
'date_query' => array($date_query),
'posts_per_page' => 50,
'fields' => 'ids',
'no_found_rows' => true,
));
if ($query->have_posts()) {
foreach ($query->posts as $post_id) {
wp_delete_post($post_id, true);
}
}
}
add_action('wpturbo_delete_old_category_posts_event', 'wpturbo_delete_old_category_posts');
function wpturbo_schedule_old_category_posts_deletion() {
if (!wp_next_scheduled('wpturbo_delete_old_category_posts_event')) {
wp_schedule_event(time(), 'weekly', 'wpturbo_delete_old_category_posts_event');
}
}
add_action('wp', 'wpturbo_schedule_old_category_posts_deletion');Так можно гибко настраивать очистку контента под нужды проекта.
Заключение
Автоматическое удаление старых записей через WP-Cron — мощный инструмент, который помогает поддерживать сайт WordPress в оптимальном состоянии. Используя описанные методы и примеры кода, вы сможете организовать регулярную очистку базы данных без лишних усилий и с максимальной безопасностью.
Если хотите упростить управление задачами, попробуйте плагин Clearfy Pro. Он отлично дополняет кастомные решения и повышает контроль над WP-Cron.