Создание AJAX-обработчиков в WordPress (wp_ajax_ / wp_ajax_nopriv_)
В WordPress для обработки AJAX-запросов используются специальные хуки wp_ajax_*
(для авторизованных пользователей) и wp_ajax_nopriv_*
(для неавторизованных пользователей).
Основной синтаксис
// Для авторизованных пользователей
add_action('wp_ajax_my_action', 'my_action_callback');
// Для неавторизованных пользователей
add_action('wp_ajax_nopriv_my_action', 'my_action_callback');
function my_action_callback() {
// Проверка nonce для безопасности
check_ajax_referer('my_nonce', 'security');
// Обработка данных
$data = $_POST['data'];
// Возврат результата
wp_send_json_success($data);
// Или в случае ошибки
// wp_send_json_error('Сообщение об ошибке');
// Обязательно завершаем выполнение
wp_die();
}
Полный пример реализации
1. JavaScript часть (отправка запроса)
jQuery(document).ready(function($) {
$('#my-button').on('click', function() {
$.ajax({
url: ajaxurl, // ajaxurl определён в WordPress для админки
type: 'POST',
data: {
action: 'my_action',
security: my_ajax_obj.nonce, // передаём nonce
data: 'some data to process'
},
success: function(response) {
if (response.success) {
console.log('Успех:', response.data);
} else {
console.error('Ошибка:', response.data);
}
},
error: function(xhr, status, error) {
console.error('AJAX ошибка:', error);
}
});
});
});
2. PHP часть (обработка запроса)
// Регистрируем скрипт и передаём параметры
add_action('wp_enqueue_scripts', 'my_ajax_scripts');
function my_ajax_scripts() {
wp_enqueue_script('my-ajax-script', get_template_directory_uri() . '/js/my-ajax.js', array('jquery'), null, true);
wp_localize_script('my-ajax-script', 'my_ajax_obj', array(
'ajaxurl' => admin_url('admin-ajax.php'),
'nonce' => wp_create_nonce('my_nonce')
));
}
// Обработчик для авторизованных пользователей
add_action('wp_ajax_my_action', 'my_action_callback');
// Обработчик для неавторизованных пользователей
add_action('wp_ajax_nopriv_my_action', 'my_action_callback');
function my_action_callback() {
// Проверка nonce
check_ajax_referer('my_nonce', 'security');
// Обработка данных
$data = isset($_POST['data']) ? sanitize_text_field($_POST['data']) : '';
// Пример обработки
if (empty($data)) {
wp_send_json_error('Данные не получены');
}
// Какая-то логика
$processed_data = strtoupper($data);
// Возвращаем результат
wp_send_json_success($processed_data);
}
Важные моменты
- Безопасность:
- Всегда используйте nonce для проверки запросов
- Санитайзите все входящие данные
- Проверяйте права пользователя при необходимости (
current_user_can()
)
- Производительность:
- Минимизируйте количество AJAX-запросов
- Используйте кеширование для часто запрашиваемых данных
- Обработка ошибок:
- Всегда предусматривайте обработку ошибок на клиенте и сервере
- Возвращайте понятные сообщения об ошибках
- Завершение скрипта:
- После
wp_send_json_success()
илиwp_send_json_error()
используйтеwp_die()
, чтобы предотвратить лишнюю обработку
Альтернативные методы возврата данных
Вместо wp_send_json_success()
и wp_send_json_error()
можно использовать:
// Произвольный JSON ответ
wp_send_json(array(
'success' => true,
'data' => $data
));
// Или вручную
header('Content-Type: application/json');
echo json_encode($data);
wp_die();
Таким образом, WordPress предоставляет удобные инструменты для создания безопасных и эффективных AJAX-обработчиков.