Jeg har et problem med WordPress og Ajax.

Dette er min JavaScript-del (jeg trimmede det lidt):

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

Min PHP-kode er som følger:

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" ); 

Scriptet får Ajax-svaret fra admin-ajax. Desværre kaster konsollen en fejl, når den kommer til each udsagnet i JavaScript-koden … der står:

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

Hvis jeg laver en console.log af mine “indlæg” var, får jeg en streng “Array”. Uanset hvordan jeg sender variablen $list i PHP, returnerer den altid en streng. Forespørgslen returnerer indlæg andre steder, så det er ikke tomt. Jeg prøvede uden json_encode med og uden at erklære overskrift ved hjælp af wp_send_json() ob_clean() inden ekkoet af arrayet placeres arrayet i et array … Men det kommer altid ind i ajax som en streng Array og each kan ikke cykle igennem det.

Dette burde være en meget enkel ting, og jeg kan ikke forstå, hvorfor det er fungerer ikke. Jeg har ikke andre JavaScript- eller PHP-fejl eller advarsler, og alt andet fungerer fint.

Kommentarer

  • Hvad ser du, når du gå til eksempel.com/wp-admin/admin-ajax.php?action=myAjaxFunc
  • Eventuelle fremskridt med dit spørgsmål? Kunne du venligst følge op?
  • åh … dette er fra 5 måneder siden … Jeg svarede forresten på mit eget spørgsmål den næste dag, hvor jeg sendte det ud, ved hjælp af bit af BODA82 svar – jeg markerede det bare ikke ' som det rigtige svar; @toscho tilføjede sin opfølgning meget senere i går, jeg kan ' ikke kontrollere, om hans svar også er godt nu, det giver dog mening

Svar

BODA82 “s svar hjalp, men til sidst indså jeg, at jeg skulle have erstattet responseText med responseJSON -metoden i min JavaScript-kode. I eksemplet nedenfor lagrede jeg Ajax-svaret, resulterede i en variabel. Jeg vidste ikke der var en specifik metode til at få svaret i JSON. På en sådan måde returneres objektet / arrayet med get_posts() -resultater korrekt og ikke som en streng:

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 

Bemærk til dig selv, men også generelle råd: hvis du ikke kan ordne noget om aftenen, er det et tegn på, at du skal gå i seng, læse en bog og tælle stjerner. Et svar findes næste morgen, jo tidligere jo bedre: D

Svar

Næsten der med din PHP-funktion. Ingen grund til at indstille overskriften. (Rediger: Hvis vi antager, at get_posts() faktisk returnerer resultater.)

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" ); 

Og dit 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."); } }); 

Kommentarer

  • Når du gemmer nogle data ved hjælp af JSON.stringify () og derefter skal læse det i php. Følgende kode fungerede for mig. json_decode (html_entity_decode (stripslashes ($ jsonString)));

Svar

Der er en vej ud. Brug complete i stedet for success eller done:

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

Og prøv at fjerne async:false, hvis problemet fortsætter.

Skriv et svar

Din e-mailadresse vil ikke blive publiceret. Krævede felter er markeret med *