Не работает кастомный AJAX в теме WordPress: как исправить

Диагностика проблемы с AJAX в теме WordPress

Если кастомный AJAX-запросы в вашей теме перестали работать или не запускаются вовсе, это обычно связано с неправильной регистрацией скриптов, отсутствием корректной локализации, ошибками в обработчике PHP или неверным использованием action-хуков. Чтобы понять, в чём именно проблема, нужно проверить несколько важных моментов:

  • Подключён ли скрипт AJAX с правильным wp_localize_script для передачи ajaxurl?
  • Обрабатываются ли AJAX-запросы через правильные хуки wp_ajax_ и wp_ajax_nopriv_?
  • Правильно ли указан URL для AJAX-запроса в JS?
  • Отслеживаются ли ошибки в консоли браузера и в логах PHP?

Пошагово проверьте:

  1. Откройте консоль браузера (F12, вкладка Console). Есть ли ошибки JavaScript?
  2. Проверьте вкладку Network (Сеть) на наличие AJAX-запросов и ответов сервера.
  3. Посмотрите логи PHP для ошибок обработки запросов.

Пошаговое решение проблемы с кастомным AJAX

1. Правильное подключение и локализация скрипта

В functions.php темы или плагина подключите скрипт и локализуйте переменную ajaxurl так:

function mytheme_enqueue_scripts() {
    wp_enqueue_script('my-ajax-script', get_template_directory_uri() . '/js/my-ajax.js', ['jquery'], '1.0', true);
    wp_localize_script('my-ajax-script', 'my_ajax_object', [
        'ajax_url' => admin_url('admin-ajax.php'),
        'nonce'    => wp_create_nonce('my_ajax_nonce')
    ]);
}
add_action('wp_enqueue_scripts', 'mytheme_enqueue_scripts');

2. JavaScript для отправки AJAX-запроса

Пример отправки AJAX-запроса с проверкой nonce:

jQuery(document).ready(function($) {
    $('#my-button').on('click', function(e) {
        e.preventDefault();
        $.ajax({
            url: my_ajax_object.ajax_url,
            type: 'POST',
            data: {
                action: 'my_custom_action',
                nonce: my_ajax_object.nonce,
                data1: 'value1'
            },
            success: function(response) {
                console.log('Ответ сервера:', response);
            },
            error: function(xhr, status, error) {
                console.error('Ошибка AJAX:', error);
            }
        });
    });
});

3. PHP-обработчик AJAX-запроса

Добавьте в functions.php обработчики для авторизованных и неавторизованных пользователей:

function my_custom_ajax_handler() {
    check_ajax_referer('my_ajax_nonce', 'nonce');

    // Обработка данных
    $data1 = isset($_POST['data1']) ? sanitize_text_field($_POST['data1']) : '';

    // Пример ответа
    wp_send_json_success(['message' => 'Данные получены: ' . $data1]);
}
add_action('wp_ajax_my_custom_action', 'my_custom_ajax_handler');
add_action('wp_ajax_nopriv_my_custom_action', 'my_custom_ajax_handler');

Как проверить, что AJAX работает

  • Нажмите кнопку, запускающую AJAX-запрос.
  • В консоли браузера должна появиться строка с ответом сервера Ответ сервера: {"success":true,"data":{"message":"Данные получены: value1"}}.
  • Во вкладке Network проверьте, что запрос на admin-ajax.php возвращает HTTP 200 и JSON с success=true.

Частые ошибки и как их исправить

  • Отсутствует wp_localize_script: переменная ajaxurl не передана в JS — запросы не отправляются или идут на неправильный URL.
  • Неправильный action в JS или PHP: action в JS и имя хука PHP должны совпадать.
  • Не зарегистрирован обработчик для неавторизованных пользователей: запросы от гостей не обрабатываются, если не подключён wp_ajax_nopriv_.
  • Отсутствие nonce или неправильная проверка: запросы отклоняются из-за нарушенной безопасности.
  • Ошибки в PHP-обработчике: проверьте логи сервера, корректно ли обрабатываются входные данные.

Практические советы по безопасности и производительности

  • Всегда проверяйте nonce через check_ajax_referer для защиты от CSRF.
  • Санитизируйте все входящие данные в PHP.
  • Минимизируйте количество данных, передаваемых через AJAX для ускорения отклика.
  • Для сложных или частых операций используйте transient или объектный кеш, чтобы снизить нагрузку на сервер.
  • Отключайте обработчики AJAX, которые не нужны гостям, чтобы сократить потенциальные риски.

Сравнение вариантов подключения AJAX

МетодПлюсыМинусы
wp_localize_script + admin-ajax.phpСтандартный, поддерживается всеми WP версиями, легко настроитьБольшая нагрузка при множестве запросов, медленнее, чем REST API
REST APIБыстрее, современный подход, гибкийСложнее настроить, требует регистрации эндпоинтов и авторизации
Плагины для AJAXУпрощают настройку, готовые решенияЗависимость, возможные конфликты, лишний код
Как удалить разметку Schema.org из темы WordPress
01.06.2026
Как работать с AJAX в теме WordPress: практическое руководство
26.03.2026
Как создать динамическую фильтровую форму в теме WordPress
11.01.2026
Как автоматически обновлять темы WordPress без плагинов
13.03.2026
Как удалить CSS и JS из темы WordPress, которые не используются
10.05.2026