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
#our-work a
sont cliqués [js] data-id
) et stockez-le sous la forme d'une variable postID
[js] postID
via un AJAX (en utilisant le fichier admin-ajax.php
du WP) [js] example_ajax_request
récupérera l’ID et l’échangera simplement [php] #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?
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' );
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)
}
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();
}