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

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

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

Если на сайте периодически создаются записи с определёнными метаданными, например, временные задачи, устаревшие события или результаты тестов, они со временем накапливаются. Это ведёт к росту размера базы данных, замедлению запросов и ухудшению работы сайта. Автоматическое удаление таких записей позволяет сэкономить ресурсы и не тратить время на ручную очистку.

В частности, если вы используете специализированные плагины для управления задачами или событиями, например, WPTasks, наличие большого числа неактуальных задач может замедлять работу и усложнять интерфейс.

Способы автоматического удаления записей по метаключам

Удаление через WP-Cron и кастомный PHP код

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

Пример функции для удаления записей с мета-ключом _wptasks_due_date, у которых дата меньше текущей:

function wptasks_ru_delete_old_tasks() {
    $today = date('Y-m-d');
    $args = [
        'post_type'      => 'task',
        'posts_per_page' => -1,
        'meta_query'     => [
            [
                'key'     => '_wptasks_due_date',
                'value'   => $today,
                'compare' => '<',
                'type'    => 'DATE',
            ],
        ],
        'fields' => 'ids',
    ];

    $old_tasks = get_posts($args);

    if (!empty($old_tasks)) {
        foreach ($old_tasks as $task_id) {
            wp_delete_post($task_id, true); // true — удаление без корзины
        }
    }
}

// Регистрируем событие, если оно ещё не запущено
if (!wp_next_scheduled('wptasks_ru_daily_cleanup')) {
    wp_schedule_event(time(), 'daily', 'wptasks_ru_daily_cleanup');
}

// Хук на выполнение очистки
add_action('wptasks_ru_daily_cleanup', 'wptasks_ru_delete_old_tasks');

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

Использование плагинов для автоматизации очистки

Если вы не хотите писать код, можно использовать плагины для автоматического удаления записей, например:

  • WP Bulk Delete — позволяет создавать правила для массового удаления записей по мета-ключам, датам, категориям и другим параметрам.
  • Advanced Database Cleaner — помогает удалять устаревшие записи и оптимизировать базу данных.

Настроив WP Bulk Delete для удаление записей с нужным мета-ключом и условием даты, вы получите удобный интерфейс и гибкие возможности без программирования.

Как избежать ошибок и сохранить данные

При автоматическом удалении важно удостовериться, что вы не удаляете нужные данные. Рекомендуется:

  • Делать резервные копии базы данных перед настройкой очистки.
  • Проверять условия выборки постов — использовать posts_per_page и вывод ID, чтобы убедиться в правильности.
  • Если нужно, вместо wp_delete_post($id, true) использовать wp_trash_post($id) для перемещения в корзину.
  • Логировать удалённые записи для отладки и контроля.

Пример расширения функции с логированием и безопасным удалением

Добавим логирование в файл wp-content/uploads/deleted_tasks.log и используем корзину:

function wptasks_ru_delete_old_tasks_with_log() {
    $today = date('Y-m-d');
    $args = [
        'post_type'      => 'task',
        'posts_per_page' => -1,
        'meta_query'     => [
            [
                'key'     => '_wptasks_due_date',
                'value'   => $today,
                'compare' => '<',
                'type'    => 'DATE',
            ],
        ],
        'fields' => 'ids',
    ];

    $old_tasks = get_posts($args);

    $log_file = WP_CONTENT_DIR . '/uploads/deleted_tasks.log';
    $date_time = date('Y-m-d H:i:s');

    if (!empty($old_tasks)) {
        foreach ($old_tasks as $task_id) {
            if (wp_trash_post($task_id)) {
                file_put_contents($log_file, "[$date_time] Task ID $task_id moved to trash\n", FILE_APPEND);
            } else {
                file_put_contents($log_file, "[$date_time] Failed to trash Task ID $task_id\n", FILE_APPEND);
            }
        }
    }
}

// Регистрация и запуск события аналогично предыдущему примеру
if (!wp_next_scheduled('wptasks_ru_daily_cleanup')) {
    wp_schedule_event(time(), 'daily', 'wptasks_ru_daily_cleanup');
}
add_action('wptasks_ru_daily_cleanup', 'wptasks_ru_delete_old_tasks_with_log');

Заключение

Автоматическое удаление старых записей по метаключам — важная задача для поддержания чистоты и производительности сайта на WordPress. Используя WP-Cron и кастомные функции, вы получаете гибкий и мощный инструмент, который можно адаптировать под любые нужды. Если хотите упростить настройку — используйте специализированные плагины, такие как WP Bulk Delete.

Для пользователей WPTasks и подобных плагинов правильная настройка автоматической очистки позволит избежать накопления «мусорных» задач и сохранить базу данных в оптимальном состоянии.

Полезные ссылки:

Как отладить проблемы с производительностью WordPress
28.11.2025
Как создать персонализированный Task Manager в WordPress
01.11.2025
Как создать собственный breadcrumb в WordPress с поддержкой Schema.org
14.12.2025
Как создать автоматическое распределение задач в WordPress
09.02.2026
Как создать собственный REST API endpoint в WordPress: практическое руководство
21.11.2025