Risolvere errore 400 bad request in admin-ajax.php WordPress
Provo a eseguire un form WordPress con AJAX ma la console restituisce 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;
});
});
});
questo è il mio file functions.php:
add_action('wp_ajax_send_form', 'send_form'); // Per utenti autenticati
add_action('wp_ajax_nopriv_send_form', 'send_form'); // Per utenti non autenticati
function send_form(){
if (isset($_POST['send_form'])){
echo'ok';
}
else{
echo 'bad';
}
}
e il mio 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">
tutto il form: https://pastebin.com/YJXTjGjJ
FUNZIONANTE:
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;
});
});
});
Nella proprietà data è necessario passare l'azione da chiamare insieme al resto dei tuoi dati.
In base alla tua azione AJAX, l'azione dovrebbe essere send_form
data: {
action: 'send_form',
formData: $("#form_add_to_cart").serialize()
}
Ora nella tua funzione di callback PHP puoi usare print_r($_POST)
per vedere cosa contiene la richiesta POST.

@NCTI Dopo la richiesta ajax, puoi andare in rete (network) -> fetch/xhr -> trovare la richiesta e controllare la risposta, cosa dice?

E ho più moduli per ogni prodotto nella mia pagina, ma l'ajax funziona solo per il primo modulo.

@NCTI sembra che il tuo URL non sia corretto, assicurati di aver inserito l'URL giusto. Se stai usando url: 'https://domain.com/wp-admin/admin-ajax.php'
sono sicuro al 100% che non funzionerà, cambialo con il tuo dominio

E ho più moduli per ogni prodotto nella mia pagina, ma l'ajax funziona solo per il primo modulo., l'invio funziona per ogni modulo con quell'id ma i dati passati vengono presi dal primo modulo con quell'id. Invece di $("#form_add_to_cart").serialize(),
usa $(this).serialize(),

Continuiamo questa discussione nella chat.

Il tuo codice del form completo contiene un input nascosto di nome action
con il valore send_form
.
Tuttavia, non lo stai inviando correttamente a causa della parte contentType
nel tuo script JS, che invia i dati del form come payload JSON, ma nota che il vecchio endpoint admin-ajax.php
non supporta i payload JSON, quindi $_REQUEST['action']
sarà vuoto a meno che tu non lo aggiunga alla query string dell'URL, e di conseguenza WordPress non saprà quale sia l'azione AJAX. Quindi basta rimuovere quanto segue dal tuo codice JS e l'errore scomparirà:
contentType : 'application/json; charset=utf-8', // rimuovi questa riga
Inoltre, il tuo form non ha un input di nome send_form
, quindi nella tua funzione send_form()
, questo fallirà: if (isset($_POST['send_form']))
. Dovresti quindi aggiungere l'input al tuo form o modificare la condizione if
.
Inoltre, dovresti chiamare wp_die()
alla fine della tua funzione per uscire dalla pagina e evitare che WordPress stampi uno 0
(zero).

Grazie, ora funziona. Ma non riesco a visualizzare i dati passati alla mia funzione. Quando chiamo l'ajax, eseguo send_form(); nella stessa pagina, ma non viene visualizzato nulla.

La tua funzione così com'è ora non visualizza nessuno dei dati inviati, ma in realtà dovrebbe visualizzare "ok" o "bad". Per recuperare i dati inviati, usa semplicemente il formato $_POST['nome input']
, ad esempio $_POST['quantity']
. Prova anche a inserire var_dump( $_POST );
all'inizio della funzione per vedere un elenco dei dati del form inviati. Comunque la tua domanda originale è già stata risposta, quindi se hai un'altra domanda, puoi chiederla in un altro post. Tieni presente però che le domande generiche su PHP sono fuori tema su questo stack e dovrebbero essere postate su Stack Overflow.

Inoltre, per favore annulla la modifica alla tua domanda, cioè torna alla versione precedente/originale. Se volevi aggiungere nuovo codice, appendilo in fondo senza modificare la parte che ti avevo detto di rimuovere :)

Mi restituisce dati come:
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) } } }

Ora restituisce: 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

Continuiamo questa discussione in chat.
