Jai un problème avec WordPress et Ajax.

Voici ma partie JavaScript (je lai un peu rognée):

var posts = $.ajax({ type: "POST", url: ajaxurl, async: false, dataType: "json", data: { action: "myAjaxFunc" }, done: function(response) { return response; } }).responseText; $.each(posts, function() { $("#someSelect").append( $("<option</option>").text(this.name).val(this.id) ); }); 

Mon code PHP est le suivant:

function myAjaxFunc() { $posts = get_posts( array( "posts_per_page" => -1, "orderby" => "title", "order" => "ASC", "post_type" => "my-post-type", "post_status" => array( "publish", "draft" ) ) ); $list = array(); foreach ( $posts as $post ) { $list[] = array( "id" => $post->ID, "name" => $post->post_title, "link" => get_permalink( $post->ID ), ); } header("Content-type: application/json"); echo json_encode( $list ); die; } add_action( "wp_ajax_nopriv_myAjaxFunc", "myAjaxFunc" ); add_action( "wp_ajax_myAjaxFunc", "myAjaxFunc" ); 

Le script obtient la réponse Ajax de admin-ajax. Malheureusement, la console renvoie une erreur lorsquelle accède à linstruction each dans le code JavaScript … elle dit:

"Uncaught TypeError: Cannot use "in" operator to search for "4" in Array". 

Si je fais un console.log de mes « posts » var jobtiens une chaîne « Array ». Peu importe comment je passe la variable $list en PHP, il retournera toujours une chaîne. La requête renvoie des messages ailleurs, donc ce nest pas vide. Jai essayé sans json_encode, avec et sans déclarer len-tête, en utilisant wp_send_json(), en mettant ob_clean() avant de faire écho au tableau, de placer le tableau dans un tableau … Mais il entre toujours dans ajax sous forme de chaîne Array et each ne peuvent pas le parcourir.

Cela devrait être une chose très simple et je ne peux pas comprendre pourquoi cest ne fonctionne pas. Je nai pas dautres erreurs ou avertissements JavaScript ou PHP et tout le reste fonctionne correctement.

Commentaires

  • Que voyez-vous lorsque vous aller à example.com/wp-admin/admin-ajax.php?action=myAjaxFunc
  • Des progrès sur votre question? Pourriez-vous sil vous plaît faire un suivi?
  • oh … cest dil y a 5 mois … Jai répondu à ma propre question par la façon dont le lendemain je lai postée, en utilisant des morceaux de réponse BODA82 – je je viens de ' t marqué comme la bonne réponse; @toscho a ajouté son suivi beaucoup plus tard hier, je ne peux ' t vérifier si sa réponse est également bonne maintenant, cest logique cependant

Réponse

La réponse de BODA82 «  ma aidé, mais jai finalement réalisé que jaurais dû remplacer responseText avec la méthode responseJSON dans mon code JavaScript. Dans lexemple ci-dessous, je stockais les résultats de la réponse Ajax dans une variable. Je ne savais pas il y avait une méthode spécifique pour obtenir la réponse en JSON. De cette manière, lobjet / tableau avec les résultats get_posts() est renvoyé correctement et non sous forme de chaîne:

posts = $.ajax({ type: "GET", url: ajaxurl, async: false, dataType: "json", data: { action : "getHotelsList" }, done: function(results) { // Uhm, maybe I don"t even need this? JSON.parse(results); return results; }, fail: function( jqXHR, textStatus, errorThrown ) { console.log( "Could not get posts, server response: " + textStatus + ": " + errorThrown ); } }).responseJSON; // <-- this instead of .responseText 

Note à moi-même, mais aussi conseil général: si vous ne pouvez pas « réparer quelque chose le soir », cest un signe que vous devez aller au lit, lire un livre et compter les étoiles. Une réponse sera trouvée le lendemain matin, le plus tôt sera le mieux: D

Answer

Presque là avec votre fonction PHP. Pas besoin de définir len-tête. (Modifier: également, en supposant que get_posts() renvoie réellement des résultats.)

function myAjaxFunc() { $posts = get_posts( array( "posts_per_page" => -1, "orderby" => "title", "order" => "ASC", "post_type" => "my-post-type", "post_status" => array( "publish", "draft" ) ) ); $list = array(); foreach ( $posts as $post ) { $list[] = array( "id" => $post->ID, "name" => $post->post_title, "link" => get_permalink( $post->ID ), ); } echo json_encode( $list ); die; } add_action( "wp_ajax_nopriv_myAjaxFunc", "myAjaxFunc" ); add_action( "wp_ajax_myAjaxFunc", "myAjaxFunc" ); 

Et votre Javascript:

$.ajax({ url: "<?php bloginfo("url"); ?>/wp-admin/admin-ajax.php", type: "POST", data: "action=myAjaxFunc", success: function(results) { var posts = JSON.parse(results); console.log(results); $.each(posts, function() { $("#someSelect").append( $("<option></option>").text(this.name).val(this.id) ); }); }, error: function() { console.log("Cannot retrieve data."); } }); 

Commentaires

  • Lorsque vous enregistrez des données en utilisant JSON.stringify () et que vous devez les lire dans php. Le code suivant a fonctionné pour moi. json_decode (html_entity_decode (striplashes ($ jsonString)));

Réponse

Il y a une issue. Utilisez complete au lieu de success ou done:

posts = $.ajax({ type: "GET", url: ajaxurl, async: false, dataType: "json", data: { action : "getHotelsList" }, complete: function(results) { 

Et essayez de supprimer async:false si le problème persiste.

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *