Admin Ajax restituisce 0

27 apr 2013, 18:02:46
Visualizzazioni: 119K
Voti: 45

Sono relativamente nuovo con jQuery e in particolare con AJAX. Ho un piccolo problema con il valore restituito che è sempre 0, anche se penso che questo sia in realtà il messaggio di successo e non stia restituendo nulla.

Ho esplorato l'universo di Google e ho la funzione die() nella callback PHP e credo che gli add_actions siano corretti.

Sto lavorando in localhost, anche se dubito che questo influisca, e tutto questo è nell'admin, non nel frontend. Ho anche verificato che il js sia accodato e localizzato.

Ottengo un messaggio 200 OK nell'area developer di Chrome.

Ho anche testato l'AJAX base da http://codex.wordpress.org/AJAX_in_Plugins e anche questo ha restituito 0, il che mi fa pensare che sia qualcosa di diverso dal codice illustrato di seguito.

Al momento sto solo cercando di far inviare qualcosa indietro a jQuery. Qualsiasi aiuto sarebbe apprezzato.

Il jQuery

jQuery(document).ready(function(){
    jQuery('.cl_link_buttons').val('id').click(function() {

            var currentid = jQuery(this).attr('id');

            //avviso(currentid);
            console.log(currentid);

            jQuery.ajax ( data = {
                action: 'cleanlinks_ajax_get_post_data',
                url: ajaxurl,
                type: 'POST',
                dataType: 'text',
                "currentid" : currentid

            });

            jQuery.post(ajaxurl, data, function(response) {

                var dataz = response;
                alert( dataz );
                console.log (dataz); //mostra json nella console


            });

            return false;

    }); //fine evento click
}); //fine doc ready

Il PHP

add_action("wp_ajax_cleanlinks_ajax_get_post_data", "cleanlinks_ajax_get_post_data");
add_action("wp_ajax_nopriv_cleanlinks_ajax_get_post_data", "cleanlinks_ajax_get_post_data");

function cleanlinks_ajax_get_post_data() {

$from_ajax =  $_POST['currentid'];

echo "fai" . $from_ajax . "qualcosa";

die();


}
8
Commenti

Hai verificato che ajaxurl sia configurato correttamente?

Andrew Bartel Andrew Bartel
27 apr 2013 18:14:31

La console del tuo browser mostra errori? Se sì, quali sono?

s_ha_dum s_ha_dum
27 apr 2013 18:17:52

