WordPressに問題があります

これは私のJavaScriptパーツです(少しトリミングしました):

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コードは次のとおりです:

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

スクリプトは、admin-ajaxからAjax応答を取得します。残念ながら、コンソールはJavaScriptコードのeachステートメントに到達するとエラーをスローします…次のように表示されます:

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

「posts」変数のconsole.logを実行すると、文字列「Array」が取得されます。 PHPで$list変数をどのように渡しても、常に文字列が返されます。クエリは他の場所に投稿を返すため、空ではありません。wp_send_json()を使用して、ヘッダーを宣言する場合としない場合で、json_encodeを使用せずに試しました。 ob_clean()配列をエコーする前に、配列を配列に入れます…ただし、常に文字列iv id =としてajaxに入ります。 “b680be4cea”>

eachは循環できません。

これは非常に単純なことであり、「理由がわかりません」。動作していません。他のJavaScriptまたはPHPのエラーや警告はなく、他のすべては正常に実行されます。

コメント

  • example.com/wp-admin/admin-ajax.php?action=myAjaxFunc
  • 質問の進捗状況はありますか?フォローアップしてもらえますか?
  • ああ…これは5か月前のことです…私はBODA82の回答を少し使って、投稿した翌日に自分の質問に回答しました-私'正解としてマークしませんでした。 @toschoは昨日、彼のフォローアップを追加しました。'彼の答えが今も良いかどうかは確認できませんが、それは理にかなっています

回答

BODA82の回答は役に立ちましたが、最終的には置き換える必要があることに気付きました。 JavaScriptコードのresponseJSONメソッドを使用したdivid = “a5e31905c8″>

。以下の例では、Ajax応答結果を変数に格納していました。わかりませんでした。 JSONで応答を取得するための特定のメソッドがありました。このようにして、get_posts()の結果を含むオブジェクト/配列は、文字列としてではなく正しく返されます。

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 

自己への注意だけでなく、一般的なアドバイスもあります。「夕方に何かを修正できない」場合は、就寝して本を読み、星を数える必要があります。答えは翌朝見つかりますが、早いほど良いです:D

答え

PHP関数はほぼそこにあります。ヘッダーを設定する必要はありません。 (編集:また、get_posts()が実際に結果を返していると仮定します。)

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

そして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."); } }); 

コメント

  • JSON.stringify()を使用してデータを保存し、それを読み取る必要がある場合php。次のコードは私のために働いた。 json_decode(html_entity_decode(stripslashes($ jsonString)));

回答

解決策があります。 successまたはdoneの代わりにcompleteを使用します:

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

問題が解決しない場合は、async:falseを削除してみてください。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です