Chiamata AJAX restituisce 0
Nonostante molti post simili, nessuna delle soluzioni proposte ha funzionato per me, quindi eccoci qui.
Ho il seguente 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;
}
E il codice PHP è questo:
function my_test_action() {
$var = "questo è 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' );
Ho anche provato: echo json_encode($var)
o echo $var
, invece di wp_send_json()
ma la funzione restituisce sempre 0 nella console del browser!
Le mie altre chiamate AJAX funzionano, ad esempio ne ho un'altra che chiama uno script PHP che esegue una WP Query e mostra alcuni post, e funziona bene.
MODIFICA: Ecco come includo il mio script:
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');
Penso che il problema venga dalla variabile newFormChange
, perché jQuery(this).serialize();
non ha funzionato inizialmente, poiché il form non viene inviato ma cambia solo uno dei suoi campi. Quindi l'ho sostituita con var newFormChange = jQuery("#term").val();
ma forse c'è un problema con url: "/wp-admin/admin-ajax.php"
Dove sto sbagliando? Grazie
Nota che l'action
deve essere all'interno della chiave data
. Nella tua richiesta POST non c'è una chiave chiamata action
, quindi la funzione di callback non viene mai chiamata.
Considera questo esempio:
jQuery.ajax({
type:"POST",
url: "/wp-admin/admin-ajax.php",
data: {
action: "my_test_action",
form_data : newFormChange
},
success: function (data) {
console.log(data);
}
});
Nota anche: Non utilizzare mai URL AJAX relativi come /wp-admin/admin-ajax.php
. Puoi usare wp_localize_script()
. Vedi questi esempi

ben fatto, funziona! ma è strano, ho un altro script dove l'action è all'esterno, eppure funziona lo stesso!

Prego :) No, devi ricontrollare. action
è una cosa specifica di WordPress, e il resto dei parametri appartiene a jQuery. Puoi vedere qui jQuery Ajax
che action
non è una chiave valida.

se scrivo alert(newFormChange) vedo qualcosa come "term=anything&action=my_test_action". Quindi, l'"action" fatta da WP viene passata come un'altra variabile POST? Ho un'altra domanda extra: se uso $_POST['term'] in my_test_action(), non viene riconosciuto. Anche se è il modo corretto per recuperare le variabili POST con questo metodo. Dove sbaglio?

Non sono sicuro dove hai posizionato l'alert! Ma se vedi term=anything&action=my_test_action
nell'alert, si tratta di una richiesta GET. Quindi sarai in grado di accedere alla variabile usando $_GET
invece di $_POST
, ma mi chiedo davvero perché vedi una query string invece di un oggetto js.

Ho chiamato il metodo serialize() su newFormChange e poi ho posizionato l'alert subito dopo. La cosa strana è che mostra quanto scritto sopra, anche se action è definito all'interno dei dati. Ho applicato le tue raccomandazioni sugli altri miei script e ora non riesco più a recuperare i dati con $_POST[]. Strano!

Ho capito, era un campo nascosto parassita. Mi dispiace molto, è stato un mio errore. Tuttavia, non riesco più ad accedere ai miei dati $_POST[]. Quando i dati erano solo "newFormChange" potevo accedervi "normalmente". Ora l'unica variabile a cui posso accedere è $_POST['newFormChange']. Devo analizzarla per recuperare i singoli campi?

Esatto! Devi analizzarlo. Per vedere la struttura dei dati che stai ricevendo, stampali semplicemente. Ad esempio print_r($_POST);
e vedrai come puoi accedervi. Se si tratta di una stringa di query, usa parse_str(). Spero ti aiuti :)

Mi hai aiutato, grazie ancora! Stavo chiedendo aiuto altrove su SE riguardo a questo argomento specifico e mi è stato detto di usare serializeArray() per poter ottenere correttamente i miei parametri $_POST[]. Tuttavia, non ci riesco ancora. Hai qualche consiglio su questo? Grazie mille http://wordpress.stackexchange.com/questions/225111/retrieve-post-data-from-ajax-call

Sembra esserci un problema con url: "/wp-admin/admin-ajax.php"
, prova invece ad aggiungere il percorso completo:
function addajaxurl() {
wp_localize_script( 'frontend-ajax', 'frontendajax', array( 'ajaxurl' => admin_url( 'admin-ajax.php' )));
}
add_action( 'wp_enqueue_scripts', 'addajaxurl' );
e chiama la variabile nella tua funzione ajax:
jQuery.ajax({
type:"POST",
url: ajaxurl,
data: newFormChange,
success:function(data){
console.log(data);
}
});

grazie lo testerò! ma le mie altre chiamate AJAX funzionano, è strano...! vedi la mia modifica sopra, ho quasi la stessa cosa che hai tu. Inoltre, se l'URL .php non fosse stato trovato, avrebbe restituito un errore nella console, giusto?

il problema è nel parametro action. Nella tua funzione javascript prova con:
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);
});
Dovresti anche rimuovere die(); dalla tua funzione php. È già incluso in wp_send_json.
