Не работает admin-ajax.php WordPress

Автор:vkuzyomko

Не работает admin-ajax.php WordPress

Краткий ответ: если не работает admin-ajax.php WordPress, сначала откройте DevTools → Network и посмотрите точный статус запроса: 400, 403, 404, 500, 502, 504, ответ “0”, пустой ответ или HTML вместо JSON. Чаще всего причина в неправильном action, отсутствии wp_ajax/wp_ajax_nopriv hook, ошибке nonce, блокировке WAF/security-плагином, кеше, PHP Fatal error, конфликте плагинов, WooCommerce, нехватке ресурсов хостинга или неправильном URL admin-ajax.php.

admin-ajax.php — это файл WordPress, через который многие плагины, темы, формы, фильтры, корзина WooCommerce, автосохранение, Heartbeat API и кастомные функции отправляют AJAX-запросы без перезагрузки страницы.

Если admin-ajax.php ломается, это может выглядеть как зависшая форма, неработающая кнопка, бесконечный спиннер, ошибка оформления заказа, неработающий фильтр товаров, проблемы в админке, медленная загрузка страницы или ошибка в консоли браузера.

Причина

admin-ajax.php сам по себе редко “ломается”. Обычно ломается конкретный AJAX-запрос, который идёт через этот файл. Поэтому важно смотреть не только URL, а ещё action, payload, HTTP-статус, response, headers и PHP-логи.

Симптом Возможная причина Что проверить
Ответ 400 нет action, неправильный action, пустой запрос Network → Payload, PHP hook
Ответ 403 WAF, security-плагин, nonce, IP-блокировка логи безопасности, ModSecurity, nonce
Ответ 404 файл недоступен, блокировка wp-admin, серверное правило существует ли файл, .htaccess, Nginx
Ответ 500 PHP Fatal error, конфликт плагина, тема debug.log, error_log, последний обновлённый плагин
Ответ 502/504 timeout, перегрузка PHP/MySQL, долгий обработчик хостинг, slow log, Query Monitor
Ответ “0” action не найден, нет wp_die, нет обработчика wp_ajax_{action}, wp_ajax_nopriv_{action}
HTML вместо JSON редирект, ошибка, кеш, warning, login page Response, headers, debug.log
Долго грузится тяжёлый AJAX, Heartbeat, WooCommerce fragments Network Timing, Query Monitor, cron

Если admin-ajax.php отдаёт 403, сначала проверьте материал WordPress показывает ошибку 403. Если проблема появилась после обновления, посмотрите статью после обновления плагина сломался сайт WordPress.

Диагностика

Диагностику нужно начинать в браузере, а не в PHP-файлах. Самое важное — увидеть конкретный AJAX-запрос и понять, что он отправляет и что получает в ответ.

1. Откройте DevTools → Network

В браузере нажмите F12, откройте вкладку Network и повторите действие, которое не работает: отправка формы, сохранение настроек, фильтр, добавление товара в корзину, клик по кнопке или оформление заказа.

В Network найдите запрос:

/wp-admin/admin-ajax.php

Проверьте:

  • HTTP-статус: 200, 400, 403, 404, 500, 502, 504;
  • метод запроса: POST или GET;
  • payload/request data;
  • есть ли параметр action;
  • есть ли nonce/security;
  • какой response возвращает сервер;
  • нет ли редиректа на страницу входа;
  • сколько времени выполнялся запрос.

2. Проверьте параметр action

Для admin-ajax.php параметр action обязателен. По нему WordPress понимает, какой PHP-обработчик вызвать.

Если в запросе нет action или он не совпадает с PHP hook, WordPress может вернуть 400, “0” или пустой ответ.

Пример логики:

action: 'sc_test_ajax'

В PHP должен быть обработчик:

add_action('wp_ajax_sc_test_ajax', 'sc_test_ajax_handler');

Для гостей дополнительно нужен:

add_action('wp_ajax_nopriv_sc_test_ajax', 'sc_test_ajax_handler');

3. Проверьте logged-in и logged-out пользователей

Частая ошибка: AJAX работает для администратора, но не работает для обычного посетителя. Это значит, что есть обработчик только для авторизованных пользователей.

  • wp_ajax_action — для авторизованных пользователей;
  • wp_ajax_nopriv_action — для гостей;
  • если форма на фронтенде доступна всем, нужны оба hook;
  • если действие только для админа, nopriv обычно не нужен;
  • если действие связано с безопасностью, проверяйте nonce и права.

