Eroare WordPress admin-ajax.php 400 bad request
Încerc să rulez un formular WordPress cu AJAX dar consola returnează 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("There was an error: " + err);
}
});
return false;
});
});
});
here is my functions.php file:
add_action('wp_ajax_send_form', 'send_form'); // This is for authenticated users
add_action('wp_ajax_nopriv_send_form', 'send_form'); // This is for unauthenticated users.
function send_form(){
if (isset($_POST['send_form'])){
echo'ok';
}
else{
echo 'bad';
}
}
and my form:
<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="Dodaj">
all form : https://pastebin.com/YJXTjGjJ
WORKING:
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("There was an error: " + err);
}
});
return false;
});
});
});
În proprietatea data trebuie să transmiți acțiunea care va fi apelată împreună cu restul datelor tale.
În funcție de acțiunea ta AJAX, acțiunea ar trebui să fie send_form
data: {
action: 'send_form',
formData: $("#form_add_to_cart").serialize()
}
Acum, în funcția ta de callback PHP, poți folosi print_r($_POST)
pentru a vedea ce conține cererea POST.

@NCTI După cererea ajax, poți merge în network -> fetch/xhr -> găsește cererea și verifică răspunsul, ce spune?

Și am mai multe formulare pentru fiecare produs pe pagină, dar ajax funcționează doar pentru primul formular.

@NCTI se pare că URL-ul tău este incorect, asigură-te că ai introdus URL-ul corect. Dacă folosești url: 'https://domain.com/wp-admin/admin-ajax.php'
sunt 100% sigur că nu va funcționa, schimbă-l cu domeniul tău

Și am multiple formulare pentru fiecare produs pe pagina mea, dar ajax funcționează doar pentru primul formular., trimiterea funcționează pentru fiecare formular cu acel ID dar datele transmise sunt preluate de la primul formular cu acel ID. În loc de $("#form_add_to_cart").serialize(),
folosește $(this).serialize(),

Să continuăm această discuție în chat.

Codul tău de formular complet conține un câmp input ascuns numit action
cu valoarea send_form
.
Totuși, nu îl trimiți corect din cauza părții contentType
din scriptul tău JS, care trimite datele formularului ca un payload JSON, dar reține că vechiul endpoint admin-ajax.php
nu suportă payload JSON, astfel încât $_REQUEST['action']
va fi gol dacă nu l-ai adăugat în query string-ul URL-ului, iar WordPress nu va ști care este acțiunea AJAX. Așadar, elimină următoarea linie din codul tău JS și eroarea va dispărea:
contentType : 'application/json; charset=utf-8', // elimină această linie
În plus, formularul tău nu are un câmp input numit send_form
, așa că în funcția ta send_form()
, această condiție va eșua: if (isset($_POST['send_form']))
. Deci ar trebui să adaugi câmpul în formular sau să modifici condiția if
.
De asemenea, ar trebui să apelezi wp_die()
la final în funcția ta pentru a închide pagina și a preveni WordPress să afișeze un 0
(zero).

Mulțumesc, funcționează. Acum nu pot afișa datele transmise funcției mele. Rulez send_form(); pe aceeași pagină când apelez ajax și nu afișează nimic.

Funcția ta în starea actuală nu afișează niciunul din datele trimise, dar ar afișa fie "ok" fie "bad". Și pentru a prelua datele trimise, folosește formatul $_POST['nume input']
, de exemplu $_POST['quantity']
. De asemenea, încearcă var_dump( $_POST );
la începutul funcției și vei vedea o listă cu datele trimise prin formular. Dar întrebarea ta inițială a fost deja răspunsă, așa că dacă ai altă întrebare, poți întreba într-un alt post. Totuși, reține că întrebările generice despre PHP nu sunt pe subiect pe acest stack și ar trebui adresate pe Stack Overflow.

De asemenea, te rog să anulezi modificarea întrebării tale, adică să revii la versiunea anterioară/originală. Dacă ai vrut să adaugi cod nou, adaugă-l la sfârșit și nu modifica partea pe care ți-am spus să o elimini :)

Îmi returnează date de genul:
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) } } }

Acum returnează: 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

Să continuăm această discuție în chat.
