Как удалить записи по атрибуту meta в WordPress через cron

В работе с WordPress часто возникает необходимость автоматически удалять записи, которые соответствуют определённым условиям. Один из распространённых вариантов — удаление записей по заданному значению custom field (meta-атрибута). В этой статье подробно разберём, как реализовать удаление таких записей через встроенный механизм cron WordPress. Это решение особенно полезно для сайтов с большим количеством контента, где нужно периодически чистить устаревшие или неактуальные записи по мета-данным.

Почему стоит использовать cron для удаления записей по meta

Удаление записей по meta-атрибуту вручную — трудоёмкая и рискованная задача, особенно если записей много и фильтрация сложная. Автоматизация через cron позволяет:

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

Для примера возьмём ситуацию, когда нужно удалять записи типа post с meta-ключом wplike_expire_date, у которых дата истекла.

Настройка WP cron: планирование задачи удаления записей

WordPress имеет встроенный псевдокрон — WP-Cron. Для автоматизации удаления создадим задачу, которая будет запускаться, например, раз в сутки.

Регистрация события cron

Добавьте в файл functions.php вашей темы или в собственный плагин следующий код:

// Регистрируем новую задачу cron с интервалом в сутки
if (!wp_next_scheduled('wplike_cron_delete_expired_posts')) {
    wp_schedule_event(time(), 'daily', 'wplike_cron_delete_expired_posts');
}

Если нужен нестандартный интервал, можно добавить свой интервал через фильтр cron_schedules:

add_filter('cron_schedules', 'wplike_add_cron_interval');
function wplike_add_cron_interval($schedules) {
    $schedules['every_six_hours'] = [
        'interval' => 6 * 3600,
        'display'  => __('Каждые 6 часов')
    ];
    return $schedules;
}

Создание функции удаления записей

Теперь напишем функцию, которая будет вызываться по cron и удалять записи:

add_action('wplike_cron_delete_expired_posts', 'wplike_delete_expired_posts');

function wplike_delete_expired_posts() {
    global $wpdb;

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

    // Получаем ID записей с истекшей датой в meta
    $post_ids = $wpdb->get_col($wpdb->prepare(
        "SELECT post_id FROM {$wpdb->postmeta} pm
         INNER JOIN {$wpdb->posts} p ON pm.post_id = p.ID
         WHERE pm.meta_key = %s
           AND pm.meta_value < %s
           AND p.post_type = 'post'
           AND p.post_status = 'publish'",
        'wplike_expire_date', $today
    ));

    if (!empty($post_ids)) {
        foreach ($post_ids as $post_id) {
            wp_delete_post($post_id, true); // true — удаление без перемещения в корзину
        }
    }
}

Обратите внимание, что в meta_value хранится дата в формате YYYY-MM-DD. Если формат другой — нужно адаптировать сравнение.

Отладка и проверка работы cron задачи

Для проверки, что cron работает корректно, можно использовать плагин WP Crontrol. Он позволяет смотреть список запланированных задач, запускать их вручную и удалять.

Также полезно добавить логирование удаления, чтобы видеть, когда и какие записи удалялись:

function wplike_delete_expired_posts() {
    global $wpdb;

    $today = date('Y-m-d');
    $post_ids = $wpdb->get_col($wpdb->prepare(
        "SELECT post_id FROM {$wpdb->postmeta} pm
         INNER JOIN {$wpdb->posts} p ON pm.post_id = p.ID
         WHERE pm.meta_key = %s
           AND pm.meta_value < %s
           AND p.post_type = 'post'
           AND p.post_status = 'publish'",
        'wplike_expire_date', $today
    ));

    if (!empty($post_ids)) {
        foreach ($post_ids as $post_id) {
            wp_delete_post($post_id, true);
            error_log('Удалена запись ID: ' . $post_id);
        }
    } else {
        error_log('Нет записей для удаления по cron ' . date('Y-m-d H:i:s'));
    }
}

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

1. Если на сайте много записей, лучше запускать удаление партиями, например по 50 штук за один запуск, чтобы не перегружать сервер.

2. Для более сложных условий можно использовать WP_Query с meta_query, но для массового удаления быстрее будет прямой SQL-запрос.

3. Убедитесь, что cron запускается регулярно. На некоторых хостингах WP-Cron не срабатывает без посещений сайта. Для надёжности настройте системный cron, который вызывает wp-cron.php.

Полезные плагины для управления cron и удалением записей

  • Clearfy Pro — содержит инструменты для оптимизации и управления задачами cron;
  • WP Crontrol — визуальный менеджер cron задач;
  • Quizle, WPRemark — пригодятся для сайтов с пользовательским контентом, где тоже могут понадобиться подобные автоматизации;
  • Если нужен более гибкий контроль — можно написать отдельный плагин с вашей логикой удаления.

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

Как настроить автоматический импорт постов в WordPress с помощью REST API
13.03.2026
Как добавить настройки в панель администратора WordPress
29.11.2025
Как добавить автоматическое удаление старых записей через cron в WordPress
31.12.2025
Как использовать динамические заголовки в WordPress для SEO
07.12.2025
Автоматическое удаление неактивных пользователей WordPress
25.01.2026