Am o problemă cu WordPress și Ajax.

Aceasta este partea mea JavaScript (am redus-o puțin):

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

Codul meu PHP este după cum urmează:

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

Scriptul primește răspunsul Ajax de la admin-ajax. Din păcate, consola produce o eroare când ajunge la instrucțiunea each din codul JavaScript … scrie:

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

Dacă fac o consolă log a „postărilor” mele, am un șir „Array”. Indiferent de modul în care trec variabila $list în PHP, va reveni întotdeauna un șir. Interogarea returnează postări în altă parte, deci nu este goală. Am încercat fără json_encode, cu și fără declararea antetului, folosind wp_send_json(), punând ob_clean() înainte de a face ecou tabloului, punând tabloul într-un tablou … Dar intră întotdeauna în ajax ca șir și each nu pot trece prin el.

Acesta ar trebui să fie un lucru foarte simplu și nu pot să înțeleg de ce nu funcționează. Nu am alte erori sau avertismente JavaScript sau PHP și toate celelalte funcționează bine.

Comentarii

  • Ce vedeți când accesați example.com/wp-admin/admin-ajax.php?action=myAjaxFunc
  • Aveți vreun progres la întrebarea dvs.? Ați putea, vă rog, să urmăriți?
  • oh … asta este de acum 5 luni … Am răspuns la propria mea întrebare prin modul în care a doua zi am postat-o, folosind bucăți de răspuns BODA82 – I ' nu l-a marcat drept răspunsul corect; @toscho și-a adăugat urmărirea mult mai târziu ieri. Nu pot ' să verific dacă răspunsul său este de asemenea bun acum, are sens, deși,

Răspuns

Răspunsul BODA82 a ajutat, dar în cele din urmă mi-am dat seama că ar fi trebuit să înlocuiesc responseText cu metoda responseJSON în codul meu JavaScript. În exemplul de mai jos stocam rezultatele răspunsului Ajax într-o variabilă. Nu știam a existat o metodă specifică pentru a obține răspunsul în JSON. Într-un astfel de mod, obiectul / tabloul cu rezultatele get_posts() este returnat corect și nu ca un șir:

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 

Notă pentru sine, dar și sfaturi generale: dacă nu poți repara ceva seara, este un semn că ar trebui să te duci la culcare, să citești o carte și să numeri stele. Un răspuns va fi găsit a doua zi dimineață, cu cât mai devreme cu atât mai bine: D

Răspuns

Aproape acolo cu funcția dvs. PHP. Nu este nevoie să setați antetul. (Editați: De asemenea, presupunând că get_posts() returnează de fapt rezultate.)

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

Și 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."); } }); 

Comentarii

  • Când salvați unele date folosind JSON.stringify () și apoi trebuie să le citiți în php. Următorul cod a funcționat pentru mine. json_decode (html_entity_decode (stripslashes ($ jsonString)));

Răspuns

Există o ieșire. Utilizați complete în loc de success sau done:

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

Și încercați să eliminați async:false dacă problema persistă.

Lasă un răspuns

Adresa ta de email nu va fi publicată. Câmpurile obligatorii sunt marcate cu *