Удаление записей в WordPress стандартно происходит через перезагрузку страницы в админке или на фронтенде. Однако для улучшения пользовательского опыта (UX) и повышения скорости работы сайта часто требуется реализовать удаление записей через AJAX, чтобы операция происходила без перезагрузки страницы. В этой статье мы разберём, как правильно реализовать удаление записей через AJAX, какие есть нюансы безопасности и приведём примеры кода, которые можно использовать как в админке, так и на фронтенде.
Почему стоит использовать AJAX для удаления записей в WordPress
Удаление записей через AJAX позволяет:
- Сделать интерфейс более отзывчивым и современным;
- Избежать полной перезагрузки страницы, что экономит время пользователей;
- Уменьшить нагрузку на сервер, так как отправляется только необходимый запрос;
- Обеспечить динамическое обновление списка записей без дополнительной работы.
При правильной реализации это значительно улучшает UX, особенно если у вас есть кастомные списки или интерактивные элементы на фронтенде.
Обеспечение безопасности при удалении записей через AJAX
Безопасность — главный аспект при работе с любыми AJAX-запросами, которые изменяют данные. В WordPress это достигается с помощью nonce-проверок и проверки прав пользователя.
Основные шаги безопасности:
- Использовать
wp_create_nonceдля генерации одноразового ключа; - Передавать nonce вместе с AJAX-запросом;
- Проверять nonce в обработчике с помощью
check_ajax_referer; - Проверять, имеет ли текущий пользователь права на удаление записей (например,
current_user_can('delete_posts')); - Обрабатывать ошибки и отправлять понятные ответы клиенту.
Пример реализации удаления записей по AJAX в WordPress
1. Подключение скрипта и локализация данных
Для начала нужно зарегистрировать и подключить JavaScript-файл, который будет отправлять AJAX-запросы, и передать в него URL для AJAX и nonce.
function journalx_enqueue_scripts() {
wp_enqueue_script( 'journalx-ajax-delete', get_template_directory_uri() . '/js/ajax-delete.js', array('jquery'), null, true );
wp_localize_script( 'journalx-ajax-delete', 'journalx_ajax', array(
'ajax_url' => admin_url('admin-ajax.php'),
'nonce' => wp_create_nonce('journalx_delete_post_nonce')
) );
}
add_action( 'wp_enqueue_scripts', 'journalx_enqueue_scripts' );2. JavaScript для отправки AJAX-запроса
В файле ajax-delete.js напишем код, который будет отправлять запрос на удаление.
jQuery(document).ready(function($) {
$('.journalx-delete-post').on('click', function(e) {
e.preventDefault();
var postID = $(this).data('postid');
if (!confirm('Вы действительно хотите удалить эту запись?')) return;
$.ajax({
url: journalx_ajax.ajax_url,
type: 'POST',
data: {
action: 'journalx_delete_post',
post_id: postID,
nonce: journalx_ajax.nonce
},
success: function(response) {
if(response.success) {
alert('Запись успешно удалена');
$('#post-' + postID).fadeOut();
} else {
alert('Ошибка: ' + response.data);
}
},
error: function() {
alert('Произошла ошибка при запросе');
}
});
});
});3. PHP-обработчик AJAX-запроса
Обрабатываем запрос на сервере, проверяем nonce и права пользователя, затем удаляем запись.
function journalx_ajax_delete_post() {
check_ajax_referer('journalx_delete_post_nonce', 'nonce');
$post_id = isset($_POST['post_id']) ? intval($_POST['post_id']) : 0;
if (!$post_id) {
wp_send_json_error('Неверный ID записи');
}
if (!current_user_can('delete_post', $post_id)) {
wp_send_json_error('У вас нет прав для удаления этой записи');
}
$deleted = wp_delete_post($post_id, true); // true — без перемещения в корзину
if ($deleted) {
wp_send_json_success();
} else {
wp_send_json_error('Не удалось удалить запись');
}
}
add_action('wp_ajax_journalx_delete_post', 'journalx_ajax_delete_post');
// Если планируете использовать на фронтенде для неавторизованных, добавьте wp_ajax_nopriv_ хук с осторожностью.Примеры плагинов для AJAX-удаления записей
Если вы хотите использовать готовые решения, есть несколько плагинов, которые реализуют удаление через AJAX или расширяют функционал списков записей:
- WP Ajaxify Comments — позволяет AJAX-удаление комментариев, может быть расширен для записей;
- Admin Columns — расширяет таблицы записей, поддерживает AJAX-операции;
- Advanced Custom Fields (ACF) — с помощью ACF и AJAX можно создать собственный интерфейс для управления записями.
Однако, чаще всего для специфичных задач удобнее написать собственный небольшой плагин или тему с нужной функциональностью, используя подход, описанный выше.
Советы по улучшению UX при удалении записей через AJAX
Чтобы сделать интерфейс более удобным:
- Используйте модальные окна для подтверждения удаления;
- Добавьте индикатор загрузки или анимацию, чтобы пользователь видел процесс;
- Обновляйте список записей динамически без перезагрузки;
- Обрабатывайте ошибки красиво, показывая подробные сообщения;
- Поддерживайте возможность восстановления записи, если это необходимо.
Такие мелочи значительно повышают доверие и комфорт при работе с сайтом.
Как расширить функционал: удаление кастомных типов записей и метаданных
Если у вас есть кастомные типы записей (Custom Post Types), AJAX-удаление можно легко адаптировать под них. Главное — проверить права с помощью current_user_can('delete_post', $post_id) работает и для кастомных типов.
Кроме того, если при удалении нужно чистить связанные метаданные или дополнительные таблицы, добавьте соответствующую логику после успешного удаления записи.
Например, удаление связанных метаданных:
global $wpdb;
$wpdb->delete($wpdb->postmeta, array('post_id' => $post_id));Это позволит избежать «мусора» в базе данных и поддерживать её в порядке.