4. Проверьте nonce

Nonce защищает AJAX-запрос от случайных и поддельных действий. Если nonce не передаётся, устарел или проверяется не тем ключом, обработчик может вернуть 403, ошибку безопасности или “0”.

Проверьте:

  • создаётся ли nonce через wp_create_nonce;
  • передаётся ли nonce в JavaScript;
  • совпадает ли имя поля security/nonce;
  • правильно ли вызывается check_ajax_referer;
  • не кешируется ли старая страница со старым nonce;
  • не истекает ли nonce из-за долгого кеширования.

5. Проверьте debug.log и error_log

Если admin-ajax.php возвращает 500 или пустой ответ, почти всегда нужно смотреть логи.

Ищите:

  • PHP Fatal error;
  • Uncaught Error;
  • Call to undefined function;
  • Cannot redeclare function;
  • Allowed memory size exhausted;
  • Maximum execution time exceeded;
  • Database error;
  • ошибки плагинов, темы или кастомного кода.

6. Проверьте security-плагины, WAF и ModSecurity

Если запрос возвращает 403, 406 или HTML-страницу блокировки, вероятно, его режет firewall.

Проверьте:

  • Wordfence, iThemes Security, All In One WP Security, Sucuri;
  • Cloudflare WAF;
  • ModSecurity на хостинге;
  • Imunify360;
  • блокировку wp-admin;
  • блокировку admin-ajax.php;
  • ограничение частоты запросов;
  • блокировку по стране, IP или user-agent.

Если форма отправки заявок работает через AJAX и перестала отправляться, дополнительно проверьте статью Не приходят заявки с сайта WordPress.

Нужно быстро решить проблему на сайте?

Если не хотите рисковать сайтом и тратить время на эксперименты, можно оставить заявку. Я посмотрю задачу и предложу аккуратное решение.

Оставить заявку

Решение

Исправление зависит от ответа admin-ajax.php. Нельзя одинаково исправлять 400, 403, 500 и долгий timeout. Ниже безопасный порядок действий.

1. Если admin-ajax.php возвращает 400

Проверьте, что в запросе есть action и он совпадает с PHP hook.

  • откройте Network → Payload;
  • найдите action;
  • сравните action с add_action в PHP;
  • проверьте, подключён ли файл с обработчиком;
  • проверьте, нет ли опечатки в названии action;
  • проверьте, не отправляется ли пустой запрос.

2. Если admin-ajax.php возвращает 403

403 означает запрет доступа. Причина может быть в nonce, security-плагине, WAF, IP-блокировке, cookies или правилах сервера.

  • проверьте nonce;
  • проверьте check_ajax_referer;
  • проверьте security-плагин;
  • проверьте WAF/ModSecurity;
  • проверьте Cloudflare events;
  • проверьте cookies и авторизацию;
  • проверьте, не заблокирован ли /wp-admin/admin-ajax.php.

3. Если admin-ajax.php возвращает 404

Если 404 приходит именно на файл admin-ajax.php, это часто серверная проблема: файл недоступен, путь заблокирован, wp-admin закрыт правилом или сервер не отдаёт реальный файл.

  • проверьте, существует ли файл /wp-admin/admin-ajax.php;
  • проверьте права файла;
  • проверьте .htaccess;
  • проверьте Nginx config;
  • проверьте правила, которые закрывают /wp-admin/;
  • добавьте исключение для admin-ajax.php, если wp-admin закрыт.

4. Если admin-ajax.php возвращает 500

500 почти всегда требует проверки PHP-логов. Сам браузер обычно не покажет причину.

  • включите debug.log;
  • проверьте error_log хостинга;
  • отключите последний обновлённый плагин;
  • временно переключитесь на стандартную тему на staging;
  • проверьте memory_limit;
  • проверьте PHP version;
  • проверьте кастомные snippets и functions.php.

5. Если admin-ajax.php долго грузится

