web-dev-qa-db-fra.com

Admin-ajax.php est en train de mourir "0" sans fonction de traitement

J'essaie d'apprendre à traiter correctement les demandes de AJAX dans Wordpress. Pour ce faire, je suis en train d'adapter ce tutoriel pour créer une demande super simple AJAX permettant de placer l'identifiant d'un message (à partir d'un lien). ) dans le contenu de ma page.

La logique

  1. Lorsque les liens #our-work a sont cliqués [js]
  2. Obtenez l'ID de publication (à partir de l'attribut data-id) et stockez-le sous la forme d'une variable postID [js]
  3. Passez postID via un AJAX (en utilisant le fichier admin-ajax.php du WP) [js]
  4. La fonction example_ajax_request récupérera l’ID et l’échangera simplement [php]
  5. En cas de succès, ajoutez la réponse du serveur à #hero div.

Je me rends compte que cela n’a aucun avantage, mais une fois que j’aurai fonctionné, je modifierai la fonction pour qu’elle serve réellement.

Mon code

Voici une copie de la fonction que j'ai créée dans le dossier plugins:

wp_enqueue_script( 'my-ajax-request', plugin_dir_url( __FILE__ ) . 'acl-plugin.js', array( 'jquery' ) );

wp_localize_script( 'my-ajax-request', 'MyAjax', array( 'ajaxurl' => admin_url( 'admin-ajax.php' ) ) );

function example_ajax_request() {
    if ( isset($_REQUEST) ) {
        $postID = $_REQUEST['postID'];
        echo $postID;
    }
    die();
}
add_action( 'wp_ajax_nopriv_example_ajax_request', 'example_ajax_request' );

Et voici une copie du fichier JS

jQuery(document).ready(function($) {
    $('#our-work a').click( function() {
        var postID = $(this).attr("data-id");

        $.ajax({
            url: MyAjax.ajaxurl,
            data: {
                'action':'example_ajax_request',
                'postID' : postID
            },
            success:function(data) {
                $('#hero').append( "Well this seems to work" + data );
            },
            error: function(errorThrown){
                console.log("This has thrown an error:" + errorThrown);
            }
        });
        return false;
    });
});

le problème

En cliquant sur le lien, le JS se déclenche mais génère la réponse suivante:

<div id="hero">
    Well this seems to work 0
</div>

Utilisation d'une alerte Je sais que l'ID est collecté avant la demande AJAX. Donc, le problème est dans ma fonction. Pour en savoir plus, j'ai modifié (temporairement) le fichier admin-ajax.php de WP afin de pouvoir déterminer quelle die(); produisait la réponse "0".

C’est le tout dernier dans le fichier que je pensais ne pas déclencher car j’ai une commande die(); dans ma propre fonction. Quelqu'un peut-il s'il vous plaît indiquer où je vais mal?

1
Sheixt

C’est l’une des rares fois où je peux dire fièrement… il n’ya pas de problème ici!

La raison pour laquelle le serveur retourne avec 0 est parce que j'étais connecté! Le wp_ajax_nopriv_example_ajax_request est uniquement destiné aux utilisateurs qui ne sont pas connectés. Après la déconnexion, cela fonctionne correctement.

Donc, si vous cherchez à faire la même chose, assurez-vous simplement que vous avez les deux actions sous la fonction:

add_action( 'wp_ajax_example_ajax_request', 'example_ajax_request' );
add_action( 'wp_ajax_nopriv_example_ajax_request', 'example_ajax_request' );
3
Sheixt

Une autre chose intéressante à noter est que Wordpress a son propre die () appelé wp_die (). J'obtenais ce 0 à la fin de mes AJAX appels jusqu'à ce que je le trouve également.

echo(json_encode($return));
wp_die();

Il y a aussi wp_send_json_success et wp_send_json_error . Toutes ces réponses renvoient ce à quoi vous vous attendez sans le 0 final.

wp_send_json_success($data);

sera retourné comme json avec un élément de données

success: function(trn) {
    console.log(trn.data)
}
0
Mark Cicchetti

Utilisez wp_die(); au lieu de die(); dans la fonction.

add_action( 'wp_ajax_nopriv_example_ajax_request', 'example_ajax_request' );
add_action( 'wp_ajax_example_ajax_request', 'example_ajax_request' );
function example_ajax_request() {

    // Your code goes here.        

    wp_die();
}
0
Yuvraj Khavad