无法获取JSON对象以响应带有wp_ajax的AJAX请求

时间:2014-11-17 作者:unfulvio

我对WordPress和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 JavaScript代码中的语句。。。上面写着:

"Uncaught TypeError: Cannot use \'in\' operator to search for \'4\' in Array".
如果我做控制台。日志我的“posts”var我得到一个字符串“Array”。不管我怎么通过$list 变量,它将始终返回字符串。查询返回其他位置的帖子,因此它不是空的。我试过没有json_encode, 无论是否声明标头,使用wp_send_json(), 放置ob_clean() 在回显阵列之前,将阵列放入阵列中。。。但它总是进入ajax 作为字符串Arrayeach 无法循环通过它。

这应该是一件非常简单的事情,我不明白为什么它不起作用。我没有其他JavaScript或PHP错误或警告,其他一切运行正常。

3 个回复
最合适的回答,由SO网友:unfulvio 整理而成

BODA82\'s answer 帮助了,但最终我意识到我应该替换responseText 具有responseJSON 方法。在下面的示例中,我将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

SO网友:BODA82

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.\');
    }
});

SO网友:Robot Boy

有一条出路。使用complete 而不是successdone:

posts = $.ajax({
    type: \'GET\',
    url: ajaxurl,
    async: false,
    dataType: \'json\',
    data: { action : \'getHotelsList\' },
    complete: function(results) {
并尝试删除async:false 如果问题仍然存在。

结束

相关推荐

管理菜单中的jQuery POST方法

我正在尝试使用这个:jQuery(document).ready(function(){ jQuery(\"#button\").click(function(){ jQuery.post(\"post_file.php\") }); }); 我的地址。com/wp管理员/管理员。php?页面=pluginname/pluginfile。php\\u pluginfunction但它打开的是:myaddress。com/wp管理员/