Chiamata AJAX restituisce 0

28 apr 2016, 18:25:48
Visualizzazioni: 13.5K
Voti: 4

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

0
Tutte le risposte alla domanda 3
9

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

28 apr 2016 18:37:08
Commenti

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

Fafanellu Fafanellu
28 apr 2016 18:44:41

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.

Sumit Sumit
28 apr 2016 18:49:35

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?

Fafanellu Fafanellu
28 apr 2016 18:56:06

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.

Sumit Sumit
28 apr 2016 19:56:31

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!

Fafanellu Fafanellu
28 apr 2016 20:15:18

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?

Fafanellu Fafanellu
28 apr 2016 20:31:14

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

Sumit Sumit
28 apr 2016 21:16:49

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

Fafanellu Fafanellu
29 apr 2016 20:31:10

Cavoli -- stavo passando action come sua proprietà separata invece che all'interno di data, Grazie mille!

plushyObject plushyObject
28 apr 2017 20:28:37
Mostra i restanti 4 commenti
2

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);
            }
        }); 
28 apr 2016 18:34:34
Commenti

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?

Fafanellu Fafanellu
28 apr 2016 18:40:04

Sì sembra che l'errore sia con action, prova a rimuoverlo

tam tam
28 apr 2016 18:46:55
0

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.

28 apr 2016 18:52:51