Ik heb een probleem met WordPress en Ajax.

Dit is mijn JavaScript-gedeelte (ik heb het een beetje bijgesneden):

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

Mijn PHP-code is als volgt:

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

Het script krijgt de Ajax-reactie van admin-ajax. Helaas geeft de console een foutmelding wanneer hij bij de each -instructie in de JavaScript-code komt … er staat:

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

Als ik een console.log van mijn “posts” var doe, krijg ik een string “Array”. Het maakt niet uit hoe ik de variabele $list in PHP doorgeef, het zal altijd een string teruggeven. De zoekopdracht retourneert berichten ergens anders, dus het is “niet leeg. Ik heb geprobeerd zonder json_encode, met en zonder koptekst te declareren, met wp_send_json(), zetten ob_clean() alvorens de array te herhalen, de array in een array te plaatsen … Maar het komt altijd in ajax als een string Array en each kunnen er niet doorheen bladeren.

Dit zou heel eenvoudig moeten zijn en ik kan “niet begrijpen waarom het werkt niet. Ik heb geen andere JavaScript- of PHP-fouten of waarschuwingen en al het andere werkt prima.

Opmerkingen

  • Wat zie je als je ga naar example.com/wp-admin/admin-ajax.php?action=myAjaxFunc
  • Enige vooruitgang met je vraag? Kun je alsjeblieft verdergaan?
  • oh … dit is van 5 maanden geleden … ik heb trouwens mijn eigen vraag beantwoord, de volgende dag heb ik hem gepost, met behulp van stukjes BODA82-antwoord – ik ' t heeft het net niet gemarkeerd als het juiste antwoord; @toscho voegde gisteren zijn follow-up veel later toe. Ik kan ' niet verifiëren of zijn antwoord nu ook goed is, maar het is logisch

Answer

BODA82 “s antwoord hielp, maar uiteindelijk realiseerde ik me dat ik responseText met responseJSON -methode in mijn JavaScript-code. In het onderstaande voorbeeld bewaarde ik de Ajax-responsresultaten in een variabele. Ik wist het niet er was een specifieke methode om het antwoord in JSON te krijgen. Op deze manier wordt het object / array met get_posts() resultaten correct geretourneerd en niet als een string:

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 

Opmerking voor jezelf, maar ook algemeen advies: als je s avonds iets niet kunt repareren, is dat een teken dat je naar bed moet, een boek moet lezen en sterren moet tellen. Een antwoord zal de volgende ochtend worden gevonden, hoe eerder hoe beter: D

Antwoord

Bijna klaar met je PHP-functie. Het is niet nodig om de koptekst in te stellen. (Bewerken: ook, ervan uitgaande dat get_posts() daadwerkelijk resultaten retourneert.)

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

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

Opmerkingen

  • Wanneer u gegevens opslaat met JSON.stringify () en deze vervolgens moet lezen in php. De volgende code werkte voor mij. json_decode (html_entity_decode (stripslashes ($ jsonString)));

Antwoord

Er is een uitweg. Gebruik complete in plaats van success of done:

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

En probeer async:false te verwijderen als het probleem aanhoudt.

Geef een reactie

Het e-mailadres wordt niet gepubliceerd. Vereiste velden zijn gemarkeerd met *