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
문자열로 Array
및 each
은 (는) 순환 할 수 없습니다.
이것은 매우 간단해야하며 이유를 이해할 수 없습니다. 작동하지 않습니다. 다른 JavaScript 또는 PHP 오류나 경고가없고 다른 모든 것이 정상적으로 실행됩니다.
댓글
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
를 제거해보십시오.
로 이동하십시오.