AJAX используется практически во всех современных сайтах на WordPress: для работы поиска, фильтрации товаров WooCommerce, форм обратной связи, комментариев, лайков, загрузки файлов, бесконечной прокрутки страниц и панели администратора. Если AJAX перестает работать, пользователь может столкнуться с сообщениями AJAX Error, 400 Bad Request, 403 Forbidden, 500 Internal Server Error или бесконечной загрузкой данных. В этой статье подробно рассмотрим причины возникновения AJAX-ошибок в WordPress, методы диагностики и способы их устранения с практическими примерами кода.

Как проявляется проблема

Наиболее распространенные симптомы:
  • AJAX Error;
  • Ошибка 400 Bad Request;
  • Ошибка 403 Forbidden;
  • Ошибка 404 для admin-ajax.php;
  • Ошибка 500 Internal Server Error;
  • бесконечная загрузка индикатора;
  • ответ сервера равен 0;
  • ответ сервера равен -1.

Основные причины

  • неверный URL файла admin-ajax.php;
  • не зарегистрирован обработчик AJAX;
  • ошибка nonce;
  • ошибки JavaScript;
  • конфликт jQuery;
  • ошибка PHP;
  • блокировка ModSecurity;
  • конфликт плагинов;
  • неверный параметр action;
  • неправильный HTTP-метод.

Проверяем URL admin-ajax.php

Правильный путь:
/wp-admin/admin-ajax.php
Передавайте его в JavaScript через wp_localize_script():
wp_localize_script( 'my-script', 'ajaxData', array( 'ajaxurl' => admin_url('admin-ajax.php') ) );

WordPress AJAX ошибка

Пример AJAX-запроса

jQuery.post( ajaxData.ajaxurl, { action: 'load_posts' }, function(response){ console.log(response); } );

Регистрируем обработчик

Для авторизованных пользователей:
add_action( 'wp_ajax_load_posts', 'load_posts_callback' );
Для гостей:
add_action( 'wp_ajax_nopriv_load_posts', 'load_posts_callback' );

Обработчик AJAX

function load_posts_callback(){ echo 'OK'; wp_die(); }
Использование wp_die() обязательно для корректного завершения выполнения.

Ответ сервера "0"

Если сервер возвращает:
0
чаще всего это означает:
  • не найден обработчик;
  • отсутствует wp_die();
  • неверный параметр action.

Ответ "-1"

Обычно связан с проверкой nonce. Создаем nonce:
wp_create_nonce('load_posts');
Передаем его:
wp_localize_script( 'my-script', 'ajaxData', array( 'nonce' => wp_create_nonce('load_posts') ) );
Проверяем:
check_ajax_referer( 'load_posts', 'nonce' );

Возвращаем JSON

Правильный способ:
wp_send_json_success( array( 'message' => 'Успешно' ) );
При ошибке:
wp_send_json_error( array( 'message' => 'Ошибка' ) );

Проверяем JavaScript

Откройте инструменты разработчика браузера. Во вкладке Console не должно быть ошибок:
Uncaught TypeError ReferenceError SyntaxError

Проверяем вкладку Network

Найдите запрос:
admin-ajax.php
Обратите внимание на:
  • код ответа;
  • передаваемые параметры;
  • ответ сервера;
  • время выполнения.

Ошибка HTTP 400

Причины:
  • не передан параметр action;
  • неверный nonce;
  • неправильный формат запроса.

Ошибка HTTP 403

Наиболее вероятные причины:
  • неверный nonce;
  • ModSecurity;
  • плагин безопасности;
  • блокировка WAF.

Ошибка HTTP 404

Проверьте доступность:
/wp-admin/admin-ajax.php
Если файл недоступен:
  • повреждены файлы WordPress;
  • неверный Rewrite;
  • ошибка веб-сервера.

Ошибка HTTP 500

Практически всегда означает PHP-ошибку. Включите журнал:
define('WP_DEBUG', true); define('WP_DEBUG_LOG', true); define('WP_DEBUG_DISPLAY', false);
Проверьте:
wp-content/debug.log

Проверяем права пользователя

Если AJAX предназначен только для авторизованных пользователей:
if( !current_user_can('edit_posts') ){ wp_die(); }

Использование Fetch API

fetch( ajaxData.ajaxurl, { method:'POST', body:new URLSearchParams({ action:'load_posts', nonce:ajaxData.nonce }) } ) .then(r=>r.json()) .then(console.log);

Конфликт плагинов

Если ошибка появилась недавно:
  1. отключите все плагины;
  2. проверьте AJAX;
  3. включайте расширения по одному.

Проверяем работу через WP-CLI

Убедитесь, что WordPress работает корректно:
wp core verify-checksums
Проверить активные плагины:
wp plugin list

Пример полного обработчика

add_action( 'wp_ajax_test_ajax', 'test_ajax' ); add_action( 'wp_ajax_nopriv_test_ajax', 'test_ajax' ); function test_ajax(){ check_ajax_referer( 'test_nonce', 'nonce' ); wp_send_json_success( array( 'time'=>current_time('mysql') ) ); }

Полезная последовательность диагностики

  1. Проверить доступность admin-ajax.php.
  2. Убедиться, что передается параметр action.
  3. Проверить регистрацию хуков wp_ajax и wp_ajax_nopriv.
  4. Проверить nonce.
  5. Изучить вкладку Network в браузере.
  6. Проверить консоль JavaScript.
  7. Включить журнал WP_DEBUG_LOG.
  8. Отключить конфликтующие плагины.
  9. Проверить ограничения ModSecurity и WAF.
  10. Использовать функции wp_send_json_success() и wp_die() для корректного завершения запроса.

Наиболее распространенные ответы AJAX

Ответ Причина
0 Не найден обработчик или отсутствует wp_die()
-1 Ошибка проверки nonce
400 Некорректный запрос
403 Запрос заблокирован или неверный nonce
404 Не найден admin-ajax.php
500 Ошибка PHP
AJAX-ошибки в WordPress чаще всего возникают из-за неверной регистрации обработчиков, ошибок JavaScript, некорректной проверки nonce, проблем с файлом admin-ajax.php или конфликтов плагинов. Использование встроенных функций WordPress (wp_send_json_success(), check_ajax_referer(), wp_die()) и систематическая проверка запросов через инструменты разработчика браузера позволяют быстро локализовать проблему и восстановить корректную работу AJAX-функциональности сайта.

Метки: ,