La solicitud de admin-ajax devuelve 0 con die()
Entonces estoy usando esta configuración para una llamada AJAX en el área administrativa (como esta):
add_action( 'admin_head', 'ajaxPerNgg' );
function ajaxPerNgg(){ ?>
<script type="text/javascript" >
jQuery(document).ready(function() {
jQuery("#message").remove();
jQuery("#errore a#attivo").click(
function(){
var data = {
action: 'my_action'
};
jQuery.post(ajaxurl, data, function(response) {
// Si la respuesta es "activado"
if(response == "attivato")
jQuery("#errore a#inattivo").attr("id","completato").html("Attivato");
else
jQuery("#errore a#inattivo").attr("id","attivo").html("Attivalo ora");
});
}
);
});
</script>
<?php }
// Agregar acción para el callback de ajax
add_action('wp_ajax_my_action', 'my_action_callback');
function my_action_callback() {
echo 'attivato';
die();
}
Es solo un código de prueba, pero siempre devuelve 0 en lugar de la cadena "attivato". También encuentra la url de ajax correctamente, sin un error 404.
¿Cuál es el problema?
Solucioné esto asegurándome de que el sufijo de "wp_ajax_SUFFIX" coincidiera con la acción, de modo que la acción en el post de jQuery también fuera "SUFFIX". Sin embargo, no necesité usar nopriv... No estoy seguro si esta es la solución al problema del OP, ya que esta es una acción que ocurre en la página de administración, lo que básicamente significa que estás conectado, lo que sugiere que no necesitas registrar un manejador nopriv...

Tenía el mismo problema. Solución:
add_action('wp_ajax_nopriv_my_action', 'my_action_callback');
add_action('wp_ajax_my_action', 'my_action_callback');
Si no agregas ambos (con y sin nopriv) solo funcionará en modo conectado o modo desconectado. nopriv es para usuarios desconectados, el otro es para usuarios conectados.

No estoy seguro si este es tu problema, pero yo estaba recibiendo una respuesta de solo "0" y me tomó mucho tiempo descubrir la causa. Además de asegurarte de poner exit
o die
al final de tu función PHP, descubrí que tienes que colocar tu add_action('wp_ajax_...
en el nivel superior de tu plugin. Yo lo tenía anidado dentro de mi hook admin_menu
, lo cual no funcionaba. No estoy seguro si tu código anterior es parte de un include dentro de una función desde tu archivo PHP principal del plugin (como era mi caso).
