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.

Lämna ett svar

Din e-postadress kommer inte publiceras. Obligatoriska fält är märkta *