Admin Ajax returnează 0

27 apr. 2013, 18:02:46
Vizualizări: 119K
Voturi: 45

Sunt relativ nou în jQuery și în special în AJAX. Am o mică problemă cu valoarea returnată care este întotdeauna 0, deși cred că acesta este de fapt mesajul de succes și nu returnează nimic.

Am căutat intens pe Google și am funcția die() în callback-ul PHP și cred că add_actions sunt corecte.

Lucrez pe un host local, deși mă îndoiesc că acest lucru îl afectează și totul este în admin, nu în frontend. Am verificat de asemenea că js-ul este încărcat și localizat.

Primesc un mesaj 200 OK în zona de dezvoltare Chrome.

Am testat și AJAX-ul de bază de la http://codex.wordpress.org/AJAX_in_Plugins și acesta a returnat tot 0, ceea ce mă face să mă întreb dacă este vorba de altceva decât codul prezentat mai jos.

În acest moment încerc doar să fac să trimită ceva înapoi către jQuery. Orice ajutor ar fi apreciat.

jQuery-ul

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

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

            //alertă(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); //arată json în consolă


            });

            return false;

    }); //sfârșitul evenimentului click
}); //sfârșitul doc ready

PHP-ul

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 "fă" . $from_ajax . "ceva";

die();


}
8
Comentarii

Ai verificat dacă ajaxurl este setat corect?

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

Îți arată consola browserului vreo eroare? Dacă da, care sunt acestea?

s_ha_dum s_ha_dum
27 apr. 2013 18:17:52

jQuery('.cl_link_buttons').val('id').click(function() pare ciudat.

fuxia fuxia
27 apr. 2013 18:26:28

Andrew, da, cred că este corect, URL-ul cererii în Chrome Inspector afișează domain/wp-admin/admin-ajax.php

Apina Apina
27 apr. 2013 20:08:37

@s_ha_dum Nu sunt erori afișate

Apina Apina
27 apr. 2013 20:10:30

@toscho Poate că pare ciudat, a fost singura modalitate la care m-am gândit pentru a obține ID-ul elementelor la click, și își face treaba, codul arată de asemenea că are acele date, din nou problema este obținerea unui răspuns de la php.

Apina Apina
27 apr. 2013 20:10:56

Vezi și cum să debughezi AJAX cu HTTP.

fuxia fuxia
27 apr. 2013 21:02:54

Nu este nevoie să folosești return false. Dacă folosești jQuery, utilizează în schimb http://api.jquery.com/event.preventdefault/.

Solomon Closson Solomon Closson
26 oct. 2015 19:08:49
Arată celelalte 3 comentarii
Toate răspunsurile la întrebare 15
2
53

Un răspuns 0 înseamnă fie că acțiunea nu este setată (în datele ajax), fie că funcția de callback a acțiunii nu poate fi găsită.

27 iul. 2013 06:00:18
Comentarii

Da, acesta este răspunsul corect. Tot ce face adăugarea lui die() la sfârșit este să termine scriptul. Acel răspuns este tehnic corect dacă vezi un 0 adăugat la SFÂRȘITUL output-ului, însă dacă tot ce primești este '0', atunci înseamnă că nu s-a returnat nimic și ai o eroare așa cum este descris în acest răspuns.

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

Sau poate nu ai returnat nimic intenționat în PHP-ul care gestionează cererea AJAX. Asigură-te că afișezi ceva, altfel folosește .always pentru a-l captura.

Solomon Closson Solomon Closson
26 oct. 2015 19:12:25
7
33

Ce trebuie să faci este să adaugi die(); la sfârșitul funcției tale.

Vezi motivul și mai multe detalii aici: http://codex.wordpress.org/AJAX_in_Plugins

Note:

  • Ar trebui să folosești echo pentru a afișa ceva înainte de a executa die. Acest lucru va preveni erorile de server și va ajuta la depanare.
27 ian. 2014 22:40:58
Comentarii

Acesta este răspunsul la problema WP AJAX 0.

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

De fapt, dacă doar adaugi die() fără a afișa ceva, acest lucru va genera tot o eroare 500 Internal Server Error și va returna 0 pentru wp-admin/admin-ajax.php. Ar trebui întotdeauna să afișezi ceva, chiar dacă doar setezi valori și nu este nevoie să returnezi nimic. Altfel, dacă nu afișezi nimic și folosești die(), va trebui să utilizezi .always() pentru a captura răspunsul, deoarece acesta nu va fi în .done(), ci în .fail() pentru că se termină fără a returna nimic = Eroare 500.

Solomon Closson Solomon Closson
26 oct. 2015 19:05:14

ai niște link-uri sau cod funcțional, ca să putem arunca o privire? @SolomonClosson

Francisco Corrales Morales Francisco Corrales Morales
26 oct. 2015 19:18:52

Toate răspunsurile mele au fost testate în medii live. Este foarte simplu să testezi asta, doar folosește die(); în funcția ajax din fișierul functions.php fără să afișezi nimic înainte de aceasta, și apelează acțiunea via ajax, de exemplu: 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 oct. 2015 21:33:29

Vei observa că "Failed" va apărea, iar răspunsul va fi o eroare 500 Internal Server Error.

Solomon Closson Solomon Closson
26 oct. 2015 21:38:13

Apoi adaugă un echo în funcția PHP chiar înainte de die();, iar răspunsul va fi atunci rezultatul afișat cu echo.

Solomon Closson Solomon Closson
26 oct. 2015 21:39:06

Am testat acest lucru cu dataType setat la HTML, nu sunt sigur dacă alte tipuri de date returnează ceva diferit, sau ce se întâmplă când nu este setat, deoarece va încerca să ghicească tipul de date. În opinia mea, este mai bine să returnezi întotdeauna ceva, chiar dacă este un șir care spune 'succes' sau 'eșec'.

Solomon Closson Solomon Closson
26 oct. 2015 21:42:21
Arată celelalte 2 comentarii
1

Am avut și eu această problemă și a fost din cauză că foloseam return în loc de echo în funcția mea PHP. Schimbarea la echo a rezolvat problema.

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

Mulțumesc, omule! funcționează pentru mine))

