Admin Ajax está devolviendo 0

27 abr 2013, 18:02:46
Vistas: 119K
Votos: 45

Soy relativamente nuevo en jQuery y especialmente en AJAX. Tengo un pequeño problema con el valor de retorno que siempre es 0, aunque creo que en realidad este es el mensaje de éxito y no está devolviendo nada.

He buscado exhaustivamente en Google y tengo la función die() en el callback de PHP y creo que los add_actions están correctos.

Estoy trabajando en un localhost, aunque dudo que eso lo afecte y todo esto está en el admin, no en el frontend. También verifiqué que el js está encolado y localizado.

Obtengo un mensaje 200 OK en el área de desarrollador de Chrome.

También probé el AJAX básico de http://codex.wordpress.org/AJAX_in_Plugins y también devolvió 0, lo que me hace pensar si es algo diferente al código que se muestra a continuación.

En este momento solo estoy tratando de hacer que envíe algo de vuelta al jQuery. Cualquier ayuda sería apreciada.

El jQuery

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

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

            //alerta(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); //mostrar json en consola


            });

            return false;

    }); //fin del evento click
}); //fin de doc ready

El 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 "hacer" . $from_ajax . "algo";

die();


}
8
Comentarios

¿Has verificado que ajaxurl esté configurado correctamente?

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

¿Tu consola del navegador muestra algún error? Si es así, ¿cuáles son?

s_ha_dum s_ha_dum
27 abr 2013 18:17:52

jQuery('.cl_link_buttons').val('id').click(function() parece extraño.

fuxia fuxia
27 abr 2013 18:26:28

Andrew, sí, creo que es correcto, la URL de solicitud en Chrome Inspector muestra domain/wp-admin/admin-ajax.php

Apina Apina
27 abr 2013 20:08:37

@s_ha_dum No se muestran errores

Apina Apina
27 abr 2013 20:10:30

@toscho Tal vez se ve raro, era la única forma que se me ocurrió para obtener el ID de los elementos al hacer clic, y cumple su función, el código también muestra que tiene esos datos, nuevamente el problema es obtener una respuesta del php.

Apina Apina
27 abr 2013 20:10:56

Consulta también cómo depurar AJAX con HTTP.

fuxia fuxia
27 abr 2013 21:02:54

No es necesario usar return false. Si estás usando jQuery, utiliza http://api.jquery.com/event.preventdefault/ en su lugar.

Solomon Closson Solomon Closson
26 oct 2015 19:08:49
Mostrar los 3 comentarios restantes
Todas las respuestas a la pregunta 15
2
53

Una respuesta 0 significa que la acción no está configurada (en los datos ajax) o que no se puede encontrar la función de callback de la acción.

27 jul 2013 06:00:18
Comentarios

Sí, esta es la respuesta correcta. Lo único que hace agregar die() al final es terminar el script. Esa respuesta es técnicamente correcta si ves un 0 añadido al FINAL de la salida, sin embargo si solo obtienes '0', significa que no se devolvió nada y tienes un error como se describe en esta respuesta.

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

O simplemente no devolviste nada a propósito en el php que maneja la solicitud ajax. Asegúrate de imprimir algo con echo, de lo contrario, usa .always para capturarlo.

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

Lo que debes hacer es agregar die(); al final de tu función.

Consulta la razón y más información aquí: http://codex.wordpress.org/AJAX_in_Plugins

Notas:

  • Deberías usar echo para mostrar algo antes de ejecutar die. Esto evitará errores del servidor y ayudará en la depuración.
27 ene 2014 22:40:58
Comentarios

Esta es la respuesta al problema WP AJAX 0.

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

En realidad, si solo agregas die() sin imprimir algo, esto también te dará un Error 500 de Servidor Interno, y devolverá 0 para wp-admin/admin-ajax.php. Siempre deberías imprimir algo, incluso si solo estás configurando valores y no necesitas devolver nada. De lo contrario, si no imprimes nada y usas die(), tendrás que usar .always() para capturarlo, porque no estará en .done(), estará en .fail() ya que termina sin nada = Error 500.

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

¿tienes algunos enlaces o código funcional para que podamos echar un vistazo? @SolomonClosson

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

Todas mis respuestas han sido probadas en entornos reales. Es muy simple probar esto, solo coloca un die(); en la función ajax del archivo functions.php sin imprimir nada antes de esto, y llama a la acción via ajax, por ejemplo: 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

Notarás que aparecerá "Failed", la respuesta será un error 500 Internal Server Error.

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

Luego añade un echo a la función PHP justo antes del die();, la respuesta entonces será el resultado impreso.

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

Probé esto con dataType configurado como HTML, no estoy seguro si otros tipos de datos devuelven algo diferente, o qué sucede cuando no está configurado, ya que intentará adivinar el tipo de datos. En mi opinión, es mejor siempre devolver algo, incluso si es una cadena que diga 'éxito' o 'fallo'.

Solomon Closson Solomon Closson
26 oct 2015 21:42:21
Mostrar los 2 comentarios restantes
1

Yo también tuve este problema, y era debido a que estaba usando return en lugar de echo en mi función PHP. Cambiarlo a echo lo solucionó.

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

¡Gracias, hermano! Funciona perfectamente para mí))

Pavel8289 Pavel8289
17 feb 2021 18:27:39
3

Así que lo resolví. No era jQuery como tal, aunque lo he mejorado, sino la ubicación de la función de callback. La moví al archivo principal del plugin y funcionó.

28 abr 2013 19:10:07
Comentarios

¿Puedes mostrar cómo lo hiciste?

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

Estoy teniendo el mismo problema, ¿podrías mostrar cómo lo solucionaste?

Jeremy Jeremy
8 mar 2014 20:31:01

