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

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

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

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

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

Также можно настроить регулярные задачи (cron), но AJAX даёт гибкость для выполнения удаления по требованию или с определённой периодичностью при взаимодействии с интерфейсом.

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

Создание AJAX обработчика в functions.php

Для начала нужно зарегистрировать AJAX обработчик, который будет принимать запросы на удаление старых постов. Допустим, мы хотим удалять записи старше 180 дней из типа записи post. Вставьте следующий код в файл functions.php вашей темы или в плагин:

function wporg_delete_old_posts_ajax() {
    // Проверяем nonce для безопасности
    if ( ! isset($_POST['wporg_nonce']) || ! wp_verify_nonce($_POST['wporg_nonce'], 'wporg_delete_old_posts') ) {
        wp_send_json_error('Неверный nonce');
        wp_die();
    }

    $days = 180; // количество дней
    $date_threshold = date('Y-m-d H:i:s', strtotime('-' . $days . ' days'));

    $args = [
        'post_type'      => 'post',
        'post_status'    => 'publish',
        'date_query'     => [
            [
                'before' => $date_threshold,
                'inclusive' => true,
            ],
        ],
        'fields'         => 'ids',
        'posts_per_page' => -1,
    ];

    $old_posts = get_posts($args);

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

    foreach ($old_posts as $post_id) {
        wp_delete_post($post_id, true); // принудительное удаление
    }

    wp_send_json_success(count($old_posts) . ' старых записей удалено');
    wp_die();
}
add_action('wp_ajax_wporg_delete_old_posts', 'wporg_delete_old_posts_ajax');

Этот код реализует AJAX-обработчик wporg_delete_old_posts, который удаляет все опубликованные записи старше 180 дней.

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

Чтобы отправлять AJAX-запрос из админки или фронтенда, нужно подключить скрипт и передать туда nonce и URL для AJAX запросов. Добавьте в functions.php:

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

Создайте файл js/wporg-admin-ajax.js в вашей теме и добавьте туда:

jQuery(document).ready(function($) {
    $('#wporg-delete-old-posts-btn').on('click', function(e) {
        e.preventDefault();
        if (!confirm('Вы уверены, что хотите удалить все старые записи?')) {
            return;
        }

        $.post(wporg_ajax_obj.ajax_url, {
            action: 'wporg_delete_old_posts',
            wporg_nonce: wporg_ajax_obj.nonce
        }, function(response) {
            if (response.success) {
                alert(response.data);
            } else {
                alert('Ошибка: ' + response.data);
            }
        });
    });
});

Добавление кнопки в админку WordPress

Для удобства добавим кнопку на страницу «Инструменты» в админке, чтобы запускать удаление:

function wporg_register_tools_page() {
    add_management_page(
        'Удалить старые записи',
        'Удалить старые записи',
        'manage_options',
        'wporg-delete-old-posts',
        'wporg_tools_page_callback'
    );
}
add_action('admin_menu', 'wporg_register_tools_page');

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

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

Если вы предпочитаете использовать готовые решения, рассмотрите следующие плагины:

  • WP Bulk Delete — мощный плагин для массового удаления постов и пользователей по различным критериям, включая дату публикации. Позволяет создавать расписания удаления.
  • Auto Delete Posts — простой плагин для автоматического удаления записей по условию старости.
  • Clearfy Pro — оптимизационный плагин с функцией удаления устаревших данных, включая посты, ревизии и т.д. Подробнее о нем можно узнать на wpshop.ru.

Преимущество собственных решений на AJAX — гибкость и возможность кастомизации под задачи конкретного сайта.

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

При работе с удалением через AJAX обязательно учитывайте безопасность. Используйте wp_nonce для предотвращения CSRF-атак. Проверяйте права пользователя — в нашем примере доступ имеют только администраторы с правом manage_options.

Если записей очень много, удаление всех разом может привести к таймауту. В таких случаях лучше делать удаление партиями, например, по 50 записей за один AJAX-запрос, и запускать следующий запрос после успешного завершения предыдущего.

Вот пример расширения функции для пакетного удаления:

function wporg_delete_old_posts_ajax() {
    // Проверка nonce и прав
    if ( ! isset($_POST['wporg_nonce']) || ! wp_verify_nonce($_POST['wporg_nonce'], 'wporg_delete_old_posts') ) {
        wp_send_json_error('Неверный nonce');
        wp_die();
    }
    if ( ! current_user_can('manage_options') ) {
        wp_send_json_error('Нет прав');
        wp_die();
    }

    $days = 180;
    $date_threshold = date('Y-m-d H:i:s', strtotime('-' . $days . ' days'));
    $batch_size = 50;

    $args = [
        'post_type'      => 'post',
        'post_status'    => 'publish',
        'date_query'     => [
            [
                'before' => $date_threshold,
                'inclusive' => true,
            ],
        ],
        'fields'         => 'ids',
        'posts_per_page' => $batch_size,
    ];

    $old_posts = get_posts($args);

    if (empty($old_posts)) {
        wp_send_json_success('Все старые записи удалены');
        wp_die();
    }

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

    wp_send_json_success(count($old_posts) . ' записей удалено в этом пакете');
    wp_die();
}

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

Заключение

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

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

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