web-dev-qa-db-fra.com

Admin demande ajax retour avec die ()

J'utilise donc cette configuration pour un appel AJAX dans la zone administrative ( comme ceci ):

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) {
                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 }

add_action('wp_ajax_my_action', 'my_action_callback');

function my_action_callback() {
    echo 'attivato';
    die();
}

C'est juste un code de test, mais il retourne toujours 0 au lieu de la chaîne "attivato". Il trouve également l'URL ajax correctement, sans erreur 404.
Quel est le problème?

10
Ivano Mercuri

Ajoutez également ceci: add_action('wp_ajax_nopriv_my_action', 'my_action_callback');. Notez la nopriv.

Cela résoudra votre problème!

21
Rutwick Gangurde

J'ai eu le même problème. Solution:

add_action('wp_ajax_nopriv_my_action', 'my_action_callback');
add_action('wp_ajax_my_action', 'my_action_callback');

Si vous n’ajoutez pas les deux (avec et sans nopriv), cela fonctionnera en mode connecté ou en mode déconnecté uniquement. nopriv est pour déconnecté, l'autre est pour connecté.

15
Paul

Je ne suis pas sûr que ce soit votre problème, mais je recevais une réponse de "0" et il m'a fallu le plus longtemps pour le comprendre. En plus de vous assurer de mettre exit ou die à la fin de votre fonction php, j'ai découvert qu'il fallait mettre votre bit add_action('wp_ajax_... au niveau supérieur de votre plugin. Je l'avais imbriqué dans mon crochet admin_menu, ce qui ne fonctionnait pas. Je ne sais pas si votre code ci-dessus fait partie d'une inclusion dans une fonction de votre fichier php de plugin de niveau supérieur (comme le mien l'était).

4
Jeff