Jag har problem med WordPress och Ajax.
Detta är min JavaScript-del (jag har trimmat den lite):
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-kod är som följer:
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 från admin-ajax. Tyvärr kastar konsolen ett fel när det kommer till each
uttalandet i JavaScript-koden … det står:
"Uncaught TypeError: Cannot use "in" operator to search for "4" in Array".
Om jag gör en console.log av mina ”inlägg” var får jag en sträng ”Array”. Oavsett hur jag skickar $list
variabeln i PHP kommer den alltid att returnera en sträng. Frågan returnerar inlägg någon annanstans, så den är inte tom. Jag försökte utan json_encode
, med och utan att deklarera rubrik, med wp_send_json()
, sätta ob_clean()
innan echo matrisen, placera arrayen i en array … Men den kommer alltid in i ajax
som en sträng Array
och each
kan inte gå igenom det.
Detta borde vara en väldigt enkel sak och jag kan inte förstå varför det är fungerar inte. Jag har inte andra JavaScript- eller PHP-fel eller varningar och allt annat fungerar bra.
Kommentarer
- Vad ser du när du gå till exempel.com/wp-admin/admin-ajax.php?action=myAjaxFunc
- Några framsteg i din fråga? Kan du snälla följa upp?
- åh … det här är för 5 månader sedan … Jag svarade förresten på min egen fråga nästa dag jag publicerade den, med bitar av BODA82 svar – jag ' markerade det inte som rätt svar; @toscho lade till sin uppföljning mycket senare igår kan jag ' t verifiera om hans svar också är bra nu, det är dock vettigt
Svar
BODA82s svar hjälpte, men så småningom insåg jag att jag borde ha bytt ut responseText
med responseJSON
-metoden i min JavaScript-kod. I exemplet nedan lagrade jag Ajax-svarets resultat i en variabel. Jag visste inte det fanns en specifik metod för att få svaret i JSON. På ett sådant sätt returneras objektet / arrayen med get_posts()
-resultat korrekt och inte som en sträng:
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
Anmärkning till dig själv, men också allmänna råd: om du inte kan fixa något på kvällen är det ett tecken på att du ska gå och lägga dig, läsa en bok och räkna stjärnor. Ett svar hittas nästa morgon, ju tidigare desto bättre: D
Svar
Nästan där med din PHP-funktion. Inget behov av att ställa in rubriken. (Redigera: Förutsatt att get_posts()
faktiskt ger resultat.)
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" );
Och ditt 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 sparar data med JSON.stringify () och sedan måste läsa det i php. Följande kod fungerade för mig. json_decode (html_entity_decode (stripslashes ($ jsonString)));
Svar
Det finns en väg ut. Använd complete
istället för success
eller done
:
posts = $.ajax({ type: "GET", url: ajaxurl, async: false, dataType: "json", data: { action : "getHotelsList" }, complete: function(results) {
Och försök ta bort async:false
om problemet kvarstår.