WordPress AJAX,通过自带的AJAX钩子和通过Rest API两种方法对比
基于WordPress项目的开发中,经常会需要用到AJAX请求。相较于原生的前后端实现,WordPress其实提供了两种方法可以更便捷的实现AJAX。WordPress自带的AJAX钩子实现AJAX这个方法是现在用的比较多的。原理是前端向“/wp-admin/admin-ajax.php”这个接口发送请求,这个接口会根据请求的action值来处理数据。而根据不同的action值,利用钩子“wp_ajax_nopriv_”和“wp_ajax_”去编写自己的程序处理和返回数据。如果是要写数据,先在页面生成nonce:$xprofile_nonce = wp_create_nonce ('xprofile_nonce');前端var ajax_data = {
action: "update_xprofile",
//注意这里有nonce是需要前端生成的
xprofile_nonce : <?php echo $xprofile_nonce;?>
xprofile_name :$("#xprofile_name").val(),
xprofile_company :$("#xprofile_company").val()
}
$.post("/wp-admin/admin-ajax.php", ajax_data,
function(data) {
//console.log(data);
if(data=="success"){
//前端处理成功...
}else{
//前端处理其他逻辑...
}
});后端//两个钩子,为安全起见,还是都检验一下nonce吧:
add_action('wp_ajax_nopriv_update_xprofile', 'brain1981_update_xprofile_ajax');
add_action('wp_ajax_update_xprofile', 'brain1981_update_xprofile_ajax');
function brain1981_update_xprofile_ajax(){
$action = $_POST["action"];
if ( $action == 'update_xprofile'){
if ( !wp_verify_nonce($_POST['xprofile_nonce'], 'xprofile_nonce') ) {//如果nonce不对就拒绝执行
die('Security check!');
}
if ( !current_user_can( 'edit_posts' ) ){//如果用户没有对应权限,拒绝处理数据
die ('You have no permission!');
}
//处理我们的数据
//...
echo "success";//返回成功信号给前端,当然也可以返回任何其他数据
}
die;
}WordPress Rest API方法实现AJAX这个方法的原理是创建新的endpoint来处理数据,因此前端数据就要发到自己创建的endpoint去,而不是“admin-ajax.php”接口了。
同样也要生成nonce,由于是要用Rest API,WP规定名称必须为“wp_rest”,WP会自己做认证,无需自己写代码认证。$xprofile_nonce = wp_create_nonce ('wp_rest');前端,注意“/wp-json/brain1981/v1/xprofile”是我提交数据的endpointvar ajax_data = {
action: "update_xprofile",
//注意这里有nonce是需要前端生成的
xprofile_nonce : <?php echo $xprofile_nonce;?>
xprofile_name :$("#xprofile_name").val(),
xprofile_company :$("#xprofile_company").val()
}
$.ajax({
url: "/wp-json/brain1981/v1/xprofile",
type:"POST",
data: ajax_data,
dataType: 'json',
//把nonce放在文件头,WP会自己认证
beforeSend: function ( xhr ) {
xhr.setRequestHeader( 'X-WP-Nonce', xprofile_nonce );
},
success: function(data){
console.log(data);
},
error:function(XMLHttpRequest ){
console.log(XMLHttpRequest );
}
});后端add_action( 'rest_api_init', function () {
//创建endpoint,实际路径为前两个参数拼合起来
register_rest_route( 'brain1981/v1', '/xprofile/', array(
'methods' => 'POST',
'callback' => 'brain1981_update_xprofile_ajax',
) );
});
function brain1981_update_xprofile_ajax($request){
$action = $request['action'];
if ( $action == 'update_xprofile'){
//处理我们的数据
//...
return "success";//返回成功信号给前端,当然也可以返回任何其他数据,必须用return,不能用print或echo
}
return "fail";
}
两种方法的比较不同点:nonce的生成和验证方式有较大不同,代码里已有体现;
其实Rest API一般是用来做站外请求的,比如我做微信小程序要和WordPress站点交换数据,就会用到。并且Rest API可以对指定的nonce鉴别用户的id,如果并没有这个id,则赋予当前用户0号id(游客身份)。这样权限之类的事情就很好解决了。
而“admin-ajax.php”接口通常就用在站内AJAX请求,这种场景下即使不通过nonce,用户的id可以直接获取。概括起来,“admin-ajax.php”接口用在站内,Rest API站内站外都可以用,但是站内“admin-ajax.php”接口感觉更简单一点,也更传统一些。
页:
[1]