WordPress에 문제가 있습니다. ' Ajax 요청에 대한 응답으로 JSON 개체를 가져올 수 없습니다. 및 Ajax입니다.

이것은 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 응답을받습니다. 불행히도 콘솔은 자바 스크립트 코드의 each 문에 도달하면 오류를 발생시킵니다. 다음과 같이 표시됩니다.

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

내 “게시물”var의 console.log를 수행하면 문자열 “Array”가 표시됩니다. PHP에서 $list 변수를 어떻게 전달하더라도 항상 문자열을 반환합니다. 쿼리는 다른 곳에서 게시물을 반환하므로 비어 있지 않습니다. json_encode없이 헤더를 선언하거나 사용하지 않고 wp_send_json()를 사용하여 시도했습니다. ob_clean() 배열을 에코하기 전에 배열을 배열에 넣습니다 … 그러나 항상 ajax 문자열로 Arrayeach은 (는) 순환 할 수 없습니다.

이것은 매우 간단해야하며 이유를 이해할 수 없습니다. 작동하지 않습니다. 다른 JavaScript 또는 PHP 오류나 경고가없고 다른 모든 것이 정상적으로 실행됩니다.

댓글

  • example.com/wp-admin/admin-ajax.php?action=myAjaxFunc
  • 로 이동하십시오.

  • 질문에 진행 상황이 있습니까? 후속 조치를 주 시겠어요?
  • 오 … 이건 5 개월 전입니다 … 다음날 글을 올렸을 때 BODA82 답변을 조금 사용하여 제 질문에 답변했습니다. 방금 ' 정답으로 표시하지 않았습니다. @toscho는 어제 훨씬 늦게 후속 조치를 추가했습니다. ' 현재 그의 답변도 좋은지 확인할 수는 없지만 말이됩니다.

Answer

BODA82 “의 답변 이 도움이되었지만 결국 바 스크립트 코드에 responseJSON 메소드가있는 div id = “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를 제거해보십시오.

답글 남기기

이메일 주소를 발행하지 않을 것입니다. 필수 항목은 *(으)로 표시합니다