jQuery('.cl_link_buttons').val('id').click(function() sembra strano.

fuxia fuxia
27 apr 2013 18:26:28

Andrew, sì credo sia corretto, l'URL della richiesta in Chrome Inspector mostra domain/wp-admin/admin-ajax.php

Apina Apina
27 apr 2013 20:08:37

@s_ha_dum Nessun errore visibile

Apina Apina
27 apr 2013 20:10:30

@toscho Forse sembra strano, era l'unico modo a cui ho pensato per ottenere l'ID degli elementi al click, e funziona, il codice mostra anche che ha quei dati, il problema è ottenere una risposta dal php.

Apina Apina
27 apr 2013 20:10:56

Vedi anche come eseguire il debug di AJAX con HTTP.

fuxia fuxia
27 apr 2013 21:02:54

Non c'è bisogno di usare return false. Se stai utilizzando jQuery, usa invece http://api.jquery.com/event.preventdefault/.

Solomon Closson Solomon Closson
26 ott 2015 19:08:49
Mostra i restanti 3 commenti
Tutte le risposte alla domanda 15
2
53

Una risposta 0 significa che l'azione non è impostata (nei dati ajax) o che la funzione di callback dell'azione non può essere trovata.

27 lug 2013 06:00:18
Commenti

Sì, questa è la risposta corretta. Aggiungere die() alla fine serve solo a terminare lo script. Quella risposta è tecnicamente corretta se vedi uno 0 aggiunto alla FINE dell'output, tuttavia se ottieni solo '0', significa che non è stato restituito nulla e hai un errore come descritto in questa risposta.

Hybrid Web Dev Hybrid Web Dev
11 mag 2014 23:26:13

Oppure hai semplicemente restituito nulla di proposito nel php che gestisce la richiesta ajax. Assicurati di stampare qualcosa, altrimenti usa .always per catturarlo.

Solomon Closson Solomon Closson
26 ott 2015 19:12:25
7
33

Quello che devi fare è aggiungere die(); alla fine della tua funzione.

Vedi il motivo e altro qui: http://codex.wordpress.org/AJAX_in_Plugins

Note:

  • Dovresti usare echo per stampare qualcosa prima di eseguire die. Questo previene errori del server e aiuta durante il debug.
27 gen 2014 22:40:58
Commenti

Questa è la soluzione al problema WP AJAX 0.

Ben Racicot Ben Racicot
26 mar 2014 17:59:31

In realtà, se aggiungi semplicemente die() senza stampare qualcosa, otterrai comunque un Errore 500 Internal Server e restituirà 0 per wp-admin/admin-ajax.php. Dovresti sempre stampare qualcosa, anche se stai solo impostando valori e non è necessario restituire nulla. Altrimenti, se non stampi nulla e usi die(), devi usare .always() per catturarlo, perché non sarà in .done(), ma in .fail() poiché termina senza alcun output = Errore 500.

Solomon Closson Solomon Closson
26 ott 2015 19:05:14

hai qualche link o codice funzionante, così possiamo dare un'occhiata? @SolomonClosson

Francisco Corrales Morales Francisco Corrales Morales
26 ott 2015 19:18:52

Tutte le mie risposte sono state testate in ambienti live. È molto semplice testare questo, basta fare un die(); nella funzione ajax nel file functions.php senza fare echo di niente prima, e chiamare l'action via ajax, ad esempio: var testing = $.ajax( ... ); testing.fail(function(response) { console.log('Failed ' + response); }); testing.done(function(response) { console.log('Success ' + response); }); testing.always(function(response) { console.log('Ajax Request complete: ' + response); });

Solomon Closson Solomon Closson
26 ott 2015 21:33:29

Noterai che apparirà Failed, la risposta sarà un errore 500 Internal Server Error.

Solomon Closson Solomon Closson
26 ott 2015 21:38:13

Poi aggiungi un echo alla funzione PHP appena prima del die();, la risposta sarà quindi il risultato dell'echo.

Solomon Closson Solomon Closson
26 ott 2015 21:39:06

Ho testato questo con dataType impostato su HTML, non sono sicuro se altri tipi di dati restituiscano qualcosa di diverso, o cosa succede quando non è impostato, poiché proverà a fare una supposizione ragionevole sul tipo di dati. IMO, è meglio restituire sempre qualcosa, anche se è una stringa che dice 'successo' o 'fallimento'.

Solomon Closson Solomon Closson
26 ott 2015 21:42:21
Mostra i restanti 2 commenti
1

Anch'io ho avuto questo problema, ed era dovuto al fatto che stavo usando return invece di echo nella mia funzione PHP. Cambiandolo in echo ho risolto.

function doAjax() {
    $result = getPosts();
    echo json_encode($result, true);
    die();
}
29 mar 2016 22:07:36
Commenti

Grazie, amico! Funziona per me))

Pavel8289 Pavel8289
17 feb 2021 18:27:39
3

Alla fine ho risolto. Non era tanto il jQuery in sé, anche se ho migliorato anche quello, quanto il posizionamento della funzione di callback. L'ho spostata nel file principale del plugin e ha funzionato.

28 apr 2013 19:10:07
Commenti

puoi mostrare come l'hai fatto?

Francisco Corrales Morales Francisco Corrales Morales
27 gen 2014 22:39:00

Sto avendo lo stesso problema, potresti mostrare come l'hai risolto?

Jeremy Jeremy
8 mar 2014 20:31:01

Un'altra risposta è qui: http://wordpress.stackexchange.com/a/131397 @Jeremy

Francisco Corrales Morales Francisco Corrales Morales
26 mar 2014 18:22:55
1

Ho avuto lo stesso problema. E l'ho risolto. Devi inviare la variabile "action" come nell'esempio:

var dataString = {lat: '55.56', lng: '25.35', action:'report_callback'};
 $.ajax({                            
        url: "http://domain.net/wp-admin/admin-ajax.php",  
        type: "POST",
        //a volte puoi provare questo metodo per inviare la variabile action
        //action : 'report_callback',
        data:dataString,        
        success: function(data){ 
            console.log(data);

            },
        error: function() {
            console.log("Error");            
        }
    });

Perché in wp-admin/admin-ajax.php c'è un gestore per la variabile action:

if ( empty( $_REQUEST['action'] ) ) {...}
Linea 26
11 mag 2014 22:54:26
Commenti

