亲注册登录道勤网-可以查看更多帖子内容哦!(包涵精彩图片、文字详情等)请您及时注册登录-www.daoqin.net
您需要 登录 才可以下载或查看,没有账号?立即注册
x
基于wordpress项目的开发中,经常会需要用到AJAX请求。相较于原生的前后端实现,WordPress其实提供了两种方法可以更便捷的实现AJAX。 WordPress自带的AJAX钩子实现AJAX这个方法是现在用的比较多的。原理是前端向“/wp-admin/admin-ajax.php”这个接口发送请求,这个接口会根据请求的action值来处理数据。而根据不同的action值,利用钩子“wp_ajax_nopriv_[action]”和“wp_ajax_[action]”去编写自己的程序处理和返回数据。
如果是要写数据,先在页面生成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”是我提交数据的endpoint - var 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”接口感觉更简单一点,也更传统一些。
道勤主机提供365天*24小时全年全天无休、实时在线、零等待的售后技术支持。竭力为您免费处理您在使用道勤主机过程中所遇到的一切问题!
如果您是道勤主机用户,那么您可以通过QQ【792472177】、售后QQ【59133755】、旺旺【诠释意念】、微信:q792472177免费电话、后台提交工单这些方式联系道勤主机客服!
如果您不是我们的客户也没问题,点击页面最右边的企业QQ在线咨询图标联系我们并购买后,我们为您免费进行无缝搬家服务,让您享受网站零访问延迟的迁移到道勤主机的服务! |