Home » Code » WordPress中的Ajax操作

WordPress中的Ajax操作

一开始是打算给评论分页弄成Ajax的,想着只加载评论就可以了,不用把文章内容等一大堆同时再取一遍,节省点资源加快点速度。于是开始搜索“wordpress ajax comment”,看到不少结果让我哭笑不得,做法是请求分页页码里边的链接,阻止跳转,将结果返回为html,然后使用jQuery用整个页面的html代码作为参数创建对象查找到评论部分拿它去替换当前页面的评论部分。对于这个做法,只是没有了跳转那一步,做的查询工作跟跳转完全是一样的。搞成Ajax最大的目的是减少查询只取需要的部分,这个都没了,做它基本没有意义。

后台如何接收ajax请求?我想着添加一个php文件来处理,在引入这个php文件时,WordPress环境都已经准备好,也就是除模板标签外的函数都可以用,就像一般的框架中到了控制器那干活那一步。要如何添加这么一个php文件,WordPress有没有这样的机制?我知道新建页面模板可以,但它毕竟要新建一个页面(跟发一篇文章差不多),响应时已经查询了数据库获得该页面的内容,多余了。又了解到template_redirect(action)与template_include(filter),前者是已经运行了主查询,就差最后一步将数据输出了,明显也不符合。后者是根据系统机制判断了该加载哪个模板,但还没有加载还没有进行查询,这时候引入其他非常规模板,是不会进行主查询的(引入常规模板,则进行该模板该有的查询。当然,这里面有些是我猜的,但实测好像就是这么回事),这个理论上是可行的。比如在template_include这个filter上添加如下处理:

function xigua_load_template($original_template)
{
    if (!empty($_SERVER['PATH_INFO']) && $_SERVER['PATH_INFO'] === '/fuck')
    {
        return get_template_directory().'/page-fuck.php';
    }
    else
    {
        return $original_template;//系统判断本来要加载的模板
    }  
}
add_filter('template_include', 'xigua_load_template');

这时候,访问“http://你的网站/fuck”,就能加载page-fuck.php,在page-fuck.php里边,可以进行各种查询,如get_post(1)查询ID为1的post。在这时,系统是没有进行其他多余查询的,WordPress环境已经准备好,查询分页评论神马的目测也OK(为什么说目测,因为写这文章之前还没有测试)。

其实,WordPress早已经为我们准备好了这么一个文件来影响Ajax请求,它就是/wp-admin/admin-ajax.php。在这个文件当中,除了准备WordPress环境,还能看到其他很多系统准备好了的响应action。我们要做的,就是请求它,带上是action参数,值是处理这次请求的action函数,就一切OK了。action函数可以使用系统自带的,也可以自己在functions.php中添加。在admin-ajax.php中会分用户 是否登陆两种情况执行来do_action,因此要往两个钩子上挂载函数。如做一个评论的顶踩功能,登陆和未登陆处理函数一样,在functions.php中就这样子写:

add_action('wp_ajax_xigua_comment_vote', 'xigua_comment_vote');//登陆
add_action('wp_ajax_nopriv_xigua_comment_vote', 'xigua_comment_vote');//未登陆

请求的URL则为:

/wp-admin/admin-ajax.php?commentID=1748&event=like&action=xigua_comment_vote

WordPress发展多年,很多东西其实早已经准备好了。一开始的“如何添加一个php文件使得访问到它时已经准备好了WordPress环境而又没有进行不必要的查询”,其实也是挺意思的一个想法,不是吗。

参考链接:
http://blog.wpjam.com/m/using-template_redirect-and-template_include-in-right-way/
https://fatesinger.com/506
https://codex.wordpress.org/AJAX_in_Plugins

Leave a Reply

Your email address will not be published. Required fields are marked *

*

Time limit is exhausted. Please reload CAPTCHA.