Minulla on ongelma WordPressin kanssa ja Ajax.

Tämä on JavaScriptiäni osa (leikkasin sitä hieman):

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

PHP-koodini on seuraava:

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

Komentosarja saa Ajax-vastauksen järjestelmänvalvoja-ajaxista. Valitettavasti konsoli heittää virheen päästäessään each -lausekkeeseen JavaScript-koodissa … se sanoo:

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

Jos teen konsolilogin ”viesteistäni”, saan merkkijonon ”Array”. Ei väliä kuinka välitän $list -muuttujan PHP: ssä, se palauttaa aina merkkijonon. Kysely palauttaa viestejä muualle, joten se ei ole tyhjä. Yritin ilman json_encode -tunnistetta otsikon kanssa ja ilman ilmoitusta, käyttäen wp_send_json(), ob_clean() ennen taulukon kaikua, asettamalla matriisi taulukkoon … Mutta se sijoittuu aina ajax merkkijonoksi Array ja each eivät voi selata sitä.

Tämän pitäisi olla hyvin yksinkertainen asia, enkä voi ymmärtää miksi se on ei toimi. Minulla ei ole muita JavaScript- tai PHP-virheitä tai varoituksia, ja kaikki muu toimii hyvin.

Kommentit

  • Mitä näet, kun siirry osoitteeseen esimerkki.com/wp-admin/admin-ajax.php?action=myAjaxFunc
  • Onko edistystä kysymyksessäsi? Voisitko seurata asiaa?
  • Voi … tämä on 5 kuukautta sitten … Vastasin omaan kysymykseeni muuten seuraavana päivänä, kun lähetin sen, käyttäen bittiä BODA82-vastausta – minä vain ei ' t merkinnyt sitä oikeeksi vastaukseksi; @toscho lisäsi seurantansa paljon myöhemmin eilen. En voi ' tarkistaa, onko hänen vastauksensa myös hyvä, mutta on järkevää

Vastaus

BODA82: n vastaus auttoi, mutta lopulta tajusin, että minun olisi pitänyt korvata responseText responseJSON -menetelmällä JavaScript-koodissani. Alla olevassa esimerkissä tallensin Ajax-vastaustulokset muuttujaan. En tiennyt oli olemassa erityinen menetelmä vastauksen saamiseksi JSON: ssa. Tällä tavoin objekti / taulukko get_posts() -tuloksilla palautetaan oikein eikä merkkijonona:

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 

Huomaa itselleni, mutta myös yleisiä neuvoja: jos et voi korjata jotain illalla, se on merkki, sinun pitäisi mennä nukkumaan, lukea kirjaa ja laskea tähtiä. Vastaus löytyy seuraavana aamuna, mitä aikaisemmin, sitä parempi: D

Vastaa

Melkein siellä PHP-toimintosi kanssa. Otsikkoa ei tarvitse asettaa. (Muokkaa: Oletetaan, että get_posts() todella palauttaa tuloksia.)

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

Ja Javascriptisi:

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

Kommentit

  • Kun tallennat joitain tietoja JSON.stringify () -ominaisuuden avulla ja sinun on luettava ne sitten php. Seuraava koodi toimi minulle. json_decode (html_entity_decode (kaistaleet ($ jsonString)));

vastaus

On ulospääsyä. Käytä complete success tai done:

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

Ja yritä poistaa async:false, jos ongelma jatkuu.

Vastaa

Sähköpostiosoitettasi ei julkaista. Pakolliset kentät on merkitty *