Admin Ajax está retornando 0

28

Eu sou relativamente novo no jQuery e no AJAX em particular. Eu tenho um pequeno problema com o valor de retorno sempre sendo 0, apesar de achar que essa é realmente a mensagem de sucesso e não está retornando nada.

Examinei o Google-verse e tenho a função die () no retorno de chamada do PHP e acredito que as add_actions estão corretas.

Estou trabalhando em um host local, mas duvido que isso o afete e isso é tudo do administrador, não do front-end. Também verifiquei se o js está na fila e localizado.

Recebo uma mensagem de 200 OK na área de desenvolvedor do Chrome.

Também testei o AJAX básico em http://codex.wordpress.org/AJAX_in_Plugins e ele também retornou 0, o que me faz pensar se é algo diferente do código descrito abaixo.

No momento, estou apenas tentando fazê-lo enviar algo de volta ao jQuery. Qualquer ajuda seria apreciada.

O jQuery

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); //show json in console


            });

            return false;

    }); //end click event
}); //end doc ready

O 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 "do" . $from_ajax . "something";

die();


}
Apina
fonte
1
Você verificou que o ajaxurl está definido corretamente?
precisa
O console do seu navegador mostra algum erro? Se sim, o que são?
precisa saber é o seguinte
2
jQuery('.cl_link_buttons').val('id').click(function()parece estranho.
fuxia
Andrew, sim, eu acredito que é correto, o URL de solicitação em Inspector Chrome está mostrando domínio / wp-admin / admin-ajax.php
Apina
@s_ha_dum Nenhum erro aparecendo
Apina

Respostas:

40

Uma 0resposta significa que a ação não está definida (nos dados ajax) ou que a função de retorno de chamada da ação não pode ser encontrada.

helgatheviking
fonte
2
Sim, esta é a resposta correta. Tudo que adiciona die () ao final faz, termina o script. Essa resposta é tecnicamente correta se você estiver vendo 0 anexado ao END da saída, no entanto, se tudo o que você obtiver for '0', significa que nada foi retornado e você terá um erro, conforme descrito nesta resposta.
Hybrid Web Dev
Ou você não retornou nada de propósito no php que lida com a solicitação do ajax. Certifique-se de ecoar algo, caso contrário, use .alwayspara capturá-lo.
Solomon Closson
20

O que você precisa fazer é adicionar die();no final de sua função.

Veja o motivo e muito mais aqui: http://codex.wordpress.org/AJAX_in_Plugins

Notas:

  • Você deve echoalgo antes de executar die. Isso evitará erros do servidor e ajudará na depuração.
Francisco Corrales Morales
fonte
7
Esta é a resposta para o problema WP AJAX 0.
Ben Racicot 26/03
Na verdade, se você acabou de adicionar die()sem ecoando algo fora, isso vai também dar-lhe um erro 500 Internal Server, e voltar 0para wp-admin/admin-ajax.php. Você sempre deve repetir algo, mesmo que esteja apenas configurando valores e nada seja necessário para retornar. Caso contrário, se você não repetir nada e die()tiver que usá .always()-lo para capturá-lo, ele não estará presente .done(), estará presente .fail()porque morrerá sem nada = 500 Erro.
Solomon Closson
você tem alguns links ou código de trabalho para que possamos dar uma olhada? @SolomonClosson
Francisco Corrales Morales
Todas as minhas respostas foram testadas em ambientes ao vivo. É muito simples testar isso, basta fazer uma die();na função ajax no functions.phparquivo sem repetir nada antes disso e chamar a ação via ajax, por exemplo: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
Você notará que Failed será exibido, a resposta será um erro interno de 500 servidores.
Solomon Closson
2

Então eu resolvi. Não foi o jQuery como tal, embora eu tenha melhorado isso, foi o posicionamento da função de retorno de chamada. Mudei para o arquivo principal do plugin e funcionou.

Apina
fonte
4
você pode mostrar como você fez isso?
Francisco Corrales Morales
1
Estou com o mesmo problema. Você poderia mostrar como corrigiu isso?
Jeremy
Outra resposta está aqui: wordpress.stackexchange.com/a/131397 @Jeremy
Francisco Corrales Morales
2

Eu tenho o mesmo problema. E resolveu. Você deve enviar a variável "action" como no exemplo:

var dataString = {lat: '55.56', lng: '25.35', action:'report_callback'};
 $.ajax({                            
        url: "http://domain.net/wp-admin/admin-ajax.php",  
        type: "POST",
        //some times you cant try this method for sending action variable
        //action : 'report_callback',
        data:dataString,        
        success: function(data){ 
            console.log(data);

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

Como no wp-admin / admin-ajax.php é manipulador da variável de ação:

if ( empty( $_REQUEST['action'] ) ) {...}
Line 26
Mcart
fonte
4
O OP faz enviar um actionparâmetro. Embora isso possa ter funcionado para você, não foi o problema aqui.
S_ha_dum 11/05
1

Tente executar este código no console

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

Posso ver muitas coisas erradas sobre seu código JavaScript e esse pode ser o motivo.

Omar Abid
fonte
Bem, está surgindo muitas coisas que eu não entendo completamente. O que eu entendo: ReadyState 4, status 200, responseText "0". E então surge a resposta 0. Se há algo específico que eu deveria estar procurando aqui? Se houver problemas com o código, aponte-os e posso analisá-los, ainda estou aprendendo o jQuery.
Apina 27/04
você tem seu site em execução ao vivo?
Omar Abid
Não, é localhost
Apina
Difícil de dizer. Você pode tentar executar o console.info (ajaxurl); e ver o que dá?
Omar Abid
1
tente substituir ajaxurl com ' localhost / wp-admin / admin-ajax.php ' e ver o que dá
Omar Abid
1

Eu também tinha esse problema e era o fato de eu estar usando em returnvez da echominha função PHP. Alterando para echocorrigi-lo.

function doAjax() {
    $result = getPosts();
    echo json_encode($result, true);
    die();
}
Seano
fonte
0

Eu tive o mesmo problema, para corrigi-lo, usei wp_die()no final da minha função logo após um echo. Não se esqueça de passar sua ação ao seu script.

Para ter certeza, verifique se sua função deve ser usada wp_ajax_noprivcomo wp_ajax.

Yann J
fonte
0

Apenas para referência, para qualquer um que chegar aqui pesquisando no Google "o pedido ajax está retornando 0": lembre-se de quando você adicionar uma ação ajax ao método do objeto para garantir que o modificador de acesso seja public.

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

add_actionapenas silencia se não puder chamar seu método fora de $object.

Marecky
fonte
0

Se você não usar a função wp_localize_script () para definir o URL do ajax, o admin ajax retornará 0. Eu acho que é um bug do Wordpress. Aqui está um exemplo:

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

O arquivo 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
});
Alain-Aymerick FRANCOIS
fonte
0
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("Sorry, there was a problem!");
            },
            complete: function (xhr, status) {
                $('#showresults').slideDown('slow')
            }
            });
     });
}); 