L'OP invia effettivamente un parametro action. Anche se questo potrebbe aver funzionato nel tuo caso, non era il problema qui.

s_ha_dum s_ha_dum
11 mag 2014 23:19:07
7

Prova a eseguire questo codice nella console

jQuery.post(ajaxurl, {action:'cleanlinks_ajax_get_post_data'}, function(response) {
     console.log (response);
});

Posso vedere molte cose sbagliate nel tuo codice JavaScript e potrebbe essere questo il motivo.

27 apr 2013 20:22:22
Commenti

Beh, sta mostrando un sacco di cose che non capisco del tutto. Quello che capisco: ReadyState 4, status 200, responseText "0".

E poi restituisce la risposta 0.

C'è qualcosa in particolare che dovrei cercare qui?

Se ci sono problemi con il codice, per favore indicameli e posso esaminarli, sto ancora imparando jQuery.

Apina Apina
27 apr 2013 20:34:37

hai il tuo sito online?

Omar Abid Omar Abid
27 apr 2013 20:35:46

No, è in localhost

Apina Apina
27 apr 2013 20:36:13

Difficile da dire. Potresti provare a eseguire console.info(ajaxurl); e vedere cosa restituisce?

Omar Abid Omar Abid
27 apr 2013 20:37:08

/wp-admin/admin-ajax.php è la risposta

modifica --

/wp-admin/admin-ajax.php undefined

Apina Apina
27 apr 2013 20:45:34

prova a sostituire ajaxurl con 'http://localhost/wp-admin/admin-ajax.php' e vedi cosa restituisce

Omar Abid Omar Abid
27 apr 2013 21:57:39

Non è una soluzione diretta, ma questa risposta è qualcosa che si dovrebbe assolutamente verificare per trovare una soluzione al problema originale

Nirav Zaveri Nirav Zaveri
7 gen 2016 12:05:07
Mostra i restanti 2 commenti
2
jQuery(document).ready(function(){
    jQuery('.cl_link_buttons').val('id').click(function() {
       $.ajax({
            type:'POST',
            url: ajaxurl,
            data: {
                action : 'ajax_filter',
                currentid : 'currentid'
            },
            success: function (result) {
                console.log(result);
                $result = $(result);
                        $result.fadeIn('7000');
                        $("#showresults").html(result);

            },
            error: function (xhr, status) {
                alert("Spiacenti, si è verificato un problema!");
            },
            complete: function (xhr, status) {
                $('#showresults').slideDown('slow')
            }
            });
     });
}); 

//funzione PHP

<?php
    add_action( 'wp_ajax_nopriv_ajax_filter', 'ajax_filter' );
    add_action( 'wp_ajax_ajax_filter', 'ajax_filter' );
    function ajax_filter(){
        $date = isset($_POST['date']) ? $_POST['date'] : 0;
        echo $date;
        die();
    }
?>
22 mar 2018 06:01:44
Commenti

Postare solo il codice non è sufficiente, potresti per favore spiegare cosa fa questo pezzo di codice?

bravokeyl bravokeyl
22 mar 2018 06:52:24

importante: $date = isset($_POST['date']) ? $_POST['date'] : 0; E la funzione die();

Ngocheng Ngocheng
22 mar 2018 08:35:06
0

Solo per riferimento, per chi viene dallo sviluppo di shortcode, se stai ricevendo una risposta corretta tramite una richiesta Ajax di WordPress ma viene aggiunto uno 0, è solo perché stai usando 'echo' invece di 'return'. Gli shortcode non sono mai pensati per fare 'echo' o output diretto. Solo un altro scenario da tenere a mente.

12 mar 2021 09:24:06
0

Ho avuto lo stesso problema, per risolverlo ho usato wp_die() alla fine della mia funzione subito dopo un echo. Non dimenticare di passare la tua azione nello script.

Per essere sicuro, verifica se la tua funzione deve usare wp_ajax_nopriv come wp_ajax.

18 lug 2016 18:53:03
0

Solo per riferimento, per chiunque arrivi qui cercando su Google "la richiesta ajax restituisce 0": Ricorda che quando aggiungi un'azione ajax al metodo di un oggetto, assicurati che il modificatore di accesso del metodo sia public.

add_action( 'wp_ajax_my_action', [$object, 'my_method']);

add_action semplicemente non restituisce alcun errore se non riesce a chiamare il tuo metodo al di fuori di $object.

27 apr 2017 23:36:01
0

