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.