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

Часто возникает необходимость автоматически удалять устаревшие записи из WordPress, чтобы не загромождать базу данных и сохранять актуальность контента. Особенно это важно для сайтов с большим объемом данных, таких как блоги, новостные порталы или каталоги.

Почему стоит использовать AJAX для удаления старых записей

Удаление большого количества записей напрямую из админки или через планировщик задач (WP-Cron) может быть неэффективным и приводить к зависаниям или таймаутам. AJAX позволяет выполнять удаление частями, не блокируя интерфейс и не вызывая ошибок из-за превышения времени выполнения скрипта.

С помощью AJAX можно реализовать процесс удаления, который будет запускаться по кнопке или автоматически, отправляя запросы на сервер и получая статус операции в реальном времени.

Преимущества подхода

  • Отсутствие блокировки интерфейса при удалении;
  • Контроль процесса удаления и возможность прерывания;
  • Возможность удалять записи пакетами, что снижает нагрузку на сервер;
  • Удобство интеграции с административной панелью.

Как реализовать автоматическое удаление старых записей через AJAX

Рассмотрим пример реализации на базе кастомного плагина. Предположим, что нужно удалять записи типа post, которым больше 180 дней.

Шаг 1. Регистрация AJAX обработчиков в плагине

function wpguest_register_ajax_delete_old_posts() {
    add_action('wp_ajax_wpguest_delete_old_posts', 'wpguest_handle_ajax_delete_old_posts');
    add_action('wp_ajax_nopriv_wpguest_delete_old_posts', 'wpguest_handle_ajax_delete_old_posts');
}
add_action('init', 'wpguest_register_ajax_delete_old_posts');

function wpguest_handle_ajax_delete_old_posts() {
    if (!current_user_can('manage_options')) {
        wp_send_json_error('Нет доступа');
        wp_die();
    }

    $days = isset($_POST['days']) ? intval($_POST['days']) : 180;
    $posts_per_batch = 20; // Количество записей для удаления за один AJAX-запрос

    $args = [
        'post_type' => 'post',
        'date_query' => [
            [
                'before' => "$days days ago",
            ],
        ],
        'posts_per_page' => $posts_per_batch,
        'fields' => 'ids',
        'post_status' => 'any',
    ];

    $old_posts = get_posts($args);

    if (empty($old_posts)) {
        wp_send_json_success(['finished' => true]);
        wp_die();
    }

    foreach ($old_posts as $post_id) {
        wp_delete_post($post_id, true);
    }

    wp_send_json_success(['finished' => false, 'deleted' => count($old_posts)]);
    wp_die();
}

В этом коде мы объявляем два AJAX хука — для авторизованных и неавторизованных пользователей (хотя для безопасности стоит оставить только авторизованных). Функция wpguest_handle_ajax_delete_old_posts получает параметры, ищет посты старше указанного количества дней и удаляет их пачками.

Шаг 2. Добавление кнопки и JavaScript для запуска удаления

Добавим кнопку на страницу настроек плагина или в админку, а также скрипт, который будет отправлять AJAX-запросы и обновлять статус.

function wpguest_enqueue_admin_scripts() {
    wp_enqueue_script('wpguest-delete-old-posts', plugin_dir_url(__FILE__) . 'js/delete-old-posts.js', ['jquery'], '1.0', true);
    wp_localize_script('wpguest-delete-old-posts', 'wpguest_ajax_object', [
        'ajax_url' => admin_url('admin-ajax.php'),
        'nonce' => wp_create_nonce('wpguest_delete_old_posts_nonce')
    ]);
}
add_action('admin_enqueue_scripts', 'wpguest_enqueue_admin_scripts');

function wpguest_add_admin_page() {
    add_menu_page('Удаление старых записей', 'Удаление постов', 'manage_options', 'wpguest-delete-old-posts', 'wpguest_admin_page_content');
}
add_action('admin_menu', 'wpguest_add_admin_page');

function wpguest_admin_page_content() {
    ?>
    <div class="wrap">
        <h1>Удаление старых записей WordPress</h1>
        <p>Нажмите кнопку ниже, чтобы начать удаление записей старше 180 дней.</p>
        <button id="wpguest-delete-old-posts-btn" class="button button-primary">Удалить старые записи</button>
        <div id="wpguest-delete-status" style="margin-top:20px;"></div>
    </div>
    <?php
}

JavaScript файл js/delete-old-posts.js:

jQuery(document).ready(function($) {
    $('#wpguest-delete-old-posts-btn').on('click', function() {
        var btn = $(this);
        btn.prop('disabled', true);
        $('#wpguest-delete-status').html('Начинаем удаление...');
        deleteBatch();

        function deleteBatch() {
            $.post(wpguest_ajax_object.ajax_url, {
                action: 'wpguest_delete_old_posts',
                days: 180,
                _ajax_nonce: wpguest_ajax_object.nonce
            }, function(response) {
                if (response.success) {
                    if (response.data.finished) {
                        $('#wpguest-delete-status').html('Удаление завершено.');
                        btn.prop('disabled', false);
                    } else {
                        $('#wpguest-delete-status').html('Удалено записей: ' + response.data.deleted + '. Продолжаем...');
                        deleteBatch();
                    }
                } else {
                    $('#wpguest-delete-status').html('Ошибка: ' + response.data);
                    btn.prop('disabled', false);
                }
            });
        }
    });
});

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

Ниже несколько советов для продвинутой реализации:

  • Используйте nonce для проверки безопасности AJAX-запросов.
  • Обрабатывайте возможность прерывания процесса удаления (например, по кнопке «Отмена»).
  • Добавьте логирование удаляемых записей, чтобы иметь возможность восстановить случайно удалённые данные.
  • Для больших сайтов разбивайте удаление на более мелкие пачки, например, по 10-20 записей.
  • Если вы используете сторонние плагины кэширования, очищайте кэш после удаления.

Использование плагина Clearfy Pro для оптимизации удаления

Плагин Clearfy Pro содержит инструменты для очистки базы данных, в том числе удаление старых ревизий, черновиков и мусора. Он может быть полезен в паре с нашим AJAX-решением, чтобы дополнительно оптимизировать сайт.

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

Автоматизация создания резервных копий WordPress без плагинов
06.12.2025
Как удалить заблокированных пользователей в WordPress с помощью кода
07.01.2026
Как автоматизировать удаление старых через Gutenberg блоков в WordPress
31.12.2025
Как удалить или изменить meta robots в WordPress для разных типов страниц
18.12.2025
Как отключить автообновление корзины в WooCommerce без плагинов
26.04.2026