Admin Ajax está devolviendo 0
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();
}
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
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
echopara mostrar algo antes de ejecutardie. Esto evitará errores del servidor y ayudará en la depuración.
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
¿tienes algunos enlaces o código funcional para que podamos echar un vistazo? @SolomonClosson
Francisco Corrales Morales
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
Notarás que aparecerá "Failed", la respuesta será un error 500 Internal Server Error.
Solomon Closson
Luego añade un echo a la función PHP justo antes del die();, la respuesta entonces será el resultado impreso.
Solomon Closson
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
Otra respuesta está aquí: http://wordpress.stackexchange.com/a/131397 @Jeremy
Francisco Corrales Morales
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
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
Difícil de decir. ¿Podrías intentar ejecutar console.info(ajaxurl); y ver qué devuelve?
Omar Abid
/wp-admin/admin-ajax.php es la respuesta
editar --
/wp-admin/admin-ajax.php undefined
Apina
prueba reemplazar ajaxurl con 'http://localhost/wp-admin/admin-ajax.php' y mira qué devuelve
Omar Abid
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();
}
?>
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.
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.
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.
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
});
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.
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