Pavel8289 Pavel8289
17 feb. 2021 18:27:39
3

Așa că am rezolvat problema. Nu a fost vorba de jQuery în sine, deși am îmbunătățit și acel aspect, ci de plasarea funcției de callback. Am mutat-o în fișierul principal al plugin-ului și a funcționat.

28 apr. 2013 19:10:07
Comentarii

poți să arăți cum ai făcut asta?

Francisco Corrales Morales Francisco Corrales Morales
27 ian. 2014 22:39:00

Am aceeași problemă, ai putea să arăți cum ai rezolvat-o?

Jeremy Jeremy
8 mar. 2014 20:31:01

Un alt răspuns este aici: http://wordpress.stackexchange.com/a/131397 @Jeremy

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

Am avut aceeași problemă. Și am rezolvat-o. Trebuie să trimiți variabila "action" ca în exemplu:

var dataString = {lat: '55.56', lng: '25.35', action:'report_callback'};
 $.ajax({                            
        url: "http://domain.net/wp-admin/admin-ajax.php",  
        type: "POST",
        // uneori poți încerca această metodă pentru trimiterea variabilei action
        //action : 'report_callback',
        data:dataString,        
        success: function(data){ 
            console.log(data);

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

Deoarece în wp-admin/admin-ajax.php există un handler pentru variabila action:

if ( empty( $_REQUEST['action'] ) ) {...}
Line 26
11 mai 2014 22:54:26
Comentarii

OP trimite un parametru action. Deși a funcționat pentru tine, nu aceasta a fost problema aici.

s_ha_dum s_ha_dum
11 mai 2014 23:19:07
7

Încearcă să rulezi acest cod în consolă

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

Pot vedea multe probleme în codul tău JavaScript și aceasta ar putea fi motivul.

27 apr. 2013 20:22:22
Comentarii

Ei bine, apare o mulțime de lucruri pe care nu le înțeleg pe deplin. Ceea ce înțeleg: ReadyState 4, status 200, responseText "0".

Și apoi apare răspunsul 0.

Există ceva anume la care ar trebui să fiu atent aici?

Dacă există probleme cu codul, vă rog să le indicați și le pot analiza, încă învăț jQuery.

Apina Apina
27 apr. 2013 20:34:37

ai site-ul tău rulând live?

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

Nu, este pe localhost

Apina Apina
27 apr. 2013 20:36:13

Greu de spus. Poți încerca să rulezi console.info(ajaxurl); și să vezi ce returnează?

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

/wp-admin/admin-ajax.php este răspunsul

editare --

/wp-admin/admin-ajax.php nedefinit

Apina Apina
27 apr. 2013 20:45:34

încearcă să înlocuiești ajaxurl cu 'http://localhost/wp-admin/admin-ajax.php' și vezi ce returnează

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

Nu este o soluție directă, dar acest răspuns este ceva ce cu siguranță ar trebui verificat pentru o soluție la întrebarea inițială

Nirav Zaveri Nirav Zaveri
7 ian. 2016 12:05:07
Arată celelalte 2 comentarii
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("Ne pare rău, a apărut o problemă!");
            },
            complete: function (xhr, status) {
                $('#showresults').slideDown('slow')
            }
            });
     });
}); 

