使用 Ajax 似乎越来越普遍了,不管是 WordPress 的 Ajax 评论还是 Ajax 点赞,甚至全站 Ajax,这都说明对于 Ajax 我们已经越来越熟悉了。

然而在使用 Ajax 的过程中有很多问题大家并没有注意到。今天君子不器就来说以下关于 WordPress 中 Ajax 的使用。

大家一般是怎样使用 Ajax 的?

不少开发者在写插件时喜欢用以下方式实现 ajax:

1
require_once( '../../../../wp-config.php' );

就连百度站长平台官方开发的 wordpress 结构化数据提交插件也是如此实现 ajax 的,这是一种极其不合理的写法,因为一旦用户设置的目录不同, 相对路径就会失效。

最主要的是, 如果你在你的插件中使用的是面向对象的写法, 你将无法直接使用一些变量和私有方法. 最大的坏处就是会导致整个 WordPress 的框架额外重新加载一遍,严重的影响了网站的运行效率。

WordPress 定义好的 Ajax

其实,wordpress 为了方便开发者开发带有 ajax 功能的插件主题已经提前定义好了 ajax 方法,我们只需按照官方预留的方法去使用就好了。

在开发 wordpress ajax 之前你要先了解的是,不管是后台还是前台任何的 Ajax 请求都是在 admin-ajax.php 处理的,向 admin-ajax.php 发送请求的时候, 有一个必须的参数是$_REQUEST['action'], 因为 admin-ajax.php 需要根据用户是否登陆了来触发不同的 hooks。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
if ( is_user_logged_in() ) {
 /**
* Fires authenticated AJAX actions for logged-in users.
*
* The dynamic portion of the hook name, `$_REQUEST['action']`,
* refers to the name of the AJAX action callback being fired.
*
* @since 2.1.0
*/
do_action( 'wp_ajax_' . $_REQUEST['action'] );
} else {
 /**
* Fires non-authenticated AJAX actions for logged-out users.
*
* The dynamic portion of the hook name, `$_REQUEST['action']`,
* refers to the name of the AJAX action callback being fired.
*
* @since 2.8.0
*/
do_action( 'wp_ajax_nopriv_' . $_REQUEST['action'] );
}

以上代码取自 wordpress 系统文件 admin-ajax.php,从以上代码我们可以看出我们要发起一个请求首先要知道这个请求是否在登录状态下发起的?不同状态触发的 hook 也不一样,下面是个在主题利用 jquery 实现 ajax 的示例代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
add_action('wp_head', 'zhanAjaxScript');
function zhanAjaxScript() {
    print '<script>var zhan_ajaxurl = "'.admin_url('admin-ajax.php').'"'.";</script>\n";
    print "<script>
$(docunment).ready(function(){
$.ajax( {
url: zhan_ajaxurl,
data:{
action : 'is_login'
},
type:'post',
cache:false,
success:function(data) {
alert(data);
}
});
});
</scrip>";
}
add_action('wp_ajax_nopriv_is_login', 'zhan_ajax_not_login');
add_action('wp_ajax_is_login', 'zhan_ajax_is_login');
function zhan_ajax_is_login() {
    global $current_user;
    get_currentuserinfo();
    printf('登录用户您好 : %s!', $current_user - >display_name);
    //函数结束前的die或exit很重要,一定要加。
    die;
}
function zhan_ajax_not_login() {
    print '尊敬的访客您好!';
    //函数结束前的die或exit很重要,一定要加。
    die;
}

特别注意:在开发 wordpress ajax 应用中最重要的一点就是,函数结束之前一定要加 die 或者 exit,如果不加的话会把整个 wordpress 框架都重新加载一遍。

发表评论
登录后参与评论
专注 WordPress 网站优化解决方案! 加入我们