Wordpress Backend中的JSON.parse返回错误

时间:2011-02-15 00:45:43

标签: json wordpress jquery

我有一个带有'page_id'类的WordPress页面的下拉列表(它们重复并且可以添加...因此是实时查询)。在更改事件上,我想发送一个ajax请求,以拉出所选页面的标题,摘录和缩略图。目前我只想尝试任何有效的json响应。我在我的回调中使用json_encode将json对象返回给我的.ajax函数。然后在.ajax成功函数中,我试图将这个json对象解析为可用的东西,但每次都会得到一个错误。

错误似乎是JSON.parse的一个问题:

JSON.parse
success(response="{"title":"bacon title","message":"bacon text"}0")   
handleError(a=Object { url="http://localhost/single/wp-admin/admin-ajax.php", global=true, more...}, b=XMLHttpRequest { onreadystatechange=[xpconnect wrapped nsIDOMEventListener], readyState=4, more...}, d="success", e="{"title":"bacon title","message":"bacon text"}0")    onreadystatechange(m=readystatechange )
[Break On This Error] var json = JSON.parse(response); 

firebug控制台表示响应如下:

{"title":"bacon title","message":"bacon text"}0

我不知道额外的0是否是麻烦制造者,但我也不知道它是如何到达那里的。 chrome将错误报告为:

Uncaught SyntaxError: Unexpected number
$.livequery.$.change.$.ajax.success/single/wp-admin/post.php?post=2&action=edit&message=1:917

这是我的jquery函数:

<script type="text/javascript">
//<![CDATA[
jQuery(function($) {

    $('.page_id').livequery(function(){ 

        var loading = $(this).next('img.ajax-loader');


        $(this).change( function() {

          var value = $(this).val();
          if (value.length) {

            $(loading).fadeIn();

            var data = {
            action: 'featured_meta_action',
            data: value,
            security: '<?php echo wp_create_nonce('featured-ajax-nonce'); ?>',
            };

            $.ajax({
                type: "POST",
                data: data,
                url: ajaxurl, 
                complete: function(){
                    $(loading).fadeOut();
                    },
                success: function(response){
                    var str = '{ "title": "bar" }';
                    var json = JSON.parse(response); 

                    alert(json['title']);
                },
                error: function(){
                    alert('fail');
                }
            });
          }//end if
        }); //end change

    }); //end livequery


}); //end ready
/* ]]> */
</script>               

我的php回调看起来像:

function featured_meta_action_callback(){

    $responseVar = array(
                    'title'=>'bacon title',
                    'message'=>'bacon text',
                    );

    echo json_encode($responseVar); 

}
add_action('wp_ajax_featured_meta_action', 'featured_meta_action_callback');
事实证明,这似乎比它应该的更难。我只需要从PHP函数中获取数据,以便我可以在jquery中使用它。我哪里错了?

1 个答案:

答案 0 :(得分:1)

我认为可能是这样的:

function featured_meta_action_callback(){

    $responseVar = array(
                    'title'=>'bacon title',
                    'message'=>'bacon text' // <<< Here you do not need another comma
                    );

    echo json_encode($responseVar); 

}

查看数组中的注释。

编辑:虽然没有必要,但在测试中,如果我把它放在那里,它不会在JSON对象的末尾输出0。所以它很可能来自其他地方(换句话说,就是WordPress代码)。

编辑v2:通过Firebug的控制台运行这些。第二个引发错误,但如果你不包含0,它就可以正常工作。

console.log(JSON.parse('{"title":"bacon title","message":"bacon text"}'));
console.log(JSON.parse('{"title":"bacon title","message":"bacon text"}0'));

编辑v3:好的,你显然需要通过在函数末尾调用exit / die来短路WP进程的其余部分,如下所示:

function featured_meta_action_callback(){

    $responseVar = array(
                    'title'=>'bacon title',
                    'message'=>'bacon text' // <<< Here you do not need another comma
                    );

    echo json_encode($responseVar); 

    exit;
}

建议在这里:

http://codex.wordpress.org/AJAX_in_Plugins#Ajax_on_the_Administration_Side

在这里:

http://amiworks.co.in/talk/simplified-ajax-for-wordpress-plugin-developers-using-jquery/