В процессе эксплуатации сайта на 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 даёт максимальный контроль и гибкость под конкретные задачи.