美工学习 发表于 2023-12-2 09:59:31

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]
查看完整版本: WordPress AJAX,通过自带的AJAX钩子和通过Rest API两种方法对比