Автоматическое удаление старых записей WordPress по значению метаполя

В некоторых проектах на WordPress возникает необходимость автоматически удалять записи, у которых определённое метаполе указывает на дату или срок устаревания. Это может быть полезно для новостных сайтов, каталогов, сайтов с акциями или временными предложениями. В этой статье разберём, как грамотно и эффективно реализовать автоматическое удаление старых записей по значению метаполя, используя WP Cron и кастомный PHP-код.

Почему важно удалять устаревшие записи автоматически

Ручное удаление устаревших материалов не всегда удобно и быстро, особенно если на сайте много записей. Автоматизация процесса позволяет:

  • Поддерживать базу данных в оптимальном состоянии, не захламляя её миллионами неактуальных записей.
  • Избежать показа пользователям устаревшего контента и ошибок в логике сайта.
  • Снизить нагрузку на сервер и улучшить скорость работы сайта.

Для реализации такого функционала в WordPress нам потребуется написать функцию, проверяющую метаполе и удаляющую записи, срок которых истёк, а также настроить WP Cron для регулярного запуска этой функции.

Определяем метаполе и формат даты

Для примера предположим, что у нас есть метаполе с ключом expiration_date, в котором хранится дата истечения срока записи в формате YYYY-MM-DD. При достижении этой даты запись должна быть удалена.

Если у вас другой формат или ключ, заменяйте их в коде соответственно.

Создаём функцию для удаления устаревших записей

Ниже пример функции wpdeveloper_delete_expired_posts(), которая делает запрос к базе, получает записи с установленным метаполем и датой истечения не позже текущей, и удаляет их программно.

function wpdeveloper_delete_expired_posts() {
    $today = date('Y-m-d');

    $args = array(
        'post_type'      => 'post',
        'post_status'    => 'publish',
        'meta_query'     => array(
            array(
                'key'     => 'expiration_date',
                'value'   => $today,
                'compare' => '<=',
                'type'    => 'DATE',
            ),
        ),
        'posts_per_page' => -1,
        'fields'         => 'ids',
    );

    $expired_posts = get_posts($args);

    if (!empty($expired_posts)) {
        foreach ($expired_posts as $post_id) {
            wp_delete_post($post_id, true); // true - удалить без возможности восстановления
        }
    }
}

Обратите внимание, что мы используем wp_delete_post с параметром true для полного удаления. Если хотите сначала отправлять записи в корзину, замените true на false или опустите параметр.

Настраиваем WP Cron для регулярного запуска функции

Чтобы функция автоматически запускалась, нужно зарегистрировать событие WP Cron. Например, чтобы проверять устаревшие записи раз в сутки.

if (!wp_next_scheduled('wpdeveloper_daily_expired_posts_cleanup')) {
    wp_schedule_event(time(), 'daily', 'wpdeveloper_daily_expired_posts_cleanup');
}

add_action('wpdeveloper_daily_expired_posts_cleanup', 'wpdeveloper_delete_expired_posts');

Этот код добавьте в файл functions.php активной темы или в отдельный плагин. Он проверит, запланировано ли уже событие, и если нет, создаст ежедневное задание, которое будет запускать нашу функцию.

Обработка ошибок и логирование

Для отладки и контроля полезно добавить логирование в файл, чтобы знать, когда и какие записи удаляются.

function wpdeveloper_delete_expired_posts() {
    $today = date('Y-m-d');
    $args = array(
        'post_type'      => 'post',
        'post_status'    => 'publish',
        'meta_query'     => array(
            array(
                'key'     => 'expiration_date',
                'value'   => $today,
                'compare' => '<=',
                'type'    => 'DATE',
            ),
        ),
        'posts_per_page' => -1,
        'fields'         => 'ids',
    );

    $expired_posts = get_posts($args);

    if (!empty($expired_posts)) {
        foreach ($expired_posts as $post_id) {
            if(wp_delete_post($post_id, true)) {
                error_log('wpdeveloper: удалена запись ID ' . $post_id . ' по дате истечения ' . $today);
            } else {
                error_log('wpdeveloper: не удалось удалить запись ID ' . $post_id);
            }
        }
    } else {
        error_log('wpdeveloper: нет записей для удаления на ' . $today);
    }
}

Это поможет отследить работу скрипта в файле журнала ошибок PHP.

Дополнительные рекомендации и плагины

Для более сложных случаев можно расширить функционал:

  • Удалять записи не сразу, а переводить в черновики или кастомный статус перед удалением.
  • Отправлять уведомления администратору о списке удалённых записей.
  • Добавлять пользовательский интерфейс в админке для управления настройками автоудаления.

Если хочется использовать готовые решения, обратите внимание на плагины:

  • Post Expirator — позволяет назначать даты удаления или изменения статуса постов прямо из редактора.
  • Clearfy Pro — содержит расширенные инструменты оптимизации, включая управление автоматизацией.

Заключение по теме автоудаления по метаполю

Автоматическое удаление записей по дате в метаполе — удобный и мощный инструмент управления контентом WordPress. Правильно настроенный код и cron-задача помогут поддерживать сайт в актуальном состоянии без лишних усилий. При необходимости расширения функционала можно интегрировать уведомления, дополнительные статусы и пользовательские настройки.

Удаление продаж WooCommerce по дате и статусу: практическое руководство
03.05.2026
Как создать адаптивные блоки в WordPress Gutenberg
02.12.2025
Удаление заказов WooCommerce по клиенту и периоду через код
24.05.2026
Как удалить виджеты в WordPress по умолчанию
27.03.2026
Как создать собственный виджет WordPress с использованием классов
13.11.2025