web-dev-qa-db-fra.com

L'ajout d'une fonction de rappel pour wp_ajax_ n'a aucun effet

J'essayais d'ajouter une fonction de rappel supplémentaire à l'action WordPress AJAX _ woocommerce_apply_coupon.

Cette action est définie dans le plugin WooCommerce. Je souhaite ajouter ma propre fonction de rappel à cette action à partir de mon fichier de plugin.

Ce que j'ai essayé

add_action( 'wp_ajax_nopriv_woocommerce_apply_coupon','darn',999);
add_action( 'wp_ajax_woocommerce_apply_coupon', 'darn',999);

function darn(){
         print_r($_REQUEST);
         exit;
    }

Faire cela dans mon functions.php ne montre même pas d'erreur, car je ne vois aucun effet de ce code.

Je veux savoir si c'est même possible à réaliser. Je vous remercie.

2
codepixlabs

Oui. C'est possible et vous êtes sur la bonne voie! :)

Les appels AJAX ont lieu "dans les coulisses" et aucune sortie d'écran n'est générée pendant le processus, peu importe ce que vous echo ou print_r - c'est pourquoi vous ne voyez rien revenir à vous - cette réponse du serveur est capturée par javascript et y est traitée.

Cela vous donne deux options de base pour le débogage de vos actions AJAX:

1) Vous pouvez utiliser error_log() dans vos actions AJAX pour écrire le résultat dans le fichier WP_DEBUG_LOG et vérifier les résultats à cet endroit:

function darn(){
     error_log( print_r($_POST, 1) );
     exit;
}

Pour plus de détails, voir Codex: Debugging_in_WordPress - WP_DEBUG_LOG

Astuce n ° 1: Lancez une console de terminal et utilisez tail -f debug.log pour un flux en direct de débogage awesomness;)

Astuce n ° 2: utilisez tail -f debug.log | grep -v 'bad-plugin' pour filtrer trop de problèmes de débogage des auteurs de plugins qui n'utilisent pas WP_DEBUG_LOG; P

2) Utilisez la fonction console.log() de javascript pour vérifier la réponse directement dans votre navigateur:

Envoyer une réponse à partir de l'action AJAX ...

function darn(){
    echo 'darn!'
    exit;
}

... et recevez-le avec JS:

$.post(ajaxurl, data, function(response) {
    // Response will be 'darn!'
    if( typeof(console) == 'object' ) console.log( response );
});

Astuce n ° 3: au lieu de simplement répercuter la réponse comme ci-dessus, vous pouvez utiliser wp_send_json () pour générer une réponse au format JSON ou WP_Ajax_Response pour une classe XML. Pratique pour les réponses plus complexes et/ou le traitement des erreurs!

Astuce n ° 4: Faites-moi savoir dans les commentaires si quelque chose reste incertain: D

Bienvenue et passez un bon moment sur WPSE!

4
Michal Mau

Si un autre code de gestionnaire est connecté en premier et qu'il appelle également exit(), le script se termine et le code ne s'exécute jamais.

Vérifiez l'autre gestionnaire.

1
Otto