Mám problém s WordPress a Ajax.

Toto je moje část JavaScriptu (trochu jsem ji ořezal):

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

Můj kód PHP je následující:

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

Skript získá odpověď Ajaxu od admin-ajax. Konzole bohužel způsobí chybu, když se dostane k příkazu each v kódu JavaScript … říká:

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

Pokud vytvořím soubor console.log svých „příspěvků“ var, zobrazí se mi řetězec „Pole“. Bez ohledu na to, jak v PHP předám proměnnou $list, vždy vrátí řetězec. Dotaz vrací příspěvky jinde, takže není prázdný. Snažil jsem se bez json_encode, s deklarací hlavičky i bez ní, pomocí wp_send_json(), uvedení ob_clean() před ozvěnou pole, vložením pole do pole … Vždy se však dostane do ajax jako řetězec Array a each to nemohou procházet.

Mělo by to být velmi jednoduchá věc a já nechápu, proč to je nefunguje. Nemám žádné další chyby nebo varování JavaScriptu nebo PHP a všechno ostatní funguje dobře.

Komentáře

  • Co vidíte, když přejděte na example.com/wp-admin/admin-ajax.php?action=myAjaxFunc
  • Nějaký pokrok ve vaší otázce? Mohl byste prosím sledovat?
  • oh … toto je z doby před 5 měsíci … Odpověděl jsem na svou vlastní otázku mimochodem další den, kdy jsem ji zveřejnil, pomocí kousků odpovědi BODA82 – já jen jsem to ' neoznačil jako správnou odpověď; @toscho přidal své sledování mnohem později včera Nemohu ' ověřit, zda je jeho odpověď nyní také dobrá, ale dává to smysl

Odpověď

Odpověď BODA82 pomohla, ale nakonec jsem si uvědomil, že jsem měl nahradit responseText metodou responseJSON v mém kódu JavaScriptu. V níže uvedeném příkladu jsem ukládal výsledky odpovědi Ajaxu do proměnné. Nevím pro získání odpovědi v JSON existovala konkrétní metoda. Tímto způsobem se objekt / pole s get_posts() výsledky vrací správně, nikoli jako řetězec:

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 

Poznámka pro sebe, ale také obecná rada: pokud nemůžete něco „napravit večer, je to znamení“, měli byste jít spát, přečíst si knihu a počítat hvězdy. Odpověď bude nalezena příštího rána, čím dříve, tím lépe: D

Odpověď

Téměř s vaší funkcí PHP. Není třeba nastavovat záhlaví. (Upravit: Za předpokladu, že get_posts() ve skutečnosti vrací výsledky.)

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

A váš 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."); } }); 

Komentáře

  • Když uložíte některá data pomocí JSON.stringify () a budete si je muset přečíst v php. Následující kód pracoval pro mě. json_decode (html_entity_decode (striplashes ($ jsonString)));

odpověď

Existuje východisko. Použijte complete místo success nebo done:

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

Pokud problém přetrvává, zkuste async:false odstranit.

Napsat komentář

Vaše e-mailová adresa nebude zveřejněna. Vyžadované informace jsou označeny *