Вопрос или проблема
Я пытаюсь отобразить данные из таблицы 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
, который обрабатывает эти запросы. Нужно уделить внимание нескольким аспектам:
- Правильная структура запроса: AJAX-запросы требуют правильного формата передачи данных и включения всех обязательных параметров.
- Правильная регистрация бекэнд-хендлера: Добавление правильных экшн-хуков для обработки реквестов из логики фронтенда.
- Передача данных: Убедиться, что данные, которые отправляются, правильно формируются и включают все необходимые компоненты.
Пример
У вас в проекте написан 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-код. Проблема может заключаться в нескольких местах:
-
Определение действий 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'); // Обработка для неавторизованных пользователей
-
Правильная работа функции
custom_fetch_data()
:- Прежде всего, убедитесь в корректности выбора данных из базы
$wpdb->get_results()
. Ошибка в SQL-запросе может возвращать пустой результат или вызывать ошибки. - Используете функцию
wp_send_json()
, которая в WordPress не требует ручного вызоваdie()
, а также автоматически выставляет правильные заголовки для JSON. - Два раза выводите ответ:
json_encode($data);
и затемwp_send_json($data);
. Желательно убратьecho json_encode($data);
.
- Прежде всего, убедитесь в корректности выбора данных из базы
-
JavaScript-обработка результата:
- Убедитесь, что
response
, который вы получаете в функцииsuccess
, действительно содержит ожидаемые данные. Это может быть объектом, строкой, или может быть полностью пуст, если PHP-код не выполняется.
- Убедитесь, что
-
Обработка ошибок:
- Всегда логируйте ошибки в PHP. Ваше решение с
WP_DEBUG
правильное, но проверьте, нет ли ошибок вdebug.log
.
- Всегда логируйте ошибки в PHP. Ваше решение с
-
Возможные проблемы с URL:
- Если Вы уверены, что URL верный, убедитесь также в отсутствии проблем с неверной конфигурацией сервера, проблемами с htaccess или ещё какими-либо сетевыми вопросами.
Обобщая всё вышесказанное, проверьте правильность и целостность всех компонентов: от JavaScript, который инициирует AJAX-запрос, до PHP, который обрабатывает этот запрос и возвращает данные. Регулярно тестируйте каждую часть кода изолированно и ретроспективно, чтобы как можно раньше вычленить, на каком именно этапе происходит сбой.