GET admin-ajax.php возвращает ошибку 400 bad request

Вопрос или проблема

Я пытаюсь отобразить данные из таблицы MySQL при нажатии кнопки, но получаю ‘GET ajaxurl action 400 bad request’. Я знаю, что URL правильный, потому что я вывел его в консоль, и он был корректным. Вот мой код на JavaScript:


document.addEventListener('DOMContentLoaded', function() {
    document.getElementById('fetch-data-btn').addEventListener('click', function() {
        console.log('Ajax URL:', ajaxData.ajaxurl);
        // Выполнить AJAX-запрос
        jQuery.ajax({
            url: ajaxData.ajaxurl, // Этот URL автоматически предоставляется WordPress
            type: 'GET',
            data: {
                action: 'custom_fetch_data',
            },
            success: function(response) {
                console.log('AJAX Success', response);
                const dataList = document.getElementById('data-list');
                dataList.innerHTML = ''; // Очистить предыдущие данные
                const data = JSON.parse(response);
                data.forEach(item => {
                    const listItem = document.createElement('li');
                    listItem.textContent = `${item.excursion_name}: ${item.start_date} - ${item.end_date}`;
                    dataList.appendChild(listItem);
                });
            },
            error: function(error) {
                console.error('Error:', error);
            }
        });
    });
});

и вот мой PHP-код:

function custom_fetch_data() {
    define('WP_DEBUG', true);
define('WP_DEBUG_LOG', true);
define('WP_DEBUG_DISPLAY', false);
    global $wpdb;
    $table_name="table name";
    //выбрать все строки из базы данных 

    $results = $wpdb->get_results("SELECT * FROM $table_name");
    ob_start(); // Начать буферизацию вывода

    // Подготовить данные для JSON-ответа
    $data = [];
    foreach ($results as $row) {
        $data[] = [

            'excursion_name' => $row->excursion_name,        
            'start_date' => $row->start_date,
            'end_date' => $row->end_date
        ];
    }

    // Отправить JSON-ответ
    echo json_encode($data);
    wp_send_json($data);
    die(); // Важно: завершить AJAX-запрос
}
add_action('wp_ajax_custom_fetch_data', 'custom_fetch_data');
add_action('wp_ajax_nopriv_custom_fetch_data', 'custom_fetch_data');

function roomzero_enqueue_user_js() {
    // Динамически получить URL плагина
    $plugin_url = plugin_dir_url(__FILE__) . '../js/roomzerouser.js';

    // Зарегистрировать скрипт для фронтенд пользователей
    wp_enqueue_script(
        'roomzero-user-script',        // Идентификатор скрипта
        $plugin_url,                   // Полный URL JS-файла
        array('jquery'),               // Зависимости (например, jQuery, если нужно)
        null,                          // Версия (null = версия не указана)
        true                           // Загрузить скрипт в подвале
    );

    wp_add_inline_script('roomzero-user-script', 'const ajaxData = {"ajaxurl": "' . admin_url('admin-ajax.php') . '"};');
}

add_action('wp_enqueue_scripts', 'roomzero_enqueue_user_js');

Ответ или решение

Ошибка "GET admin-ajax.php возвращает ошибку 400 bad request" может вызывать большое смущение, особенно когда вы пытаетесь убедиться, что URL действительно корректен. Позвольте объяснить, что может вызывать такое поведение и как его можно исправить.

Теория

Ошибка 400 Bad Request обычно указывает на проблемы в запросе, который был отправлен на сервер. Это может быть связано с неправильной структурой данных, отсутствием необходимых параметров или другими проблемами, связанными с передачей данных. В контексте работы с AJAX в WordPress, все AJAX-запросы отправляются к admin-ajax.php, который обрабатывает эти запросы. Нужно уделить внимание нескольким аспектам:

  1. Правильная структура запроса: AJAX-запросы требуют правильного формата передачи данных и включения всех обязательных параметров.
  2. Правильная регистрация бекэнд-хендлера: Добавление правильных экшн-хуков для обработки реквестов из логики фронтенда.
  3. Передача данных: Убедиться, что данные, которые отправляются, правильно формируются и включают все необходимые компоненты.

Пример

У вас в проекте написан JavaScript-код, который инициализирует AJAX-запрос при нажатии кнопки. Основная ошибка в вашем случае, скорее всего, связана с самим запросом. Рассмотрим ваш JavaScript-код:

document.addEventListener('DOMContentLoaded', function() {
    document.getElementById('fetch-data-btn').addEventListener('click', function() {
        console.log('Ajax URL:', ajaxData.ajaxurl);
        // Выполнение AJAX-запроса
        jQuery.ajax({
            url: ajaxData.ajaxurl, // URL взят из WP
            type: 'GET', // Метод запроса
            data: {
                action: 'custom_fetch_data', // Действие, определяющее обработчик на сервере
            }, 
            success: function(response) { /*...*/ },
            error: function(error) {
                console.error('Error:', error);
            }
        });
    });
});

Применение

Смотрим на ваш PHP-код. Проблема может заключаться в нескольких местах:

  1. Определение действий AJAX в WordPress: Вы правильно добавили add_action для обработки действий. Убедитесь, что PHP-код зарегистрирован и выполняется в нужное время. Это достигается как:

    add_action('wp_ajax_custom_fetch_data', 'custom_fetch_data');    // Обработка для авторизованных пользователей
    add_action('wp_ajax_nopriv_custom_fetch_data', 'custom_fetch_data'); // Обработка для неавторизованных пользователей
  2. Правильная работа функции custom_fetch_data():

    • Прежде всего, убедитесь в корректности выбора данных из базы $wpdb->get_results(). Ошибка в SQL-запросе может возвращать пустой результат или вызывать ошибки.
    • Используете функцию wp_send_json(), которая в WordPress не требует ручного вызова die(), а также автоматически выставляет правильные заголовки для JSON.
    • Два раза выводите ответ: json_encode($data); и затем wp_send_json($data);. Желательно убрать echo json_encode($data);.
  3. JavaScript-обработка результата:

    • Убедитесь, что response, который вы получаете в функции success, действительно содержит ожидаемые данные. Это может быть объектом, строкой, или может быть полностью пуст, если PHP-код не выполняется.
  4. Обработка ошибок:

    • Всегда логируйте ошибки в PHP. Ваше решение с WP_DEBUG правильное, но проверьте, нет ли ошибок в debug.log.
  5. Возможные проблемы с URL:

    • Если Вы уверены, что URL верный, убедитесь также в отсутствии проблем с неверной конфигурацией сервера, проблемами с htaccess или ещё какими-либо сетевыми вопросами.

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

Оцените материал
Добавить комментарий

Капча загружается...