abrufen. Ich habe ein Problem mit WordPress und Ajax.

Dies ist mein JavaScript-Teil (ich habe ihn etwas gekürzt):

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

Mein PHP-Code lautet wie folgt:

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

Das Skript erhält die Ajax-Antwort von admin-ajax. Leider gibt die Konsole einen Fehler aus, wenn sie zur Anweisung each im JavaScript-Code gelangt …

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

Wenn ich ein console.log meiner „posts“ -Vari mache, erhalte ich eine Zeichenfolge „Array“. Egal wie ich die Variable $list in PHP übergebe, es wird immer eine Zeichenfolge zurückgegeben. Die Abfrage gibt Beiträge an anderer Stelle zurück, daher ist sie nicht leer. Ich habe versucht, ohne json_encode, mit und ohne Deklaration des Headers, wp_send_json() zu setzen ob_clean() vor dem Echo des Arrays, dem Einfügen des Arrays in ein Array … Es wird jedoch immer als Zeichenfolge iv id = in ajax eingegeben „b680be4cea“>

undeachkönnen nicht durchlaufen.

Dies sollte eine sehr einfache Sache sein und ich kann nicht verstehen, warum es so ist funktioniert nicht. Ich habe keine anderen JavaScript- oder PHP-Fehler oder Warnungen und alles andere läuft einwandfrei.

Kommentare

  • Was sehen Sie, wenn Sie Gehen Sie zu example.com/wp-admin/admin-ajax.php?action=myAjaxFunc
  • Haben Sie Fortschritte bei Ihrer Frage? Könnten Sie bitte nachfassen?
  • oh … das ist von vor 5 Monaten … Ich habe meine eigene Frage übrigens am nächsten Tag beantwortet, als ich sie gepostet habe, mit Teilen der BODA82-Antwort – I. ‚ hat es gerade nicht als die richtige Antwort markiert; @toscho hat sein Follow-up viel später gestern hinzugefügt. Ich kann ‚ nicht überprüfen, ob seine Antwort jetzt auch gut ist. Es ist jedoch sinnvoll,

Antwort

Die Antwort von BODA82 hat geholfen, aber schließlich wurde mir klar, dass ich responseText mit der Methode responseJSON in meinem JavaScript-Code. Im folgenden Beispiel habe ich die Ajax-Antwortergebnisse in einer Variablen gespeichert. Ich wusste es nicht Es gab eine bestimmte Methode, um die Antwort in JSON zu erhalten. Auf diese Weise wird das Objekt / Array mit den Ergebnissen get_posts() korrekt und nicht als Zeichenfolge zurückgegeben:

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 

Hinweis für sich selbst, aber auch allgemeine Ratschläge: Wenn Sie „abends etwas nicht reparieren können“, sollten Sie ins Bett gehen, ein Buch lesen und Sterne zählen. Eine Antwort wird am nächsten Morgen gefunden, je früher desto besser: D

Antwort

Fast da mit Ihrer PHP-Funktion. Der Header muss nicht gesetzt werden. (Bearbeiten: Angenommen, get_posts() liefert tatsächlich Ergebnisse.)

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

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

Kommentare

  • Wenn Sie einige Daten mit JSON.stringify () speichern und diese dann einlesen müssen php. Der folgende Code hat bei mir funktioniert. json_decode (html_entity_decode (Stripslashes ($ jsonString)));

Antwort

Es gibt einen Ausweg. Verwenden Sie complete anstelle von success oder done:

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

Und versuchen Sie, async:false zu entfernen, wenn das Problem weiterhin besteht.

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.