// função de código 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();
    }
?>
Ngocheng
fonte
Apenas postar código não é bom. Você pode explicar o que esse código faz?
bravokeyl
importante: $ date = isset ($ _ POST ['date'])? $ _POST ['data']: 0; E a função die ();
Ngocheng
0

Quem receber o erro 0 :), action => 'action'

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

$.post(ajaxurl, data, function(response) { alert(response); });
Savaş Hasçelik
fonte
-1
VOCÊ TENTA:

add_action ('init', 'ly_form_ajax_init');


função 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', matriz (
        'ajaxurl' => admin_url ('admin-ajax.php'),
        'redirecturl' => home_url (),
        'loadingmessage' => __ ('')
    ));
}
// A ação é: contact_ajax
add_action ('wp_ajax_contact_ajax', 'minha_função');
add_action ('wp_ajax_nopriv_contact_ajax', 'minha_função');

função minha_função () {
    ob_clean ();
    eco "http://sanvatvungcao.com";
    wp_die ();
}

/ **
 * Código curto em uma página como esta: [ly-form]
 * @param type $ atts
 * @param type $ content
 * @return string
 * /
função ly_form_shortcode ($ atts, $ content = "") {
    eco html_form_code ();
}
add_shortcode ('ly-form', 'ly_form_shortcode');

// O formulário HTML será exibido,
função html_form_code () {
    $ html = "";
    $ html. = '';
    $ html. = '';

    $ html. = '        

Hum *

'; $ html. = '

Tên *

'; $ html. = '

Ỉa chỉ *

'; $ html. = '

O email *

'; $ html. = '

Nội dung * dg

'; $ html. = ''; $ html. = ''; $ html. = ''; $ html. = ''; retornar $ html; } E AQUI js (ly-script.js): (function ($) { $ (document) .ready (function () { // Executar envio do formulário AJAX $ ('form.ly-form-ex'). on ('enviar', função (e) { e.preventDefault (); $ ('# loading'). html ('loading ...'); var dataString = {action: 'contact_ajax'}; $ .ajax ({ tipo: "POST", url: ly_form_ajax_object.ajaxurl, data: dataString, success: function (data) { $ ('# loading'). html (dados); } error: function (errorThrown) { alerta (errorThrown); } }); }); }); // final pronto }) (jQuery);

Espero que seja útil para você, melhor

Ly Van Vu
fonte
Você pode querer explicar o porquê :)
kaiser
A linha inferior aqui pode ser ob_clean (); função. Você pode fazer e experimentar
Ly Van Vu
-2

Tente adicionar uma ifdeclaração:

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

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


//your coded function


die();
}



}// end function
xtianity
fonte
1
Como isso resolveria o problema? Observe a resposta aceita e o código original.
fuxia