Долгий admin-ajax.php часто связан не с ошибкой, а с тяжёлым обработчиком. Это может быть WooCommerce cart fragments, Heartbeat API, фильтры, поиск, отчёты, импорт, синхронизация, CRM, Telegram, внешнее API или медленный SQL-запрос.

  • проверьте Timing в Network;
  • проверьте action запроса;
  • найдите плагин, который создаёт action;
  • проверьте Query Monitor;
  • проверьте медленные SQL-запросы;
  • проверьте внешние HTTP API calls;
  • проверьте WP-Cron и фоновые задачи;
  • проверьте нагрузку CPU/RAM/MySQL.

Если проблема выглядит как постоянные тормоза админки, полезно проверить статью Медленно работает админка WordPress.

Код

Важно: код ниже может повлиять на AJAX-запросы, формы, WooCommerce, корзину, оплату, личный кабинет и безопасность. Перед изменениями сделайте backup. Не отключайте nonce, capability checks и security-плагины на рабочем сайте без понимания причины.

Правильный пример AJAX для WordPress

Куда вставлять PHP: functions.php дочерней темы или отдельный мини-плагин.

add_action('wp_enqueue_scripts', 'sc_enqueue_ajax_script');

function sc_enqueue_ajax_script() {
    wp_enqueue_script(
        'sc-ajax-script',
        get_stylesheet_directory_uri() . '/assets/js/sc-ajax.js',
        array('jquery'),
        '1.0.0',
        true
    );

    wp_localize_script('sc-ajax-script', 'sc_ajax_data', array(
        'nonce' => wp_create_nonce('sc_ajax_nonce'),
    ));
}

add_action('wp_ajax_sc_test_ajax', 'sc_test_ajax_handler');
add_action('wp_ajax_nopriv_sc_test_ajax', 'sc_test_ajax_handler');

function sc_test_ajax_handler() {
    check_ajax_referer('sc_ajax_nonce', 'security');

    wp_send_json_success(array(
        'message' => 'AJAX работает',
    ));
}

Куда вставлять JS: файл дочерней темы /assets/js/sc-ajax.js.

jQuery(document).ready(function () {
    jQuery(document).on('click', '.sc-test-ajax-button', function (event) {
        event.preventDefault();

        jQuery.ajax({
            url: '<?php echo admin_url("admin-ajax.php") ?>',
            type: 'POST',
            dataType: 'json',
            data: {
                action: 'sc_test_ajax',
                security: sc_ajax_data.nonce
            },
            success: function (response) {
                console.log(response);
            },
            error: function (xhr) {
                console.log(xhr.status);
                console.log(xhr.responseText);
            }
        });
    });
});

Проверить admin-ajax.php в браузере

Откройте:

https://example.com/wp-admin/admin-ajax.php

Если файл доступен, часто будет ответ 0. Это не всегда ошибка. Это может означать, что файл открылся, но action не передан.

Проверить admin-ajax.php через curl

Куда выполнять: терминал или SSH.

curl -I https://example.com/wp-admin/admin-ajax.php

Проверить POST-запрос с action:

curl -X POST https://example.com/wp-admin/admin-ajax.php -d "action=sc_test_ajax"

Включить debug.log

Куда вставлять: wp-config.php, выше строки “That’s all, stop editing”.

define( 'WP_DEBUG', true );
define( 'WP_DEBUG_LOG', true );
define( 'WP_DEBUG_DISPLAY', false );
@ini_set( 'display_errors', 0 );

После теста проверьте:

/wp-content/debug.log

Проверить, какой action отправляется

В JS можно временно вывести данные перед AJAX-запросом:

console.log({
    action: 'sc_test_ajax',
    security: sc_ajax_data.nonce
});

Найти AJAX action в коде

Куда выполнять: SSH в корне сайта.

grep -RIn "wp_ajax_" wp-content/themes wp-content/plugins

Найти обращения к admin-ajax.php

grep -RIn "admin-ajax.php" wp-content/themes wp-content/plugins

Результат

После правильного исправления admin-ajax.php должен отвечать ожидаемо: форма отправляется, фильтр работает, кнопка выполняет действие, WooCommerce не зависает, админка не тормозит, а Network показывает понятный HTTP-статус и нормальный response.

Хороший результат:

  • admin-ajax.php доступен;
  • запрос содержит правильный action;
  • для гостей есть wp_ajax_nopriv handler;
  • nonce передаётся и проходит проверку;
  • security-плагин не блокирует нормальный запрос;
  • WAF не даёт ложное срабатывание;
  • debug.log не содержит fatal errors;
  • ответ приходит в JSON, если ожидается JSON;
  • нет бесконечного спиннера;
  • нет долгих timeout на AJAX-запросах.