//funcție de cod 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
Comentarii

Doar a posta cod nu este suficient, poți să explici ce face acest fragment de cod?

bravokeyl bravokeyl
22 mar. 2018 06:52:24

important: $date = isset($_POST['date']) ? $_POST['date'] : 0; Și funcția die();

Ngocheng Ngocheng
22 mar. 2018 08:35:06
0

Doar pentru referință, pentru cei care vin din dezvoltarea de shortcode-uri, dacă primiți un răspuns corect prin cererea Ajax din WordPress dar se adaugă un 0 la final, acest lucru se întâmplă doar pentru că folosiți 'echo' în loc de 'return'. Shortcode-urile nu sunt concepute să 'echo' sau să afișeze nimic. Doar un alt scenariu de luat în considerare.

12 mar. 2021 09:24:06
0

Am avut aceeași problemă, pentru a o rezolva am folosit wp_die() la sfârșitul funcției mele, imediat după un echo. Nu uitați să treceți acțiunea în scriptul dumneavoastră.

Pentru a fi sigur, verificați dacă funcția dumneavoastră trebuie să folosească wp_ajax_nopriv la fel ca wp_ajax.

18 iul. 2016 18:53:03
0

Doar ca referință, pentru cei care ajung aici căutând pe Google "cererea ajax returnează 0": Amintiți-vă că atunci când adăugați o acțiune AJAX la o metodă a unui obiect, asigurați-vă că modificatorul de acces al metodei este public.

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

add_action pur și simplu tace dacă nu poate apela metoda dvs. în afara $object.

27 apr. 2017 23:36:01
0

Dacă nu utilizați funcția wp_localize_script() pentru a seta URL-ul AJAX, admin-ajax returnează 0. Cred că este o eroare în WordPress. Iată un exemplu:

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

Fișierul 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 oct. 2017 16:26:56
0

Cei care primesc eroarea 0 :), action => 'action'

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

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

Dacă utilizați localhost și codul PHP al serverului este într-un fișier de plugin, mai întâi conectați-vă la panoul de administrare și reîmprospătați pagina de plugin. În al doilea rând, verificați dacă plugin-ul este activat. Apoi mergeți pe frontend, reîmprospătați pagina și încercați să trimiteți din nou.

2 iun. 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' => __('')
    ));
}
// Acțiunea este: 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 în pagină arată astfel: [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');

//Formularul HTML va fi afișat,
function html_form_code() {
    $html = "";
    $html.= '';
    $html.= '';

    $html.= '        <p>Nume * </p>';
    $html.= '        <p>Prenume * </p>';
    $html.= '        <p>Adresă * </p>';
    $html.= '        <p>Email * </p>';
    $html.= '        <p>Conținut * dg</p>';
    $html.= '        ';

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


    return $html;
}

( function( $ ) {
    $(document).ready(function () {
        // Execută trimiterea formularului prin AJAX
        $('form.ly-form-ex').on('submit', function(e){
            e.preventDefault();
            $('#loading').html('se încarcă...');
            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);
                }

            });
        });
    }); // sfârșit ready
} )( jQuery );

Sper că vă este de folos, Cele mai bune urări

22 mar. 2017 10:34:26
Comentarii

Poate ai vrea să explici de ce :)

kaiser kaiser
22 mar. 2017 11:09:46

Cheia problemei poate fi funcția ob_clean();. Poți încerca și să vezi ce se întâmplă

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

Încearcă să adaugi o instrucțiune if:

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

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


//funcția ta codată


die();
}
23 sept. 2013 04:33:38
Comentarii

Cum ar rezolva asta problema? Observă răspunsul acceptat și codul original.

fuxia fuxia
23 sept. 2013 05:28:28