WordPress admin-ajax.php 400 bad request - решение проблемы
Пытаюсь отправить форму через AJAX в WordPress, но консоль возвращает ошибку: Wordpress admin-ajax.php 400 bad request.
jQuery(function ($) {
$(document).ready(function () {
jQuery('#form_add_to_cart').on('submit', function () {
jQuery.ajax({
url: 'https://domain.com/wp-admin/admin-ajax.php',
method: 'post',
contentType : 'application/json; charset=utf-8',
data: $("#form_add_to_cart").serializeArray(),
success: function (response) {
alert(response);
},
fail: function (err) {
alert("Произошла ошибка: " + err);
}
});
return false;
});
});
});
Вот мой файл functions.php:
add_action('wp_ajax_send_form', 'send_form'); // Для авторизованных пользователей
add_action('wp_ajax_nopriv_send_form', 'send_form'); // Для неавторизованных пользователей
function send_form(){
if (isset($_POST['send_form'])){
echo'ok';
}
else{
echo 'bad';
}
}
И моя форма:
<form name="form_add_to_cart" method="POST" class="form_product" id="form_add_to_cart" action="">
<input hidden="hidden" name="action" id="add_product_to_cart"
value="send_form">
<input class="btn btn-primary" type="submit"
name="add_to_cart-<?php echo $product_id; ?>" id="add_to_cart"
value="Добавить">
Полная форма: https://pastebin.com/YJXTjGjJ
РАБОЧЕЕ РЕШЕНИЕ:
jQuery(function ($) {
$(document).ready(function () {
jQuery('#form_add_to_cart').on('submit', function () {
jQuery.ajax({
url: 'https://domain.com/wp-admin/admin-ajax.php',
method: 'post',
data: $("#form_add_to_cart").serializeArray(),
success: function (response) {
alert(response);
},
fail: function (err) {
alert("Произошла ошибка: " + err);
}
});
return false;
});
});
});
В свойстве data необходимо передать действие, которое будет вызвано вместе с остальными данными.
В зависимости от вашего ajax-действия, действие должно быть send_form
data: {
action: 'send_form',
formData: $("#form_add_to_cart").serialize()
}
Теперь в вашей php-функции обратного вызова вы можете использовать print_r($_POST)
, чтобы увидеть содержимое POST-запроса.

@NCTI После ajax-запроса, можешь зайти в Network -> Fetch/XHR -> найти запрос и проверить ответ, что там написано?

И у меня несколько форм для каждого товара на странице, но ajax работает только для первой формы.

@NCTI похоже, ваш URL указан неверно, убедитесь, что передаете правильный URL. Если вы используете url: 'https://domain.com/wp-admin/admin-ajax.php'
, я на 100% уверен, что это не сработает - измените на ваш домен

У меня несколько форм для каждого товара на странице, но ajax работает только для первой формы. Отправка работает для каждой формы с этим id, но данные берутся из первой формы с таким id. Вместо $("#form_add_to_cart").serialize(),
используйте $(this).serialize(),

Давайте продолжим это обсуждение в чате.

Ваш полный код формы действительно содержит скрытое поле ввода с именем action
и значением send_form
.
Однако вы отправляете его некорректно из-за параметра contentType
в вашем JS-скрипте, который отправляет данные формы в виде JSON-пакета. Учтите, что старый эндпоинт admin-ajax.php
не поддерживает JSON-пакеты, поэтому $_REQUEST['action']
будет пустым, если вы не добавили его в строку запроса URL. В результате WordPress не сможет определить, какое AJAX-действие выполняется. Просто удалите следующую строку из вашего JS-кода, и ошибка исчезнет:
contentType : 'application/json; charset=utf-8', // удалите эту строку
Кроме того, в вашей форме нет поля ввода с именем send_form
, поэтому в вашей функции send_form()
условие if (isset($_POST['send_form']))
не сработает. Вам следует добавить это поле в форму или изменить условие if
.
Также в конце функции следует вызвать wp_die()
, чтобы завершить выполнение страницы и предотвратить вывод WordPress нуля (0
).

Спасибо, это работает. Теперь я не могу отобразить переданные данные в моей функции. Я вызываю send_form(); на той же странице, когда выполняю ajax-запрос, но ничего не отображается.

Ваша функция в текущем виде не выводит никаких отправленных данных, но она должна отображать либо "ok", либо "bad". Чтобы получить отправленные данные, используйте формат $_POST['имя поля']
, например, $_POST['quantity']
. Также попробуйте добавить var_dump( $_POST );
в начале функции, и вы увидите список отправленных данных формы. Однако ваш первоначальный вопрос уже был решён, поэтому, если у вас есть другой вопрос, задайте его в новом посте. Учтите, что общие вопросы по PHP не относятся к тематике этого стека и их следует задавать на Stack Overflow.

Также, пожалуйста, отмените правку вашего вопроса, то есть вернитесь к предыдущей/оригинальной версии. Если вы хотели добавить новый код, поместите его в конце, а не изменяйте ту часть, которую я просил удалить :)

Мне возвращаются данные в виде:
array(2) { ["action"]=> string(9) "send_form" ["formData"]=> array(9) { [0]=> array(2) { ["name"]=> string(8) "quantity" ["value"]=> string(1) "1" } [1]=> array(2) { ["name"]=> string(7) "do_wash" ["value"]=> string(2) "on" } [2]=> array(2) { ["name"]=> string(10) "product_id" ["value"]=> string(2) "12" } [3]=> array(2) { ["name"]=> string(13) "product_price" ["value"]=> string(3) "0.5" } [4]=> array(2) { ["name"]=> string(26) "product_person_to_bringing" ["value"]=> string(1) "0" } [5]=> array(2) } } }

Теперь возвращается: array(2) { ["action"]=> string(9) "send_form" ["formData"]=> string(178) "quantity=1&do_wash=on&product_id=12&product_price=0.5&product_person_to_bringing=0&product_wash_price=0.2&product_bringing_price=0.4&product_calculate_bringing=0&action=send_form" } id_produktu0

Давайте продолжим обсуждение в чате.
