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

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

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

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

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

Подготовка: выбор типа и критерия удаления

Для начала определимся, какие записи будем удалять. Это могут быть стандартные посты (post), страницы (page) или кастомные типы записей (custom_post_type). В примерах мы будем использовать стандартные записи и удалять все посты старше определённой даты.

Критерий удаления — дата публикации. Например, удалять посты, опубликованные более 180 дней назад. Такой подход подходит для новостных сайтов, где важно хранить только свежие материалы.

Создание AJAX-обработчика в WordPress

Добавим в functions.php вашей темы или в собственный плагин следующий код, который реализует AJAX-обработчик:

add_action('wp_ajax_wpma_delete_old_posts', 'wpma_delete_old_posts_callback');

function wpma_delete_old_posts_callback() {
    // Проверяем права пользователя
    if (!current_user_can('manage_options')) {
        wp_send_json_error('Нет доступа');
    }

    // Безопасность
    check_ajax_referer('wpma_delete_nonce', 'security');

    $days = isset($_POST['days']) ? intval($_POST['days']) : 180;
    $date_query = array(
        'before' => date('Y-m-d', strtotime("-{$days} days")),
        'inclusive' => true,
    );

    $args = array(
        'post_type' => 'post',
        'date_query' => array($date_query),
        'posts_per_page' => 20, // удаляем по 20 записей за раз
        'fields' => 'ids',
        'post_status' => 'any',
    );

    $old_posts = get_posts($args);

    if (empty($old_posts)) {
        wp_send_json_success('Нет записей для удаления');
    }

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

    wp_send_json_success(count($old_posts) . ' записей удалено');
}

Обратите внимание на проверку прав и nonce для безопасности. Также мы ограничиваем удаление пачками по 20 записей, чтобы избежать тайм-аутов.

Добавление JavaScript для вызова AJAX из админки

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

В functions.php добавим регистрацию страницы и подключение скрипта:

add_action('admin_menu', 'wpma_register_delete_old_posts_page');
function wpma_register_delete_old_posts_page() {
    add_submenu_page(
        'tools.php',
        'Удаление старых записей',
        'Удаление старых записей',
        'manage_options',
        'wpma-delete-old-posts',
        'wpma_delete_old_posts_page_callback'
    );
}

function wpma_delete_old_posts_page_callback() {
    ?>
    <div class="wrap">
        <h1>Удаление старых записей через AJAX</h1>
        <p>Нажмите кнопку, чтобы удалить записи старше указанного количества дней.</p>
        <input type="number" id="wpma-days" value="180" min="1" /> дней<br><br>
        <button id="wpma-delete-btn" class="button button-primary">Удалить старые записи</button>
        <div id="wpma-result" style="margin-top:20px;"></div>
    </div>
    <script>
    jQuery(document).ready(function($) {
        $('#wpma-delete-btn').on('click', function() {
            var days = parseInt($('#wpma-days').val()) || 180;
            $('#wpma-result').html('Удаление...');

            $.post(ajaxurl, {
                action: 'wpma_delete_old_posts',
                days: days,
                security: '<?php echo wp_create_nonce('wpma_delete_nonce'); ?>'
            }, function(response) {
                if(response.success) {
                    $('#wpma-result').html('<span style="color:green;">' + response.data + '</span>');
                } else {
                    $('#wpma-result').html('<span style="color:red;">Ошибка: ' + response.data + '</span>');
                }
            });
        });
    });
    </script>
    <?php
}

Этот интерфейс позволяет администратору задать количество дней и запустить удаление. Результат отображается сразу.

Расширение: удаление пользовательских типов записей и по таксономиям

Если у вас есть кастомные типы записей, например, «события» (event) или «продукты» (product), вы можете расширить функцию wpma_delete_old_posts_callback следующим образом:

$post_types = array('post', 'event', 'product');

$args = array(
    'post_type' => $post_types,
    'date_query' => array($date_query),
    'posts_per_page' => 20,
    'fields' => 'ids',
    'post_status' => 'any',
);

Также можно добавить фильтр по таксономиям, например, удалять только записи из определённой категории:

$args['tax_query'] = array(
    array(
        'taxonomy' => 'category',
        'field' => 'slug',
        'terms' => 'novosti',
    ),
);

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

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

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

Советы по безопасности и производительности

Удаление записей — операция, которая может повлиять на данные сайта, поэтому:

  • Всегда проверяйте права пользователя и nonce в AJAX-запросах.
  • Ограничивайте количество удаляемых записей за один запрос, чтобы избежать тайм-аутов.
  • Рекомендуется делать резервные копии перед массовым удалением.
  • Тестируйте скрипты на тестовой среде.

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

Как создать защищённый формуляр обработки данных в WordPress
03.12.2025
Как автоматизировать удаление неиспользуемых шорткодов в WordPress
23.03.2026
Как установить автоматический редирект после изменения слага в WordPress
20.12.2025
Как правильно отлаживать REST API в WordPress: практическое руководство
31.12.2025
WooCommerce: автоматическое отключение способов оплаты при неподтверждённых заказах
14.06.2026