加入收藏 | 设为首页 | 会员中心 | 我要投稿 拼字网 - 核心网 (https://www.hexinwang.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 教程 > 正文

WordPress中使用AJAX的几个问题总结

发布时间:2022-06-23 14:33:30 所属栏目:教程 来源:互联网
导读:WordPress中使用AJAX的问题我们碰到的有不少了,今天php粉丝网小编来为各位介绍一些关于WordPress中使用AJAX的几个问题总结,希望例子对各位有用。 使用AJAX的错误方法: 我看过很多的使用AJAX的插件,有些使用了正确的方法有些的实现方法则不对,这些不正确的插
  WordPress中使用AJAX的问题我们碰到的有不少了,今天php粉丝网小编来为各位介绍一些关于WordPress中使用AJAX的几个问题总结,希望例子对各位有用。
 
  使用AJAX的错误方法:
 
  我看过很多的使用AJAX的插件,有些使用了正确的方法有些的实现方法则不对,这些不正确的插件使用的方法通常就是,使用一个PHP文件来响应ajax请求,另外的一个php文件来写了些javascript的代码.
 
  下面是一个常见但是错误的例子:
 
  require_once("../../../../wp-config.php");
 
  // or require_once("../../../../wp-load.php");
 
  这个用法之所以错误,是因为用户有可能会使用其他的文件路径,这样上面的相对文件的读取方法就有问题了。更进一步,如果你在插件中使用了面向对象的开发方法,你就不能够直接访问需要的类属性和方法了。
 
  上面的PHP代码中,我们还需要另外一个PHP文件来输出javascript文件。这样一来,这个PHP文件又要加载wp-config.php或者wp-load.php,这还可能需要读取数据库的数据等。所以我们相当于把整个Wordpress框架又加载了一遍。
 
  抱歉到现在都没有给你展示正确的使用AJAX的方法,但是为了避免错误,我们需要把不利说说清楚,这样才能自然而然的引入下面五点
 
  1. 使用wp_localize_script()来声明全局的javascript变量
 
  尽管wp_localize_script()通常用于声明国际化的代码,它也可以有另外的用法。你可以使用它来声明javascript的变量,甚至可以带命名空间!下面是它的语法:
 
  wp_localize_script($handle, $namespace, $variable_array);
 
  然后是你怎么用它来声明一个AJAX的全局对象(这个例子中我使用了admin-ajax.php,会在第二部分中讲到):
 
  // 嵌入必要的js文件
  wp_enqueue_script( 'my-ajax-request', plugin_dir_url( __FILE__ ) . 'js/ajax.js', array( 'jquery' ) );
  
  // 什么响应请求的url (wp-admin/admin-ajax.php)
  wp_localize_script( 'my-ajax-request', 'MyAjax', array( 'ajaxurl' => admin_url( 'admin-ajax.php' ) ) ); //phpfensi.com
  使用这种方法,你不需要使用PHP来输出Javascript代码,那可真是各种不爽,如果你看一下生成的HTML代码,你也许会发现:
 
  XHTML
 
  <script type="text/javascript" src="http://example.com/wordpress/wp-content/plugins/myajax/js/ajax.js"></script><script type="text/javascript">// <![CDATA[
  var MyAjax = {     ajaxurl: "http://example.com/wordpress/wp-admin/admin-ajax.php" };
  // ]]></script>
  现在,在你的ajax.js中,你就可以使用MyAjax.ajaxurl变量了,不需要wp-load.php。参考第二条学习关于收发请求的知识。
 
  2.使用admin-ajax.php来响应AJAX请求
 
  AJAX请求应该指向wp-admin/admin-ajax.php,好吧,我知道”admin”这个词有点容易误导人,不过即使是前台的ajax请求,也应该定位到admin-ajax.php.
 
  admin-ajax需要一个参数“action”,admin-ajax需要这个参数来处理请求,它通常触发一个hook,根据是否登录有所不同.
 
  PHP:
 
  // 这个钩子在没有登录时触发
  do_action( 'wp_ajax_nopriv_' . $_REQUEST['action'] );
  
  // 如果登录的话
  do_action( 'wp_ajax_' . $_POST['action'] );
  JavasScript代码的话有点象这样:
 WordPress中使用AJAX的几个问题总结
  JavaScript
 
  jQuery.post(
   MyAjax.ajaxurl,
   {
    // 这里需要传一个参数,意味着触发
    // wp_ajax_nopriv_myajax-submit 或 wp_ajax_myajax-submit
    action : 'myajax-submit',
  
    // 也可以跟一些其他的参数
    postID : MyAjax.postID
   },
   function( response ) {
    alert( response );
   }
  );
  现在我们在插件或者主题里面写一个实际的代码来响应:
 
  PHP
 
  // 这里假设登不登录都可以发送请求
  add_action( 'wp_ajax_nopriv_myajax-submit', 'myajax_submit' );
  add_action( 'wp_ajax_myajax-submit', 'myajax_submit' );
  
  function myajax_submit() {
   // 获取参数
   $postID = $_POST['postID'];
  
   // 生成响应
   $response = json_encode( array( 'success' => true ) );
  
   // 输出响应
   header( "Content-Type: application/json" );
   echo $response;
  
   // IMPORTANT: 别忘了退出
   exit;
  }
  3.使用nonces并且检查权限
 
  我想我不需要再重申检查用户请求权限的事情了。虽然开发者总是会有意无意忽略它,然后结果会很悲剧。没有了适当的权限检查,一个不怀好意的访问者可以轻松毁了你煞费苦心打造的网站。这里我们要介绍两种安全层。
 
  Nonces
 
  Nonces是Numbers that are generated and used once的缩写(它是一个在加密通信只能使用一次的数字,通常翻译为随机数,但我觉得随机数不太能够完全表达它的含义,所以我下面还是用这个单词,译注)。Nonces保证了action由特定位置的授权用户发起的。这里有Jon Sykes的有趣分析,这让事情变得容易理解一些。
 
  当你进入了一家熟食店,你会拿到一张票,当轮到你票上的号码时,你拿着票交给服务员,服务员把票收下并作废,然后为你提供服务。然后他们会接着为大屏幕上显示号码的顾客提供服务。
 
  如果有不讲文明的孩子进入店里试图插队,他们是不会得逞的,因为他们没有票。
 
  即使他们得到了其他顾客使用过的票,那也是不行的,因为票已经使用而且号码也已经过去了。
 
  我们再把这个场景扩展一下,当客户得到一张票的时候,我们还给这个客户在他的票上签名。这样一来,当服务员给顾客服务的时候,他不仅看票的号码,也会让顾客再次签名,以和票上的签名进行比较确定这张票是不是真的属于这个顾客。
 
  在扩展一下,我们限定只有顾客进入大门的时候发给他票然后在上面签名,这会进一步防止有人趴在窗口试图伪造顾客的签名。因为他没有进入大门,甚至连票也得不到一张。所以他根本没有办法插队来买走那最后一根腊肠。
 
  Mark Jaquith 和 Vladimir Prelovac 同样对Nonces有精彩论述,读一读他们的文章,因为你肯定会在各种各样WP开发中使用到这些东西的(不仅仅是AJAX相关)。
 
  不过,这里也应该说明一下,Nonces只用作对数据内容有修改的情况下,如果只是读取一些不敏感的信息,比如获得评论的条数,或者一篇文章的内容,那么Nonces是不必要的。不过如果你是对一篇文章进行新增/编辑/删除,那么确保你会使用Nonces。
 
  好了,理论说的够多的了,我们来看看如何使用它吧。
 
  首先,你需要产生一个nonce,然后使用wp_localize_script()来包含这个变量
 
  PHP
 
  // 调用相关的js文件
  wp_enqueue_script( 'my-ajax-request', plugin_dir_url( __FILE__ ) . 'js/ajax.js', array( 'jquery' ) );
  
  wp_localize_script( 'my-ajax-request', 'MyAjax', array(
   // 处理 wp-admin/admin-ajax.php 请求的URL
   'ajaxurl'          => admin_url( 'admin-ajax.php' ),
  
   // 使用一个唯一ID "myajax-post-comment-nonce" 产生nonce
   // 你可以在随后的ajax请求中检查他
   'postCommentNonce' => wp_create_nonce( 'myajax-post-comment-nonce' ),
   )
  );
  现在你可以在JS中使用全局变量MyAjax.postCommentNonce了,你可以在随后的AJAX请求中发送这个值。
 
  JavaScript:
 
  jQuery.post(
   MyAjax.ajaxurl,
   {
    action : 'myajax-submit',
    postID : MyAjax.postID,
  
    // 发送这个nonce值
    postCommentNonce : MyAjax.postCommentNonce
   },
   function( response ) {
    alert( response );
   }
  );
  这基本和上一个例子差不多,除了我加了个nonce值发送给服务器。
 
  这里有个事情要注意一下,如果你需要发送多次ajax请求,那么你必须在一次ajax请求中生成一个新的nonce值返回,然后用脚本更新这个值,在下一次ajax请求中再使用。否则这个nonce会在多次ajax请求中使用,就会出问题啦。
 
  检查权限:
 
  很多脚本忽视了完整的权限检查,记住使用current_user_can()来确定当前的用户是被授权的,这里有一个终极版本的代码来回应请求:
 
  PHP:
 
  // 如果登录和非登录用户都可以发送ajax请求,那么加下面两种actions,
  // 否则只要设定需要授权的版本就好了
  add_action( 'wp_ajax_nopriv_myajax-submit', 'myajax_submit' );
  add_action( 'wp_ajax_myajax-submit', 'myajax_submit' );
  
  function myajax_submit() {
  
   $nonce = $_POST['postCommentNonce'];
  
   // 检查提交的nonce是否和我们上次产生的一致
   if ( ! wp_verify_nonce( $nonce, 'myajax-post-comment-nonce' ) )
    die ( 'Busted!')
  
   // 如果当前用户没有足够权限,忽视它
   if ( current_user_can( 'edit_posts' ) ) {
    // 获得提交的参数
    $postID = $_POST['postID'];
  
    // 生成回应
    $response = json_encode( array( 'success' => true ) );
  
    // 输出
    header( "Content-Type: application/json" );
    echo $response;
   }
  
   // 重要:别忘了"exit"
   exit;
  }
  4.使用内置的jQuery表单插件来提交表单
 
  大家都知道使用ajax来提交表单避免页面的刷新,但不是不是所有人都知道wordpress提供了一个jquery的插件来处理表单的相关动作,要想使用这个插件,想下面一样先包含它:
 
  XHTML
 
  <script src="https://gist.github.com/3827608.js"> </script>
 
  译注:这个JS莫名其妙,它这里说的应该是ajaxForm插件,请参看下面的链接.
 
  然后提交表单就很轻松了:
 
  JavaScript
 
  jQuery('#myForm1').ajaxForm({
   data: {
    // 除了表单元素意外的额外数据
   },
   dataType: 'json',
   beforeSubmit: function(formData, jqForm, options) {
    // 在发送数据前可以进行的额外处理
   },
   success : function(responseText, statusText, xhr, $form) {
    // 请求正确处理后的动作
   }
  });
  这个插件还有很多参数,请自己查阅吧。
 
  5.警惕jQuery自带的JSON解析功能
 
  原文撰写时间较早,Wordpress版本为2.9.2,jQuery版本为1.3.2,这个版本的jQuery有时候会完全依靠eval来解析JSON数据,因而会有安全性问题,后续版本已有改进,我们现在接触的版本应该都是安全的,因而这一点不在翻译,否则反而混淆视听了,译注.
 
  总结:
 
  ajax是一把双刃剑,它使得用户体验平滑而且迅捷,但是也带来了复杂度的提升和安全检查的繁杂,正确的使用它,安全的使用它,文章涵盖了5个重要的使用ajax的注意点,遵守他们,确保您的代码安全而且高效.
 
 

(编辑:拼字网 - 核心网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!