Apel AJAX returnează 0
Î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
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

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

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 Ajax
că action
nu este o cheie validă.

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?

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.

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!

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?

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

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

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

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?

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.
