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?
Buttered_Toast
Și am mai multe formulare pentru fiecare produs pe pagină, dar ajax funcționează doar pentru primul formular.
NCTI
@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
Buttered_Toast
Ș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(),
Buttered_Toast
Să continuăm această discuție în chat.
NCTI
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.
NCTI
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.
Sally CJ
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 :)
Sally CJ
Î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) } } }
NCTI
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
NCTI
Să continuăm această discuție în chat.
Sally CJ