В процессе эксплуатации WordPress-сайта нередко возникает необходимость автоматически удалять устаревшие записи, например, новости старше определённого срока, чтобы не засорять базу данных и поддерживать актуальность контента. В этой статье подробно рассмотрим, как реализовать автоматическое удаление старых записей с помощью WP-Cron — встроенного планировщика заданий в WordPress.
Что такое WP-Cron и зачем он нужен для автоматизации задач
WP-Cron — это имитация планировщика задач, которая запускается при каждом заходе пользователя на сайт. С его помощью можно создавать регулярные или разовые события, которые выполняют определённый код в фоне без участия администратора.
К примеру, можно настроить удаление всех записей типа post старше 30 дней, чтобы поддерживать базу в актуальном состоянии.
Важно понимать, что WP-Cron запускается только при посещении сайта, поэтому если трафик низкий, задачи могут запускаться с задержкой. Для сайтов с малым трафиком лучше настроить системный cron на сервере, который будет вызывать WP-Cron вручную.
Создаем функцию для удаления старых записей в WordPress
Для начала создадим функцию wpbuy_delete_old_posts, которая будет находить и удалять посты старше заданного количества дней. Ниже пример кода, который можно добавить в файл functions.php вашей темы или оформить в виде плагина:
function wpbuy_delete_old_posts() {
$days = 30; // удалять записи старше 30 дней
$date = date('Y-m-d H:i:s', strtotime('-' . $days . ' days'));
$args = array(
'post_type' => 'post',
'post_status' => 'publish',
'date_query' => array(
array(
'before' => $date,
'inclusive' => true,
),
),
'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 — удаление без попадания в корзину
}
}
}Эта функция ищет все опубликованные записи, дата публикации которых больше 30 дней назад, и удаляет их насовсем.
Регистрация и планирование задачи WP-Cron
Теперь нужно зарегистрировать событие, которое будет запускать нашу функцию регулярно. Например, раз в сутки.
Добавим регистрацию хука и планирование задачи в functions.php:
function wpbuy_schedule_old_posts_deletion() {
if (! wp_next_scheduled('wpbuy_delete_old_posts_hook')) {
wp_schedule_event(time(), 'daily', 'wpbuy_delete_old_posts_hook');
}
}
add_action('wp', 'wpbuy_schedule_old_posts_deletion');
add_action('wpbuy_delete_old_posts_hook', 'wpbuy_delete_old_posts');Объяснение:
wp_schedule_event— планирует событие с уникальным идентификаторомwpbuy_delete_old_posts_hook, которое будет запускаться ежедневно;- хук
wpbuy_delete_old_posts_hookпривязан к функцииwpbuy_delete_old_posts; - функция
wpbuy_schedule_old_posts_deletionпроверяет, запланировано ли уже событие, и если нет — создает его; - хук
wpиспользуется для запуска функции планирования при каждом заходе на сайт.
Как проверить и отладить работу автозапуска
Для проверки работы WP-Cron можно воспользоваться плагином WP Crontrol. С помощью него можно просмотреть список запланированных событий, запустить их вручную и удалить ненужные.
Также полезно добавить логирование в функцию удаления для отладки. Например, записывать в файл или в системный лог какие записи удаляются.
function wpbuy_delete_old_posts() {
$days = 30;
$date = date('Y-m-d H:i:s', strtotime('-' . $days . ' days'));
$args = array(
'post_type' => 'post',
'post_status' => 'publish',
'date_query' => array(
array(
'before' => $date,
'inclusive' => true,
),
),
'fields' => 'ids',
'posts_per_page' => -1,
);
$old_posts = get_posts($args);
if (!empty($old_posts)) {
foreach ($old_posts as $post_id) {
error_log('wpbuy: deleting post ID ' . $post_id);
wp_delete_post($post_id, true);
}
}
}Расширение: удаление старых кастомных типов записей
Если у вас на сайте есть кастомные типы записей (например, события, проекты, отзывы) и требуется удалять их по аналогии, просто добавьте их в функцию. Например, можно передавать тип записи в параметрах:
function wpbuy_delete_old_posts_by_type($post_type = 'post', $days = 30) {
$date = date('Y-m-d H:i:s', strtotime('-' . $days . ' days'));
$args = array(
'post_type' => $post_type,
'post_status' => 'publish',
'date_query' => array(
array(
'before' => $date,
'inclusive' => true,
),
),
'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);
}
}
}
// Пример вызова для кастомного типа
add_action('wpbuy_delete_old_custom_posts_hook', function() {
wpbuy_delete_old_posts_by_type('events', 60);
});Для запуска этого действия нужно также запланировать событие WP-Cron аналогично предыдущему примеру.
Итоги и рекомендации по автоматическому удалению записей
Автоматическое удаление старых записей через WP-Cron — удобный способ поддерживать базу данных в порядке и не засорять сайт устаревшим контентом. Важно внимательно тестировать такие скрипты, чтобы не удалить нужные данные по ошибке.
Для безопасного удаления можно сначала отправлять посты в корзину вместо полного удаления, заменив wp_delete_post($post_id, true); на wp_delete_post($post_id, false);. Также рекомендуем регулярно делать резервные копии базы данных.
Если нужен более гибкий контроль и расширенный функционал, обратите внимание на плагины автоматизации или оптимизации, например, Clearfy Pro, которые позволяют управлять автоматическими задачами без кода.