Apel AJAX returnează 0

28 apr. 2016, 18:25:48
Vizualizări: 13.5K
Voturi: 4

În ciuda multor postări similare, niciuna dintre soluțiile propuse nu a funcționat pentru mine, așa că iată-mă aici.

Am următorul script:

jQuery('#term').keyup(ajaxChange);

function ajaxChange(){
    var newFormChange = jQuery("#term").val();
    alert (newFormChange);
    jQuery.ajax({
        type:"POST",
        action: "my_test_action",
        url: "/wp-admin/admin-ajax.php",
        data: newFormChange,
        success:function(data){
            console.log(data);
        }
    });

    return false;
}

Iar partea de PHP arată astfel:

function my_test_action() {
    $var = "acesta este un test";
    wp_send_json($var);

    die();
}

add_action( 'wp_ajax_my_test_action', 'my_test_action' );
add_action( 'wp_ajax_nopriv_my_test_action', 'my_test_action' );

Am încercat și cu: echo json_encode($var) sau echo $var, în loc de wp_send_json(), dar funcția returnează întotdeauna 0 în consola browserului!

Celelalte apeluri AJAX funcționează, de exemplu am un alt script care apelează un script PHP care execută o interogare WP și afișează niște articole, acela funcționează perfect.

EDIT: Iată cum este inclus scriptul meu:

function add_js() {
    if (is_page_template()) {
        wp_enqueue_script( 'mycustomscript', get_stylesheet_directory_uri().'/js/mycustomscript.js', array('jquery'), '1.0', true );
        wp_localize_script('mycustomscript', 'ajaxurl', admin_url( 'admin-ajax.php' ) );
    }
}
add_action('wp_enqueue_scripts', 'add_js');

Cred că problema vine de la variabila newFormChange, deoarece jQuery(this).serialize(); nu a funcționat de la început, pentru că formularul nu este trimis ci doar unul dintre câmpurile sale se modifică. Așa că l-am înlocuit cu var newFormChange = jQuery("#term").val(); dar atunci poate există o problemă cu url: "/wp-admin/admin-ajax.php"

Unde greșesc? Mulțumesc

0
Toate răspunsurile la întrebare 3
9

Rețineți că action ar trebui să fie în interiorul cheii data. În cererea ta POST nu există nicio cheie numită action, prin urmare, funcția de callback nu este niciodată apelată.

Luați în considerare acest exemplu:-

jQuery.ajax({
    type:"POST",
    url: "/wp-admin/admin-ajax.php",
    data: { 
        action: "my_test_action",
        form_data : newFormChange
    },
    success: function (data) {
        console.log(data);
    }
});

De asemenea, rețineți: Nu utilizați niciodată URL relativ pentru Ajax precum /wp-admin/admin-ajax.php. Puteți folosi wp_localize_script(). Consultați aceste exemple

28 apr. 2016 18:37:08
Comentarii

bravo, funcționează! dar e ciudat, am un alt script unde action este în afara, și totuși funcționează!

Fafanellu Fafanellu
28 apr. 2016 18:44:41

Cu plăcere :) Nu, trebuie să verifici din nou. action este un lucru specific WordPress, iar restul parametrilor aparțin jQuery. Poți vedea aici jQuery Ajaxaction nu este o cheie validă.

Sumit Sumit
28 apr. 2016 18:49:35

dacă scriu alert(newFormChange) văd ceva de genul "term=anything&action=my_test_action. Prin urmare, "lucrul specific WP" action este trimis ca un alt variabil POST? Am încă o întrebare: dacă folosesc $_POST['term'] în my_test_action(), nu este recunoscut. Deși acesta este modul corect de a prelua variabilele POST cu această metodă. Unde greșesc?

Fafanellu Fafanellu
28 apr. 2016 18:56:06

Nu sunt sigur unde ai plasat alert-ul! dar dacă vezi term=anything&action=my_test_action în alert, acesta este un request GET. Deci vei putea accesa variabila folosind $_GET în loc de $_POST, dar mă întreb cu adevărat de ce vezi query string în loc de obiect js.

Sumit Sumit
28 apr. 2016 19:56:31

Am apelat metoda serialize() pe newFormChange apoi am plasat alert-ul imediat după. Lucrul ciudat este că afișează ceea ce am scris mai sus, chiar dacă action este definit în cadrul datelor. Am aplicat recomandările tale în alte scripturi și nu mai pot recupera datele cu $_POST[]. Ciudat!

Fafanellu Fafanellu
28 apr. 2016 20:15:18

am înțeles, era un câmp hidden parazit. Îmi pare foarte rău, greșeala mea. Totuși, nu mai pot accesa datele mele $_POST[]. Când datele erau doar "newFormChange" puteam să le accesez "normal". Acum singura variabilă pe care o pot accesa este $_POST['newFormChange']. Trebuie să o parsez pentru a recupera câmpurile individuale?

Fafanellu Fafanellu
28 apr. 2016 20:31:14

Da, exact! Trebuie să-l analizezi. Pentru a vedea structura datelor pe care le primești, pur și simplu afișează-le. De exemplu, print_r($_POST); și vei vedea cum le poți accesa. Dacă e un șir de interogare, folosește parse_str(). Sper că te ajută :)

Sumit Sumit
28 apr. 2016 21:16:49

Da, mulțumesc din nou! Am cerut ajutor în altă parte pe SE despre acest subiect specific și mi s-a spus să folosesc serializeArray() pentru a putea obține corect parametrii mei $_POST[]. Totuși, încă nu reușesc. Ai vreo sugestie pentru asta? Mulțumesc mult http://wordpress.stackexchange.com/questions/225111/retrieve-post-data-from-ajax-call

Fafanellu Fafanellu
29 apr. 2016 20:31:10

Doamne -- trimiteam action ca proprietate separată, nu în interiorul lui data, Mulțumesc enorm!

plushyObject plushyObject
28 apr. 2017 20:28:37
Arată celelalte 4 comentarii
2

Se pare că există o problemă la url: "/wp-admin/admin-ajax.php", în schimb încearcă să adaugi calea completă:

function addajaxurl() {
    wp_localize_script( 'frontend-ajax', 'frontendajax', array( 'ajaxurl' => admin_url( 'admin-ajax.php' )));
}
add_action( 'wp_enqueue_scripts', 'addajaxurl' );

și apelează variabila în funcția ta ajax:

        jQuery.ajax({
            type:"POST",
            url: ajaxurl,
            data: newFormChange,
            success:function(data){
                console.log(data);
            }
        }); 
28 apr. 2016 18:34:34
Comentarii

mersi, o să testez! dar celelalte apeluri AJAX funcționează, e ciudat...! vezi modificarea mea de mai sus, am aproape același lucru ca tine. În plus, dacă URL-ul .php nu ar fi fost găsit, ar fi returnat o eroare în consolă, nu-i așa?

Fafanellu Fafanellu
28 apr. 2016 18:40:04

Da, se pare că eroarea este legată de action, încearcă să-l elimini

tam tam
28 apr. 2016 18:46:55
0

problema este în parametrul action. În funcția ta de javascript, te rog să încerci:

var newFormChange = jQuery("#term").val();

    jQuery.ajax({
                    type: "POST",
                    url: "/wp-admin/admin-ajax.php",
                    data: {
                        action: "my_test_action",
                        newFormChange: newFormChange
                    }   ,
                    success: function(data) {
                        console.log(data);
                  alert(data);


                });

De asemenea, ar trebui să elimini die(); din funcția ta php. Este deja inclus în wp_send_json.

28 apr. 2016 18:52:51