Часто возникает необходимость автоматически удалять устаревшие записи из 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, сохраняя базу данных в чистоте и улучшая производительность сайта.