Otra respuesta está aquí: http://wordpress.stackexchange.com/a/131397 @Jeremy

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

Tuve el mismo problema. Y lo solucioné. Debes enviar la variable "action" como en el ejemplo:

var dataString = {lat: '55.56', lng: '25.35', action:'report_callback'};
 $.ajax({                            
        url: "http://domain.net/wp-admin/admin-ajax.php",  
        type: "POST",
        //a veces puedes probar este método para enviar la variable action
        //action : 'report_callback',
        data:dataString,        
        success: function(data){ 
            console.log(data);

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

Porque en wp-admin/admin-ajax.php hay un manejador para la variable action:

if ( empty( $_REQUEST['action'] ) ) {...}
Línea 26
11 may 2014 22:54:26
Comentarios

El OP envía un parámetro action. Si bien esto puede haber funcionado para ti, no era el problema aquí.

s_ha_dum s_ha_dum
11 may 2014 23:19:07
7

Prueba ejecutando este código en la consola

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

Puedo ver varios problemas con tu código JavaScript y esa podría ser la razón.

27 abr 2013 20:22:22
Comentarios

Bueno, está mostrando muchas cosas que no entiendo completamente. Lo que sí entiendo: ReadyState 4, status 200, responseText "0".

Y luego muestra la respuesta 0.

¿Hay algo específico en lo que debería fijarme aquí?

Si hay problemas con el código, por favor indícalos y puedo revisarlos, todavía estoy aprendiendo jQuery.

Apina Apina
27 abr 2013 20:34:37

¿tienes tu sitio funcionando en vivo?

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

No, es localhost

Apina Apina
27 abr 2013 20:36:13

Difícil de decir. ¿Podrías intentar ejecutar console.info(ajaxurl); y ver qué devuelve?

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

/wp-admin/admin-ajax.php es la respuesta

editar --

/wp-admin/admin-ajax.php undefined

Apina Apina
27 abr 2013 20:45:34

prueba reemplazar ajaxurl con 'http://localhost/wp-admin/admin-ajax.php' y mira qué devuelve

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

No es una solución directa, pero esta respuesta es algo que definitivamente se debe verificar para encontrar una solución al OP

Nirav Zaveri Nirav Zaveri
7 ene 2016 12:05:07
Mostrar los 2 comentarios restantes
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("¡Lo siento, hubo un problema!");
            },
            complete: function (xhr, status) {
                $('#showresults').slideDown('slow')
            }
            });
     });
}); 

//función 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();
    }
?>
22 mar 2018 06:01:44
Comentarios

Publicar solo código no es bueno, ¿puedes explicar qué hace este fragmento de código?

bravokeyl bravokeyl
22 mar 2018 06:52:24

importante: $date = isset($_POST['date']) ? $_POST['date'] : 0; Y la función die();

Ngocheng Ngocheng
22 mar 2018 08:35:06
0

Solo como referencia, para aquellos que vienen del desarrollo de shortcodes, si están obteniendo una respuesta adecuada a través de una solicitud Ajax de WordPress pero aparece un 0 añadido al final, es solo porque están usando 'echo' en lugar de 'return'. Los shortcodes nunca deben usar 'echo' o generar salida directamente. Solo otro escenario a tener en cuenta.

12 mar 2021 09:24:06
0

Tuve o mesmo problema, para corrigir usei wp_die() no final da minha função logo após um echo. Não esqueça de passar sua ação no seu script.

Para ter certeza, verifique se sua função precisa usar wp_ajax_nopriv como o wp_ajax.

18 jul 2016 18:53:03
0

Solo como referencia, para cualquiera que llegue aquí buscando en Google "la solicitud ajax está devolviendo 0": Recuerda que cuando agregas una acción ajax a un método de un objeto, debes asegurarte de que el modificador de acceso del método sea public.

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

add_action simplemente silencia si no puede llamar a tu método fuera de $object.

27 abr 2017 23:36:01
0

Si no usas la función wp_localize_script() para establecer la URL de ajax, admin ajax devuelve 0. Creo que es un error de WordPress. Aquí hay un ejemplo:

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

El archivo 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

Para aquellos que obtienen el error 0 :), action => 'action'

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

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

Si estás utilizando localhost y tu código PHP del lado del servidor está en un archivo de plugin, primero inicia sesión en el panel de administración y actualiza la página de plugins. En segundo lugar, verifica si el plugin está activado. Luego, ve al frontend, actualiza la página e intenta enviar de nuevo.

2 jun 2020 06:34:17
2
-1
PRUEBAS:

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' => __('')
    ));
}
// La acción es: 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 en la página como: [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 del formulario que se mostrará,
function html_form_code() {
    $html = "";
    $html.= '';
    $html.= '';

    $html.= '        

Apellidos *

'; $html.= '

Nombre *

'; $html.= '

Dirección *

'; $html.= '

Email *

'; $html.= '

Contenido *

'; $html.= ' '; $html.= ''; $html.= ''; $html.= ''; return $html; } Y AQUÍ el js (ly-script.js): ( function( $ ) { $(document).ready(function () { // Enviar formulario por AJAX $('form.ly-form-ex').on('submit', function(e){ e.preventDefault(); $('#loading').html('cargando...'); 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); } }); }); }); // fin ready } )( jQuery );

Espero que te sea útil, Saludos

22 mar 2017 10:34:26
Comentarios

Quizás quieras explicar el por qué :)

kaiser kaiser
22 mar 2017 11:09:46

El punto clave aquí puede ser la función ob_clean();. Puedes probarlo y ver por ti mismo

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

Intenta agregar una declaración if:

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

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


//tu código de función


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

¿Cómo resolvería eso el problema? Ten en cuenta la respuesta aceptada y el código original.

fuxia fuxia
23 sept 2013 05:28:28