Risolvere errore 400 bad request in admin-ajax.php WordPress

23 set 2021, 14:00:22
Visualizzazioni: 13.5K
Voti: 0

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;
            });
        });
    });
2
Commenti

"ho più moduli per ogni prodotto nella mia pagina, ma ajax funziona solo per il primo modulo" - hai usato '#form_add_to_cart' come selettore. Questo potenzialmente seleziona solo un singolo elemento con id=form_add_to_cart: gli id dovrebbero essere univoci nella pagina.

Rup Rup
23 set 2021 14:42:21

Ok ho cambiato il selettore da ID a classe, ora il click funziona, ma ricevo ancora l'errore 400

NCTI NCTI
23 set 2021 14:44:16
Tutte le risposte alla domanda 2
8

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.

23 set 2021 14:30:20
Commenti

Sfortunatamente lo stesso errore.

NCTI NCTI
23 set 2021 14:35:22

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

Buttered_Toast Buttered_Toast
23 set 2021 14:37:36

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

NCTI NCTI
23 set 2021 14:39:20

Vedo 0 in network -> fetch/xhr -> response

NCTI NCTI
23 set 2021 14:41:01

@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

Buttered_Toast Buttered_Toast
23 set 2021 14:44:52

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(),

Buttered_Toast Buttered_Toast
23 set 2021 14:46:28

Continuiamo questa discussione nella chat.

NCTI NCTI
23 set 2021 15:29:36

quando ho ricevuto i dati in php ho provato a usare json_decode($data) e non mi ha restituito nulla.

NCTI NCTI
23 set 2021 16:03:50
Mostra i restanti 3 commenti
6

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).

23 set 2021 14:46:56
Commenti

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.

NCTI NCTI
23 set 2021 15:17:08

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.

Sally CJ Sally CJ
23 set 2021 16:05:58

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 :)

Sally CJ Sally CJ
23 set 2021 16:09:05

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) } } }

NCTI NCTI
23 set 2021 16:14:48

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

NCTI NCTI
23 set 2021 16:18:21

Continuiamo questa discussione in chat.

Sally CJ Sally CJ
23 set 2021 16:20:12
Mostra i restanti 1 commenti