Problémám van a WordPress programmal és az Ajax.

Ez az én JavaScript-részem (kicsit levágtam):

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

A PHP-kódom a következő:

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

A szkript az Ajax választ az admin-ajax-tól kapja. Sajnos a konzol hibát dob, amikor eljut a each utasításhoz a JavaScript-kódban … a következőket mondja:

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

Ha elkészítem a konzol.logot a “bejegyzéseimből”, akkor kapok egy “Array” karakterláncot. Nem számít, hogyan adom át a $list változót a PHP-ben, az mindig visszaad egy karakterláncot. A lekérdezés máshová adja vissza a bejegyzéseket, így nem üres. Megpróbáltam json_encode nélkül, fejléccel deklarálva és anélkül, a ob_clean() a tömb visszhangja előtt, a tömböt egy tömbbe helyezi … De mindig belép a ajax karakterláncba Array és a each nem tud végiggörgetni.

Ennek nagyon egyszerű dolognak kell lennie, és nem tudom megérteni, miért nem működik. Nincs más JavaScript vagy PHP hibám vagy figyelmeztetésem, és minden más rendben van.

Megjegyzések

  • Mit látsz, amikor keresse fel a example.com/wp-admin/admin-ajax.php?action=myAjaxFunc webhelyet
  • Halad a kérdésével kapcsolatban? Kérem, kövesse nyomon?
  • ó … ez 5 hónappal ezelőtti … Válaszoltam a saját kérdésemre, másnap feltettem, a BODA82 válasz bitjeivel – I csak nem ' t jelölte meg helyes válaszként; @toscho tegnap sokkal később adta hozzá a nyomon követését. ' nem tudom ellenőrizni, hogy a válasza most is jó-e, mégis van értelme

Válasz

BODA82 válasza segített, de végül rájöttem, hogy le kellett volna cserélnem a responseText responseJSON módszerrel a JavaScript-kódomban. Az alábbi példában az Ajax válaszeredményeket egy változóban tároltam. Nem tudtam volt egy speciális módszer a válasz megszerzésére a JSON-ban. Ilyen módon az objektum / tömb get_posts() eredménnyel helyesen, nem pedig karakterláncként kerül visszaadásra:

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 

Megjegyzés az önmaga számára, de általános tanácsok is: ha nem sikerül este valamit rendbe hozni, akkor az lefekszik, könyvet olvas és csillagokat számít. Másnap reggel választ találunk, minél korábban, annál jobb: D

Válasz

Majdnem ott van a PHP funkcióval. Nincs szükség a fejléc beállítására. (Szerkesztés: Ha feltételezzük, hogy a get_posts() valóban eredményt ad.)

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

És a 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."); } }); 

Megjegyzések

  • Amikor néhány adatot elment a JSON.stringify () használatával, majd ezt el kell olvasnia a php. Nekem a következő kód működött. json_decode (html_entity_decode (stripslashes ($ jsonString)));

válasz

Van kiút. Használja a complete szót a success vagy a done helyett:

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

Ha a probléma továbbra is fennáll, próbálja meg eltávolítani a async:false oldalt.

Vélemény, hozzászólás?

Az email címet nem tesszük közzé. A kötelező mezőket * karakterrel jelöltük