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ă.