Se non utilizzi la funzione wp_localize_script() per impostare l'URL ajax, admin ajax restituisce 0. Penso sia un bug di WordPress. Ecco un esempio:

    wp_enqueue_script( 'search_js', get_template_directory_uri() . '/js/search.js', array( 'jquery' ), null, true );    
    wp_localize_script( 'search_js', 'ajaxurl', admin_url( 'admin-ajax.php' ) );

Il file javascript (search.js):

    $('#search_input').autocomplete({
    source: function(request, response) {

        $.ajax({
            type: 'POST',
            dataType: 'json',
            url: ajaxurl,
            data: 'action=my_custom_action_search&search_criteria=' + request.term,
            success: function(data) {
                response(data);
            },
            error: function(errorThrown){
                console.log(errorThrown);
            } 
        });
    },
    minLength: 3
});
17 ott 2017 16:26:56
0

Coloro che ricevono l'errore 0 :), action => 'action'

var data = { 'action': 'firmabilgilerikaydet', 'data': form_data };

$.post(ajaxurl, data, function(response) { alert(response); });
10 nov 2019 21:59:08
0

Se stai utilizzando localhost e il tuo codice PHP lato server si trova in un file di plugin, accedi prima alla dashboard di amministrazione e aggiorna la pagina dei plugin. In secondo luogo, verifica se il plugin è attivato. Quindi vai sul frontend, aggiorna la pagina e prova a inviare nuovamente.

2 giu 2020 06:34:17
2
-1

add_action('init', 'ly_form_ajax_init');


function ly_form_ajax_init() {
    wp_register_script('ly-form-ajax-script', plugins_url().'/ly-form/js/ly-script.js' , array('jquery'));
    wp_enqueue_script('ly-form-ajax-script');

    wp_localize_script('ly-form-ajax-script', 'ly_form_ajax_object', array(
        'ajaxurl' => admin_url('admin-ajax.php'),
        'redirecturl' => home_url(),
        'loadingmessage' => __('')
    ));
}
// L'azione è: contact_ajax
add_action( 'wp_ajax_contact_ajax', 'my_function' );
add_action( 'wp_ajax_nopriv_contact_ajax', 'my_function' );

function my_function(){
    ob_clean();
    echo "http://sanvatvungcao.com";
    wp_die();
}

/**
 * Shortcode nella pagina come questo: [ly-form]
 * @param type $atts
 * @param type $content
 * @return string
 */
function ly_form_shortcode($atts, $content = "") {
    echo html_form_code();
}
add_shortcode('ly-form', 'ly_form_shortcode');

//HTML Form verrà mostrato,
function html_form_code() {
    $html = "";
    $html.= '';
    $html.= '';

    $html.= '        <p>Cognome * </p>';
    $html.= '        <p>Nome * </p>';
    $html.= '        <p>Indirizzo * </p>';
    $html.= '        <p>Email * </p>';
    $html.= '        <p>Contenuto * </p>';
    $html.= '        ';

    $html.=  '';
    $html.= '';
    $html.= '';


    return $html;
}

E QUI il js (ly-script.js):
( function( $ ) {
    $(document).ready(function () {
        // Esegui l'invio del form via AJAX
        $('form.ly-form-ex').on('submit', function(e){
            e.preventDefault();
            $('#loading').html('caricamento...');
            var dataString = {action:'contact_ajax'};
            $.ajax({
                type: "POST",
                url: ly_form_ajax_object.ajaxurl,
                data: dataString,
                success: function (data) {
                    $('#loading').html(data);
                },
                error: function (errorThrown) {
                    alert(errorThrown);
                }

            });
        });
    }); // fine ready
} )( jQuery );

Spero sia utile per te, I migliori saluti

22 mar 2017 10:34:26
Commenti

Potresti voler spiegare il perché :)

kaiser kaiser
22 mar 2017 11:09:46

La conclusione qui potrebbe essere la funzione ob_clean();. Puoi fare e sperimentare

Ly Van Vu Ly Van Vu
24 mar 2017 06:20:43
1
-2

Prova ad aggiungere un'istruzione if:

function my_function(){
$id = $_POST['variation_id'];

    if(isset($_POST['variation_id'])) { 


//il tuo codice della funzione


die();
}
23 set 2013 04:33:38
Commenti

Come risolverebbe questo il problema? Nota la risposta accettata e il codice originale.

fuxia fuxia
23 set 2013 05:28:28