Дополнительные способы

Проверить Heartbeat API

Heartbeat API тоже использует admin-ajax.php. Если запросы идут слишком часто, админка может тормозить. Не отключайте Heartbeat полностью без теста: он влияет на автосохранение и блокировку редактирования.

Проверить WooCommerce cart fragments

WooCommerce может использовать AJAX для обновления корзины. Если cart fragments создают нагрузку, нужно смотреть конкретный сайт, тему, кеш и поведение корзины. Глобальное отключение может сломать мини-корзину.

Проверить кеширование admin-ajax.php

admin-ajax.php нельзя кешировать как обычную страницу. Если кеш или CDN отдаёт старый HTML/JSON, запросы могут вести себя неправильно.

Проверить mixed content

Если сайт работает на HTTPS, а AJAX идёт на HTTP, браузер может блокировать запрос. Проверьте siteurl/home, SSL, редиректы и URL admin-ajax.php.

Проверить CORS

Если AJAX-запрос идёт с другого домена, браузер может заблокировать его из-за CORS. Для обычных WordPress-форм лучше отправлять запросы на тот же домен.

Проверить Application Firewall

Если запрос содержит HTML, JSON, iframe, script, base64 или длинный текст, WAF может принять его за атаку. В таком случае нужно не отключать защиту полностью, а сделать точечное исключение.

Частые ошибки

Использовать неправильный URL

На фронтенде переменная ajaxurl обычно не определена автоматически. Её нужно передавать через wp_localize_script или использовать корректный URL admin-ajax.php.

Не добавлять wp_ajax_nopriv

Если AJAX должен работать для гостей, одного wp_ajax_action недостаточно. Нужен wp_ajax_nopriv_action.

Не передавать action

Без action WordPress не знает, какой обработчик вызвать. В результате можно получить 400 или “0”.

Печатать echo вместо wp_send_json

Для JSON-ответов лучше использовать wp_send_json_success() или wp_send_json_error(). Так WordPress корректно завершит AJAX-запрос.

Отключать nonce ради теста и забывать вернуть

Nonce — важная часть безопасности. Если проверка мешает, нужно исправить передачу nonce, а не удалять защиту.

Кешировать страницу со старым nonce

Если страница долго кешируется, nonce может устареть. Это часто ломает формы, AJAX-кнопки и фронтенд-действия.

Игнорировать Network Response

В Response часто уже написана причина: PHP warning, HTML ошибки, блокировка WAF, login page, 0, JSON error или fatal error.

Диагностика проблем

Проблема: admin-ajax.php возвращает 0

Возможная причина: не передан action, action не совпадает с PHP hook, обработчик не подключён или не завершает ответ правильно.

Что делать: проверить Payload, wp_ajax_{action}, wp_ajax_nopriv_{action}, имя функции и wp_send_json/wp_die.

Проблема: admin-ajax.php возвращает 400

Возможная причина: пустой или некорректный action, неправильный формат запроса, ошибка в JS.

Что делать: проверить Network → Payload, console.log перед отправкой и соответствие action в PHP.

Проблема: admin-ajax.php возвращает 403

Возможная причина: nonce не прошёл проверку, WAF, security-плагин, Cloudflare, IP-блокировка или запрет wp-admin.

Что делать: проверить nonce, security logs, WAF events, .htaccess и правила защиты wp-admin.

Проблема: admin-ajax.php возвращает 404

Возможная причина: файл недоступен, wp-admin закрыт правилом, неправильный путь, серверная конфигурация.

Что делать: проверить наличие файла, .htaccess, Nginx config, права и исключение для admin-ajax.php.

Проблема: admin-ajax.php возвращает 500

Возможная причина: PHP Fatal error, конфликт плагина, ошибка темы, memory limit, несовместимость PHP.

Что делать: включить debug.log, проверить error_log, отключить проблемный плагин, проверить functions.php.

Проблема: запрос зависает долго

Возможная причина: тяжёлый SQL-запрос, внешний API, WooCommerce, Heartbeat, импорт, cron, медленный хостинг.

Что делать: проверить action, Query Monitor, slow query log, HTTP API calls и нагрузку сервера.

