В повседневной работе с WordPress часто возникает необходимость автоматически удалять устаревшие записи, например, старые новости, события или временные данные. В этой статье мы подробно разберём, как создать кастомную функцию для автоматического удаления записей по условию даты с помощью встроенного планировщика задач — WP-Cron.
Что такое WP-Cron и зачем его использовать для автоматизации задач
WP-Cron — это виртуальный планировщик задач в WordPress, который позволяет запускать определённые функции по расписанию без необходимости настраивать системный cron на сервере. Это полезно для автоматизации рутинных задач, таких как очистка базы данных, отправка уведомлений или, в нашем случае, удаление устаревших записей.
Основные преимущества использования WP-Cron:
- Простота настройки, не требует доступа к серверу;
- Гибкость — можно задать любую периодичность;
- Интеграция с ядром WordPress и плагинами.
Однако стоит учитывать, что WP-Cron запускается только при посещении сайта, поэтому при низкой посещаемости задачи могут запускаться с задержкой.
Создание кастомной функции для удаления старых записей
Для примера мы создадим функцию, которая будет удалять записи типа post, опубликованные более 30 дней назад. Если у вас есть собственный тип записи, например, event, достаточно заменить параметр post_type в запросе.
Вот пример кода функции с подробными комментариями:
function wpgen_delete_old_posts() {
// Получаем дату, старше которой записи нужно удалить
$date_threshold = date('Y-m-d H:i:s', strtotime('-30 days'));
// Параметры WP_Query для выборки старых постов
$args = array(
'post_type' => 'post', // Можно заменить на свой тип записи
'post_status' => 'publish',
'date_query' => array(
array(
'before' => $date_threshold,
),
),
'fields' => 'ids', // Получаем только ID для оптимизации
'posts_per_page' => -1,
);
$query = new WP_Query($args);
if ($query->have_posts()) {
foreach ($query->posts as $post_id) {
// Безопасное удаление записи
wp_delete_post($post_id, true); // true — принудительное удаление без корзины
}
}
wp_reset_postdata();
}Эта функция извлекает все публикации старше 30 дней и удаляет их без возможности восстановления из корзины.
Регистрация и запуск функции через WP-Cron
Чтобы функция запускалась автоматически, нужно привязать её к событию WP-Cron и зарегистрировать это событие.
1. Добавим хук для запуска функции по событию:
add_action('wpgen_delete_old_posts_event', 'wpgen_delete_old_posts');2. Зарегистрируем периодическое событие при инициализации темы или плагина:
function wpgen_schedule_delete_old_posts() {
if (!wp_next_scheduled('wpgen_delete_old_posts_event')) {
// Запускаем задачу один раз в сутки
wp_schedule_event(time(), 'daily', 'wpgen_delete_old_posts_event');
}
}
add_action('wp', 'wpgen_schedule_delete_old_posts');3. Для отмены задачи при деактивации плагина или темы используйте:
function wpgen_unschedule_delete_old_posts() {
$timestamp = wp_next_scheduled('wpgen_delete_old_posts_event');
if ($timestamp) {
wp_unschedule_event($timestamp, 'wpgen_delete_old_posts_event');
}
}
// Пример использования при деактивации плагина
register_deactivation_hook(__FILE__, 'wpgen_unschedule_delete_old_posts');Как проверить и отладить работу WP-Cron задачи
Для диагностики можно использовать плагин WP Crontrol. Он позволяет:
- Просматривать зарегистрированные задачи WP-Cron;
- Запускать задачи вручную;
- Редактировать расписание и параметры задач.
Если ваша задача не запускается, проверьте, что:
- Событие зарегистрировано и запланировано;
- На сайт заходят пользователи — WP-Cron запускается при посещении;
- Нет конфликтов с другими плагинами или темой.
Расширение функционала: удаление записей из пользовательских типов и с метками
Вы можете легко адаптировать функцию под свои нужды. Например, удалять записи определённого типа или с конкретной меткой. Вот пример с пользовательским типом event и меткой archived:
function wpgen_delete_old_events() {
$date_threshold = date('Y-m-d H:i:s', strtotime('-60 days'));
$args = array(
'post_type' => 'event',
'post_status' => 'publish',
'date_query' => array(
array(
'before' => $date_threshold,
),
),
'tax_query' => array(
array(
'taxonomy' => 'post_tag',
'field' => 'slug',
'terms' => 'archived',
),
),
'fields' => 'ids',
'posts_per_page' => -1,
);
$query = new WP_Query($args);
if ($query->have_posts()) {
foreach ($query->posts as $post_id) {
wp_delete_post($post_id, true);
}
}
wp_reset_postdata();
}Этот код позволит гибко управлять удалением контента, что полезно для поддержания актуальности сайта и экономии места на сервере.
Заключение по практике автоматического удаления записей
Автоматизация удаления устаревших записей с помощью WP-Cron и кастомных функций — мощный инструмент для разработчиков и администраторов WordPress. Это помогает поддерживать базу данных в порядке, улучшает производительность и освобождает вас от необходимости вручную чистить старый контент.
Если хотите более продвинутые решения, обратите внимание на плагин Clearfy Pro, который содержит модули для оптимизации и автоматизации, включая управление задачами WP-Cron.