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.