Проблема: работает для админа, но не для гостя

Возможная причина: нет wp_ajax_nopriv_{action}, nonce кешируется, действие требует авторизации.

Что делать: добавить nopriv hook, проверить capability checks и кеш страницы.

Проблема: работает на одной странице, но не на другой

Возможная причина: JS не подключён, не передан nonce, другой post_id, конфликт шаблона или кеш.

Что делать: проверить source страницы, Network, Console, подключение скрипта и данные запроса.

Краткие AI-friendly ответы

Почему не работает admin-ajax.php WordPress?

Чаще всего из-за неправильного action, отсутствия wp_ajax/wp_ajax_nopriv hook, ошибки nonce, security-плагина, WAF, кеша, PHP Fatal error, конфликта плагинов или тяжёлого обработчика.

Как проверить admin-ajax.php?

Откройте DevTools → Network, повторите действие и найдите запрос к /wp-admin/admin-ajax.php. Проверьте HTTP-статус, Payload, action, response и время выполнения.

Почему admin-ajax.php возвращает 0?

Обычно не найден обработчик action, action не передан, нет нужного wp_ajax/wp_ajax_nopriv hook или PHP-функция не возвращает корректный ответ.

Почему admin-ajax.php возвращает 403?

Обычно запрос блокирует nonce-проверка, security-плагин, WAF, ModSecurity, Cloudflare, IP-блокировка или правило доступа к wp-admin.

FAQ

Что такое admin-ajax.php в WordPress?

Это файл WordPress в папке wp-admin, через который обрабатываются AJAX-запросы плагинов, тем, админки, форм, WooCommerce и кастомного функционала.

Где находится admin-ajax.php?

Файл находится по пути /wp-admin/admin-ajax.php. На сайте он обычно доступен по адресу https://example.com/wp-admin/admin-ajax.php.

Почему admin-ajax.php грузится медленно?

Причина обычно не в самом файле, а в конкретном AJAX action: тяжёлый SQL-запрос, внешний API, WooCommerce, Heartbeat, импорт, cron, медленный PHP или перегруженный хостинг.

Можно ли отключить admin-ajax.php?

Полностью отключать нельзя. Это может сломать формы, WooCommerce, админку, автосохранение, фильтры, корзину, личный кабинет и плагины.

Что делать, если admin-ajax.php заблокирован security-плагином?

Нужно найти конкретное правило или событие блокировки и сделать точечное исключение. Полностью отключать защиту без понимания причины не стоит.

Почему AJAX работает только для авторизованных пользователей?

Скорее всего, добавлен только hook wp_ajax_action. Для гостей нужен дополнительный hook wp_ajax_nopriv_action.

Почему AJAX работает в админке, но не на фронтенде?

На фронтенде ajaxurl обычно не определён автоматически. Нужно передать URL через wp_localize_script или другим корректным способом.

Почему после кеширования AJAX перестал работать?

Кеш может сохранить старый nonce, старые JS-файлы или неправильный ответ. Исключите AJAX-запросы и динамические страницы из агрессивного кеширования.

Как найти, какой плагин вызывает admin-ajax.php?

Посмотрите action в Network → Payload. Потом найдите этот action в коде плагинов через grep или отключайте подозрительные плагины на staging-копии.

Когда обращаться к специалисту?

Если admin-ajax.php ломает заявки, WooCommerce checkout, личный кабинет, формы, фильтры, оплату или админку, лучше не исправлять наугад. Нужна проверка Network, action, PHP-логов, WAF, кеша и обработчиков.

Вывод

Если не работает admin-ajax.php WordPress, не нужно сразу отключать все плагины или править ядро WordPress. Сначала нужно открыть Network, найти конкретный запрос, посмотреть action, HTTP-статус, response, headers и время выполнения.

Основные причины — неправильный action, отсутствие wp_ajax_nopriv для гостей, ошибка nonce, WAF/security-блокировка, кеш, PHP Fatal error, конфликт плагинов, WooCommerce, Heartbeat API или медленный обработчик.

Самый безопасный порядок: backup, Network, Payload, debug.log, проверка hooks, nonce, security-плагинов, WAF, кеша и PHP-логов. Так можно исправить AJAX точечно и не сломать формы, заявки, корзину, оплату и админку.

Об авторе

vkuzyomko administrator