Проблема накопления старых кастомных записей в WordPress
В проектах на WordPress часто создают кастомные типы записей (Custom Post Types, CPT) для хранения специфичных данных — например, события, отзывы, заявки и т.д. Со временем эти записи накапливаются, и не все из них актуальны. Особенно если CPT используется для временных данных, например, промо-акций или временных заявок, старые записи могут засорять базу и замедлять сайт.
Ручное удаление таких записей неудобно, а автоматизация поможет поддерживать базу в порядке без лишних усилий.
В этой статье рассмотрим, как реализовать автоматическое удаление старых записей кастомного типа по дате публикации с помощью планировщика задач WP-Cron и кастомного кода.
Создание функции для удаления старых записей по условию
Для начала напишем функцию, которая будет искать записи кастомного типа старше заданного периода и удалять их.
Например, у нас есть кастомный тип записей event, и мы хотим удалять все события старше 30 дней.
Пример функции удаления старых записей
function wpquery_delete_old_events() {
$days_old = 30; // количество дней
$date_threshold = date('Y-m-d H:i:s', strtotime("-{$days_old} days"));
$args = [
'post_type' => 'event',
'posts_per_page' => -1,
'date_query' => [
[
'column' => 'post_date',
'before' => $date_threshold,
],
],
'fields' => 'ids',
'post_status' => 'publish',
];
$old_posts = get_posts($args);
if (!empty($old_posts)) {
foreach ($old_posts as $post_id) {
wp_delete_post($post_id, true); // true — удаление без корзины
}
}
}Эта функция получает ID всех записей типа event, дата создания которых старше 30 дней, и удаляет их без перемещения в корзину.
Автоматизация запуска с помощью WP-Cron
Чтобы удаление происходило автоматически, привяжем функцию к событию WP-Cron, запускающемуся, например, раз в сутки.
Регистрация cron-события
function wpquery_schedule_old_events_cleanup() {
if (!wp_next_scheduled('wpquery_daily_old_events_cleanup')) {
wp_schedule_event(time(), 'daily', 'wpquery_daily_old_events_cleanup');
}
}
add_action('wp', 'wpquery_schedule_old_events_cleanup');Эта функция проверяет, запланировано ли уже ежедневное событие, и если нет — регистрирует его.
Привязка функции удаления к cron-событию
add_action('wpquery_daily_old_events_cleanup', 'wpquery_delete_old_events');Теперь функция wpquery_delete_old_events будет вызываться раз в сутки автоматически.
Отладка и проверка работы очистки
Для проверки можно вызвать функцию вручную один раз через админку или подключить временный вызов:
// Временно добавить вызов для теста
add_action('admin_init', 'wpquery_delete_old_events');После подтверждения работы удаление можно убрать.
Также полезно добавить логирование в файл или транзиенты, чтобы отслеживать, сколько записей удаляется за раз.
Дополнительные рекомендации и примеры
Удаление записей с кастомным полем
Если нужно удалять записи не по дате создания, а по значению метаполя, например, статусу, можно расширить запрос:
$args = [
'post_type' => 'event',
'posts_per_page' => -1,
'meta_query' => [
[
'key' => 'status',
'value' => 'expired',
'compare' => '=',
],
],
'fields' => 'ids',
];Использование плагина для поддержки WP-Cron
Для надежного запуска WP-Cron на сайтах с низким трафиком рекомендуем использовать плагин WP Crontrol, который позволяет просматривать и тестировать задачи cron через админку.
Оптимизация производительности
Если записей очень много, лучше удалять не все сразу, а партиями, например, по 50 штук за раз, чтобы не нагружать сервер.
function wpquery_delete_old_events_batch() {
$days_old = 30;
$date_threshold = date('Y-m-d H:i:s', strtotime("-{$days_old} days"));
$args = [
'post_type' => 'event',
'posts_per_page' => 50,
'date_query' => [
[
'column' => 'post_date',
'before' => $date_threshold,
],
],
'fields' => 'ids',
'post_status' => 'publish',
];
$old_posts = get_posts($args);
if (!empty($old_posts)) {
foreach ($old_posts as $post_id) {
wp_delete_post($post_id, true);
}
}
}И запускать эту функцию каждую минуту или несколько раз в день через WP-Cron.
Выводы
Автоматическое удаление устаревших кастомных записей помогает держать базу данных WordPress в порядке и ускоряет работу сайта. Используя WP-Cron и кастомный код, вы легко настроите такую очистку под свои задачи.
Если хотите более гибкие настройки и удобный интерфейс — обратите внимание на плагин Clearfy Pro, который включает функции оптимизации и автоматического удаления мусора в WordPress.