最近写插件的时候遇到一个问题,使用ajax向wordpress发起请求,返回回来的始终是0!
先简单说下wordpress的ajax请求。
发起请求
wordpress中要发起ajax请求不难,分别需要如下:
PHP记录一个ajax钩子,以便后续操作:
function press_data()
{
// do it...
exit;
}
wp_register_script('request_data', plugins_url('request_data.js', __FILE__), array('jquery'));
wp_enqueue_script('request_data');
add_action('wp_ajax_press_data', 'press_data');
从上面可以得出以下结论:
wordpress是通过add_action记录一个ajax请求的钩子
钩子的名称前缀必须是“wp_ajax_”
钩子回调方法中必须通过“exit”或“die”来结束输出(后面会继续说明)
通过“wp_register_script”注册一个js,用于发起请求
js发起ajax请求:
jQuery.ajax({
type: 'POST',
url: ajaxurl,
data: {
action: 'press_data'
},
success: function(res) {
// get res
}
});
从上面可以得出以下结论:
url请求地址为一个固定的变量:ajaxurl
请求的“data”数据中必须有一个“action”属性,属性值必须和之前ajax记录请求的钩子名称对应
这些并不难,如果说还要增加点花样的话,比如说php传个值让ajax请求时带上,那么可以通过函数:wp_localize_script,如下:
// 注册一个钩子
wp_register_script('request_data', plugins_url('request_data.js', __FILE__), array('jquery'));
// 传递一个值
wp_localize_script('request_data', 'request_data', array(
'url' => 'http://levi.cg.am'
));
// 调用这个js
wp_enqueue_script('request_data');
而之前的js也仅需要这么修改即可:
jQuery.ajax({
type: 'POST',
url: ajaxurl,
data: {
action: 'press_data',
form: request_data.url
},
success: function(res) {
// get res
}
});
要搞清楚为什么ajax请求一直返回0这个问题,先要搞清楚整个请求流程。
wordpress注册ajax的流程:
后台load必要的文件、钩子、函数
接受add_action请求,根据请求记录所有的钩子,包含ajax钩子
等待触发
wordpress触发ajax请求
wordpress接受ajax的地址为/wp-admin/admin-ajax.php
请求文件前先load必要的文件、钩子、函数(和注册时一样)
检查action请求,若找不到输出0,结束
检查并触发系统对应的钩子、ajax请求
检查action请求并根据用户登录与否进行触发
登录用户触发钩子:wp_ajax_{action_name}
未登录用户触发钩子:wp_ajax_nopriv_{action_name}
最终输出0,结束请求
看到这里我想大家应该明白为什么ajax钩子的回调函数中都要以“exit”或“die”来结束输出了吧,如果你不结束输出的话,最终都会返回一个“0”来结束本次请求结果;这样可能会破坏你原有的数据结构。
没有action请求
js发起ajax请求时候没有action,或者action并不在“data”属性中,例如:
// 错误示范
jQuery.ajax(
action: 'action_name',
data: {}
);
// 正确示范
jQuery.ajax({
data: { action: 'action_name' }
});