В процессе работы сайта на WordPress нередко возникает необходимость автоматически удалять устаревший контент — будь то старые записи блога, устаревшие кастомные посты или временные записи. Это помогает поддерживать базу данных в чистоте, ускорять сайт и экономить ресурсы. В этой статье разберём, как настроить автоматическое удаление старых записей с помощью встроенного планировщика задач WP-Cron, а также приведём рабочие примеры кода.
Что такое WP-Cron и зачем он нужен для автоматизации задач
WP-Cron — это внутренняя система планировщика задач в WordPress, которая позволяет запускать определённые действия по расписанию. В отличие от системных cron в Linux, WP-Cron запускается при обращении к сайту, что накладывает свои особенности.
Использование WP-Cron идеально подходит для автоматизации повторяющихся задач, например, удаления старых записей, очистки кеша, отправки уведомлений и т.д. В нашем случае мы будем создавать кастомное событие, которое будет запускать функцию удаления записей старше заданного срока.
Основные особенности WP-Cron
- Запускается при посещении сайта, что может влиять на точность расписания;
- Можно создавать собственные события с произвольным интервалом;
- Для повышения точности рекомендуется использовать системный cron для вызова wp-cron.php;
- Поддерживает передачу параметров в callback-функции.
Как написать функцию для удаления старых записей в WordPress
Для начала создадим функцию, которая будет искать и удалять записи старше заданного количества дней. В качестве примера возьмём посты типа post и удалим все, которые старше 30 дней.
function wp8_delete_old_posts() {
$days = 30; // количество дней
$date_query = array(
array(
'column' => 'post_date',
'before' => "$days days ago",
),
);
$args = array(
'post_type' => 'post',
'post_status' => 'publish',
'date_query' => $date_query,
'fields' => 'ids',
'posts_per_page' => -1,
);
$old_posts = get_posts($args);
if (!empty($old_posts)) {
foreach ($old_posts as $post_id) {
wp_delete_post($post_id, true); // true — без возможности восстановления
}
}
}Эта функция получает ID всех постов старше 30 дней и удаляет их без перемещения в корзину.
Расширение функции для кастомных типов записей
Если на вашем сайте используются кастомные типы записей, например event или product, просто измените параметр post_type в $args на нужный вам тип или массив типов:
'post_type' => array('post', 'event', 'product'),Это позволит удалять сразу записи нескольких типов.
Добавляем планировщик WP-Cron для регулярного удаления
Теперь создадим событие WP-Cron, которое будет запускать вышеописанную функцию, например, раз в сутки.
Регистрация кастомного интервала и события
По умолчанию доступны интервалы: hourly, twicedaily, daily. Для наших целей подходит daily. Если нужен кастомный интервал, его можно добавить так:
function wp8_add_cron_interval($schedules) {
if (!isset($schedules['weekly'])) {
$schedules['weekly'] = array(
'interval' => 604800, // 7 дней в секундах
'display' => __('Once Weekly'),
);
}
return $schedules;
}
add_filter('cron_schedules', 'wp8_add_cron_interval');Пример регистрации события и привязки функции:
function wp8_schedule_old_post_deletion() {
if (!wp_next_scheduled('wp8_delete_old_posts_event')) {
wp_schedule_event(time(), 'daily', 'wp8_delete_old_posts_event');
}
}
add_action('wp', 'wp8_schedule_old_post_deletion');
add_action('wp8_delete_old_posts_event', 'wp8_delete_old_posts');Этот код проверяет, запланировано ли событие, и если нет — создаёт его с интервалом в сутки. Затем связывает событие wp8_delete_old_posts_event с функцией удаления.
Удаление запланированного события при деактивации плагина
Если этот код размещён в плагине, важно отменять расписание при его деактивации:
function wp8_deactivate_plugin() {
$timestamp = wp_next_scheduled('wp8_delete_old_posts_event');
if ($timestamp) {
wp_unschedule_event($timestamp, 'wp8_delete_old_posts_event');
}
}
register_deactivation_hook(__FILE__, 'wp8_deactivate_plugin');Советы по безопасности и оптимизации
Проверяйте права пользователя
Если планируете запускать удаление из админки или через AJAX, добавьте проверки прав, чтобы предотвратить несанкционированное удаление.
Оптимизация запросов
При большом количестве записей настройте постраничный перебор (пагинацию) в запросах, чтобы избежать превышения лимитов памяти и времени выполнения.
Используйте транзакции и логи
Для критичных данных полезно логировать удалённые записи и использовать транзакции, если это поддерживается вашей базой данных, чтобы избежать потерь.
Альтернативные решения: плагины для автоматизации удаления
Если не хотите писать код, можно использовать готовые плагины, например:
- Clearfy Pro — включает функции по оптимизации и очистке базы данных, в том числе удаление старых записей;
- WPRemark — больше для отзывов, но также умеет автоматизировать работу с контентом;
- Другие плагины для управления базой данных и автоматизации задач.
Однако собственный код даёт максимальный контроль и гибкость.
Полный пример: плагин для удаления старых записей
Ниже пример простого плагина, который автоматически удаляет посты старше 30 дней:
<?php
/**
* Plugin Name: WP8 Auto Delete Old Posts
* Description: Автоматическое удаление старых записей через WP-Cron
* Version: 1.0
* Author: WP8.ru
*/
function wp8_delete_old_posts() {
$days = 30;
$args = array(
'post_type' => 'post',
'post_status' => 'publish',
'date_query' => array(
array('before' => "$days days ago"),
),
'fields' => 'ids',
'posts_per_page' => -1,
);
$old_posts = get_posts($args);
if (!empty($old_posts)) {
foreach ($old_posts as $post_id) {
wp_delete_post($post_id, true);
}
}
}
function wp8_schedule_old_post_deletion() {
if (!wp_next_scheduled('wp8_delete_old_posts_event')) {
wp_schedule_event(time(), 'daily', 'wp8_delete_old_posts_event');
}
}
add_action('wp', 'wp8_schedule_old_post_deletion');
add_action('wp8_delete_old_posts_event', 'wp8_delete_old_posts');
function wp8_deactivate_plugin() {
$timestamp = wp_next_scheduled('wp8_delete_old_posts_event');
if ($timestamp) {
wp_unschedule_event($timestamp, 'wp8_delete_old_posts_event');
}
}
register_deactivation_hook(__FILE__, 'wp8_deactivate_plugin');
?>Разместите этот код в отдельном файле wp8-auto-delete-old-posts.php, загрузите в папку wp-content/plugins и активируйте через админку WordPress.
Заключение
Автоматизация удаления старого контента — важная задача для поддержания производительности и чистоты сайта на WordPress. Использование WP-Cron позволяет легко настроить периодическое удаление по расписанию без дополнительной настройки серверного cron. Приведённые примеры кода и рекомендации помогут вам быстро внедрить данную функциональность на ваш сайт.