立即注册 找回密码

QQ登录

只需一步,快速开始

查看: 643|回复: 0

[Wordpress 通用教程] WordPress AJAX,通过自带的AJAX钩子和通过Rest API两种方法对比

[复制链接]
发表于 2023-12-2 09:59:31 | 显示全部楼层 |阅读模式
道勤网-数据www.daoqin.net

亲注册登录道勤网-可以查看更多帖子内容哦!(包涵精彩图片、文字详情等)请您及时注册登录-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:
  1. $xprofile_nonce = wp_create_nonce ('xprofile_nonce');
复制代码
前端
  1. var ajax_data = {
  2.         action: "update_xprofile",
  3.         //注意这里有nonce是需要前端生成的
  4.         xprofile_nonce : <?php echo $xprofile_nonce;?>
  5.         xprofile_name :  $("#xprofile_name").val(),
  6.         xprofile_company :  $("#xprofile_company").val()
  7. }
  8. $.post("/wp-admin/admin-ajax.php", ajax_data,
  9.         function(data) {
  10.                 //console.log(data);
  11.                 if(data=="success"){
  12.                         //前端处理成功...
  13.                 }else{
  14.                         //前端处理其他逻辑...
  15.                 }
  16. });
复制代码
后端
  1. //两个钩子,为安全起见,还是都检验一下nonce吧:
  2. add_action('wp_ajax_nopriv_update_xprofile', 'brain1981_update_xprofile_ajax');
  3. add_action('wp_ajax_update_xprofile', 'brain1981_update_xprofile_ajax');
  4. function brain1981_update_xprofile_ajax(){
  5.         $action = $_POST["action"];
  6.         if ( $action == 'update_xprofile'){
  7.                 if ( !wp_verify_nonce($_POST['xprofile_nonce'], 'xprofile_nonce') ) {//如果nonce不对就拒绝执行
  8.                         die('Security check!');
  9.                 }
  10.                 if ( !current_user_can( 'edit_posts' ) ){//如果用户没有对应权限,拒绝处理数据
  11.                         die ('You have no permission!');
  12.                 }

  13.                 //处理我们的数据
  14.                 //...
  15.                 echo "success";//返回成功信号给前端,当然也可以返回任何其他数据
  16.         }
  17.         die;
  18. }
复制代码
WordPress Rest API方法实现AJAX
这个方法的原理是创建新的endpoint来处理数据,因此前端数据就要发到自己创建的endpoint去,而不是“admin-ajax.php”接口了。
同样也要生成nonce,由于是要用Rest API,WP规定名称必须为“wp_rest”,WP会自己做认证,无需自己写代码认证。
  1. $xprofile_nonce = wp_create_nonce ('wp_rest');
复制代码
前端,注意“/wp-json/brain1981/v1/xprofile”是我提交数据的endpoint
  1. var ajax_data = {
  2.         action: "update_xprofile",
  3.         //注意这里有nonce是需要前端生成的
  4.         xprofile_nonce : <?php echo $xprofile_nonce;?>
  5.         xprofile_name :  $("#xprofile_name").val(),
  6.         xprofile_company :  $("#xprofile_company").val()
  7. }
  8. $.ajax({
  9.         url: "/wp-json/brain1981/v1/xprofile",
  10.         type:"POST",
  11.         data: ajax_data,
  12.         dataType: 'json',
  13.         //把nonce放在文件头,WP会自己认证
  14.         beforeSend: function ( xhr ) {
  15.                 xhr.setRequestHeader( 'X-WP-Nonce', xprofile_nonce );
  16.         },
  17.         success: function(data){
  18.                 console.log(data);
  19.         },
  20.         error:function(XMLHttpRequest ){
  21.                 console.log(XMLHttpRequest );
  22.         }
  23. });
复制代码
后端
  1. add_action( 'rest_api_init', function () {
  2.         //创建endpoint,实际路径为前两个参数拼合起来
  3.         register_rest_route( 'brain1981/v1', '/xprofile/', array(
  4.                 'methods' => 'POST',
  5.                 'callback' => 'brain1981_update_xprofile_ajax',
  6.         ) );
  7. });
  8. function brain1981_update_xprofile_ajax($request){
  9.         $action = $request['action'];
  10.         if ( $action == 'update_xprofile'){
  11.                 //处理我们的数据
  12.                 //...
  13.                 return "success";//返回成功信号给前端,当然也可以返回任何其他数据,必须用return,不能用print或echo
  14.         }
  15.         return "fail";
  16. }
复制代码

两种方法的比较
不同点: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在线咨询图标联系我们并购买后,我们为您免费进行无缝搬家服务,让您享受网站零访问延迟的迁移到道勤主机的服务!
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关闭

道勤网- 推荐内容!上一条 /2 下一条

!jz_fbzt! !jz_sgzt! !jz_xgzt! 快速回复 !jz_fhlb! !jz_lxwm! !jz_gfqqq!

关于我们|手机版|小黑屋|地图|【道勤网】-www.daoqin.net 软件视频自学教程|免费教程|自学电脑|3D教程|平面教程|影视动画教程|办公教程|机械设计教程|网站设计教程【道勤网】 ( 皖ICP备15000319号-1 )

GMT+8, 2024-5-5 21:21

Powered by DaoQin! X3.4 © 2016-2063 Dao Qin & 道勤科技

快速回复 返回顶部 返回列表