Eroare WordPress admin-ajax.php 400 bad request

23 sept. 2021, 14:00:22
Vizualizări: 13.5K
Voturi: 0

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

"am mai multe formulare pentru fiecare produs pe pagina mea, dar ajax funcționează doar pentru primul formular" - ai folosit '#form_add_to_cart' ca selector. Acesta selectează în mod potențial doar un singur element cu id=form_add_to_cart: id-urile ar trebui să fie unice pe pagină.

Rup Rup
23 sept. 2021 14:42:21

Ok, am schimbat selectorul de la ID la clasă, acum click-ul funcționează, dar încă primesc eroare 400

NCTI NCTI
23 sept. 2021 14:44:16
Toate răspunsurile la întrebare 2
8

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

23 sept. 2021 14:30:20
Comentarii

Din păcate, aceeași eroare.

NCTI NCTI
23 sept. 2021 14:35:22

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

Buttered_Toast Buttered_Toast
23 sept. 2021 14:37:36

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

NCTI NCTI
23 sept. 2021 14:39:20

Văd 0 în network -> fetch/xhr ->response

NCTI NCTI
23 sept. 2021 14:41:01

@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 Buttered_Toast
23 sept. 2021 14:44:52

Ș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 Buttered_Toast
23 sept. 2021 14:46:28

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

NCTI NCTI
23 sept. 2021 15:29:36

când am primit date în php am încercat să folosesc json_decode($data) și nu mi-a returnat nimic.

NCTI NCTI
23 sept. 2021 16:03:50
Arată celelalte 3 comentarii
6

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

23 sept. 2021 14:46:56
Comentarii

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 NCTI
23 sept. 2021 15:17:08

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 Sally CJ
23 sept. 2021 16:05:58

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 Sally CJ
23 sept. 2021 16:09:05

Î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 NCTI
23 sept. 2021 16:14:48

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 NCTI
23 sept. 2021 16:18:21

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

Sally CJ Sally CJ
23 sept. 2021 16:20:12
Arată celelalte 1 comentarii