关于wordpress的ajax返回值为0的问题


今天在写一个wordpress插件时遇到一个问题,客户端向服务器发送ajax请求得到的响应response值为0。
js代码如下:

jQuery("#testAjax").click(function () {
        $data={
            action: 'get_items',
            security:'<?php echo wp_create_nonce("my-special-string");?>',
            mystring:'hello'
        };
        jQuery.post(
                ajaxurl,
                $data,
                function (response) {
                    alert('response:'+response);
                },
                "text"
        );
    });

还有个现象就是我在对处理ajax请求的函数进行debug时,也不能触发调试程序。很奇怪。
下面是处理ajax请求的php代码:

class Item{
    public function __construct(){
        add_action('admin_menu', array($this,'init'), 20);
    }
    public function init(){
        add_action('wp_ajax_get_items',array($this,'getItems'));
    }
    public function getItems(){
        check_ajax_referer( 'my-special-string', 'security' );
        echo 'This is getItems return';
        die();
    }
}

遇见过这个问题的人可能一眼就看出问题所在了。我弄了大概两个多小时。有人说在处理请求的函数后面添加“die()”……都没有解决问题。
最后在一个讨论页面看到这样的一个回复“You have to put the add_action at the complete bottom of your file or else it won't find the callback function”(url),感觉有道理于是我把

add_action('wp_ajax_get_items',array($this,'getItems'));

挪到插件入口文件改成:

$item=new Item();
add_action('wp_ajax_get_items',array($item,'getItems'));

问题即解决。
“必须把 add_action()放在文件末尾,否则wp就找不到你定义的回调函数”。

Archives