Jeg har et problem med WordPress og Ajax.

Dette er JavaScript-delen min (jeg trimmet den litt):

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

PHP-koden min 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" ); 

Skriptet får Ajax-svaret fra admin-ajax. Dessverre kaster konsollen en feil når den kommer til each uttalelsen i JavaScript-koden … den sier:

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

Hvis jeg gjør en console.log av «innleggene» mine, får jeg en streng «Array». Uansett hvordan jeg sender $list -variabelen i PHP, vil den alltid returnere en streng. Søket returnerer innlegg andre steder, så det er ikke tomt. Jeg prøvde uten json_encode, med og uten å erklære overskrift, ved å bruke wp_send_json() ob_clean() før ekko matrisen, setter matrisen i en matrise … Men det kommer alltid inn i ajax som en streng Array og each kan ikke sykle gjennom den.

Dette burde være en veldig enkel ting, og jeg kan ikke forstå hvorfor det er fungerer ikke. Jeg har ikke andre JavaScript- eller PHP-feil eller advarsler, og alt annet går bra.

Kommentarer

  • Hva ser du når du gå til eksempel.com/wp-admin/admin-ajax.php?action=myAjaxFunc
  • Noen fremskritt på spørsmålet ditt? Kan du vennligst følge opp?
  • åh … dette er fra 5 måneder siden … Jeg svarte på mitt eget spørsmål forresten neste dag jeg postet det, ved å bruke biter av BODA82 svar – jeg bare merket det ikke ' som riktig svar; @toscho la til sin oppfølging mye senere i går, jeg kan ' t verifisere om svaret hans også er bra nå, det er fornuftig skjønt

Svar

BODA82 «svar hjalp, men til slutt skjønte jeg at jeg burde ha byttet ut responseText med responseJSON -metoden i JavaScript-koden min. I eksemplet nedenfor lagret jeg Ajax-responsresultatene i en variabel. Jeg visste ikke det var en spesifikk metode for å få svaret i JSON. På en slik måte returneres objektet / matrisen med get_posts() -resultater riktig 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 

Merk deg selv, men også generelle råd: hvis du ikke kan fikse noe om kvelden, er det et tegn på at du bør legge deg, lese en bok og telle stjerner. Et svar vil bli funnet neste morgen, jo tidligere jo bedre: D

Svar

Nesten der med PHP-funksjonen din. Ingen grunn til å sette toppteksten. (Rediger: Forutsatt 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 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 lagrer data ved hjelp av JSON.stringify () og deretter må lese det i php. Følgende kode fungerte for meg. json_decode (html_entity_decode (stripslash ($ jsonString)));

Svar

Det er en vei ut. Bruk 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 å fjerne async:false hvis problemet vedvarer.

Legg igjen en kommentar

Din e-postadresse vil ikke bli publisert. Obligatoriske felt er merket med *