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

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

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

Стандартные методы удаления записей в WordPress требуют перехода в админку и ручного удаления или запуска крон-задач, которые выполняются в фоне без обратной связи. AJAX позволяет выполнять удаление асинхронно, обеспечивая:

  • Интерактивность — пользователь видит процесс удаления и результат сразу.
  • Гибкость — можно запускать удаление из фронтенда или бэкенда без перезагрузки.
  • Безопасность — контролируем доступ и проверяем nonce.

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

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

Первым шагом определимся с критериями удаления. Например, удалим все записи типа post, которые старше 30 дней и имеют статус draft. Выборка нужных записей делается через WP_Query или прямым обращением к базе.

Пример функции для получения ID таких постов:

function wporg_get_old_draft_posts_ids() {
    $args = [
        'post_type' => 'post',
        'post_status' => 'draft',
        'date_query' => [
            [
                'column' => 'post_date',
                'before' => '30 days ago'
            ]
        ],
        'fields' => 'ids',
        'nopaging' => true
    ];

    $query = new WP_Query($args);
    return $query->posts;
}

Эта функция возвращает массив ID постов, подходящих под условия.

Создание AJAX обработчика для удаления записей

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

add_action('wp_ajax_wporg_delete_old_drafts', 'wporg_delete_old_drafts_callback');

function wporg_delete_old_drafts_callback() {
    // Проверяем nonce для безопасности
    check_ajax_referer('wporg_delete_nonce', 'security');

    if (!current_user_can('delete_posts')) {
        wp_send_json_error(['message' => 'Недостаточно прав']);
        wp_die();
    }

    $ids = wporg_get_old_draft_posts_ids();
    if (empty($ids)) {
        wp_send_json_success(['message' => 'Нет записей для удаления']);
        wp_die();
    }

    $deleted = 0;
    foreach ($ids as $id) {
        if (wp_delete_post($id, true)) { // Принудительное удаление
            $deleted++;
        }
    }

    wp_send_json_success(['message' => "Удалено записей: $deleted"]);
    wp_die();
}

Обратите внимание на использование wp_send_json_success и wp_send_json_error — это удобные функции для ответа на AJAX запросы.

Подключение JavaScript для вызова AJAX запроса

Чтобы вызвать наш обработчик из интерфейса, добавим JavaScript код, который отправит запрос и отобразит результат.

function wporg_enqueue_admin_script() {
    wp_enqueue_script('wporg-admin-js', get_template_directory_uri() . '/js/wporg-admin.js', ['jquery'], null, true);
    wp_localize_script('wporg-admin-js', 'wporg_ajax_obj', [
        'ajax_url' => admin_url('admin-ajax.php'),
        'nonce' => wp_create_nonce('wporg_delete_nonce')
    ]);
}
add_action('admin_enqueue_scripts', 'wporg_enqueue_admin_script');

В файле wporg-admin.js разместим следующий код:

jQuery(document).ready(function($) {
    $('#wporg-delete-old-drafts-btn').on('click', function(e) {
        e.preventDefault();

        if (!confirm('Вы уверены, что хотите удалить все старые черновики?')) {
            return;
        }

        $.ajax({
            url: wporg_ajax_obj.ajax_url,
            type: 'POST',
            data: {
                action: 'wporg_delete_old_drafts',
                security: wporg_ajax_obj.nonce
            },
            success: function(response) {
                if (response.success) {
                    alert(response.data.message);
                } else {
                    alert('Ошибка: ' + response.data.message);
                }
            },
            error: function() {
                alert('Произошла ошибка при выполнении запроса');
            }
        });
    });
});

Данный скрипт добавляет обработчик клика на кнопку с ID wporg-delete-old-drafts-btn. При нажатии отправляется AJAX запрос, и результат выводится в alert.

Добавление кнопки в админ-панель

Для удобства добавим кнопку в меню админки или на страницу настроек плагина/темы:

function wporg_add_admin_menu() {
    add_menu_page(
        'Удаление старых черновиков',
        'Удаление черновиков',
        'delete_posts',
        'wporg-delete-old-drafts',
        'wporg_render_admin_page'
    );
}
add_action('admin_menu', 'wporg_add_admin_menu');

function wporg_render_admin_page() {
    ?>
    <div class="wrap">
        <h1>Автоматическое удаление старых черновиков</h1>
        <p>Нажмите кнопку ниже, чтобы удалить все черновики старше 30 дней.</p>
        <button id="wporg-delete-old-drafts-btn" class="button button-primary">Удалить старые черновики</button>
    </div>
    <?php
}

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

Удаление большого количества записей может нагрузить сервер. Поэтому:

  • Реализуйте удаление пакетами, если записей слишком много.
  • Используйте nonce и проверяйте права пользователя для предотвращения несанкционированного доступа.
  • Логируйте результаты удаления для аудита.

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

Использование плагинов для упрощения задачи

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

Однако собственная реализация через AJAX даёт максимальный контроль и гибкость под конкретные задачи.

Скачать WP с оф. сайта Магазин проверенных платных тем