有段时间没有写些技术类的文章了,(p.s,似乎其它文章也没多写。。。)。先找几个借口搪塞下,比方说:
“最近比较忙”,呸,老套!
“最近没心情”,嗯,有点挂谱,
哎,找个理由其实也是蛮难的。看来,也得将嘴拙这列到缺点清单去了。
最近,最新版的wordpress 2.7带来了全新的后台界面,加入了大量的特效,极为漂亮。并且也新增了不少特性,如评论分页和嵌套式回复。觉得有时间的话,是要考虑时下,与时俱进下,改进下ThinkAgain的模板。另外,晚上和网友回mail的时候,看到他提及尝试给主题添加ajax评论等,看来ajax的应用似乎在wordpress越来越吃香了。咱也得跟上脚步,来写篇ajax相关文章。
什么是ajax?这问题问得多好哈。晕倒先。如果对该标题没有兴趣的童鞋可以就此打住不用看了。ajax全称为Asynchronous JavaScript and XML,是一种基于javascript的动态网页开发技术吧。可以说ajax技术的发展极大扩展了javascript的应用。简单地一句话概括,利用javascript将用户请求发送给服务器,服务器接收后处理请求并将结果反馈javascript,最后javascript将结果显示在网页上。原理知道后,可以得知了需要代码处理的也就是对应这么3个步骤了:
1. 如何利用javascript将数据提交给服务器?
2. 服务器如何处理请求?
貌似很复杂吗?又是javascript,又是服务器处理等等。其实不然啦,别忘了有很多高手早就给小白们开发了一大箩筐好东西了。比如,jquery。
什么是jquery?又来了,Google去吧。jquery是个javascript库,其内置了非常强大且简单调用的ajax支持。这点是我们想使用的。而从2.3起,wordpress已经内置jquery了,只是在应用jquery上,在代码撰写上和原jquery略有不同而已,见文末补充资料2。
好了,既然wordpress已经内置jquery了,问题似乎很容易解决了。可以利用jquery来提交和处理ajax请求,用wordpress来搞定ajax请求。一切都是wordpress现成的,我们所做的只是如何合理地调用了。回顾下我们的口号,嘿嘿:
“没有蛀牙”。???有没有搞错?说起口号,顺口就喊上了,更正下,应该是:
“最大化利用Wordpress内置资源。”
废话一大堆,转入正题,12行代码就可以给主题挂上ajax?当然,没有搞错了,继续滚动鼠标往下看。这里假设,读者能简单修改php,且愿意动手测试(否则也很难体会其中乐趣了)。
先贴上代码。建议在本地服务器上测试。
1: <?php wp_enqueue_script('jquery');?>
2: <script type='text/javascript'>
3: function my_ajax_example(){
4: jQuery.post("<?php echo get_option('siteurl');?>/wp-admin/admin-ajax.php",
5: {action:"my_ajax"},
6: function(str){jQuery("#ajaxtest").append(str);});}
7: </script>
8: <?php add_action('wp_ajax_my_ajax', 'my_ajax_example');?>
9: <?php function my_ajax_example(){ ;?>
10: <?php echo '<b>I LOVE WORDPRESS!!!</b>'; ?>
11: <?php exit;};?>
12: <input type="button" value="My Ajax Example" onclick="my_ajax_example();"><div id="ajaxtest"></div>
步骤1:将第1-7行代码放到header.php内</head>标签前面。用wp_enqueue_script来加载wp内置的jquery库,2-7行是加载测试用的js代码。其中调用jquery的post函数来发送ajax请求和接收反馈。
步骤2:将第8-11行代码添加到functions.php里面。任意位置即可。但要注意不要出现语法错误。第8行将自定义函数my_ajax_example添加到wp的ajax api接口。9-11行定义了接收ajax请求后的处理和输出内容。这里比较简单,只是输出反馈给js这么一句发自内心的话:“I LOVE WORDPRESS!!!”。
步骤3:将第12行代码添加到主题模板内拟显示ajax测试效果的地方。随便找个地方如single.php等添加进去。这行代码将会输出一个名为My Ajax Example的按钮,点击这个按钮后,即会发出一个ajax请求,然后显示ajax的反馈效果。这里是在按钮下面输出“I LOVE WORDPRESS!!!”。注意,用户应该要根据自己的需求,如ajax评论等,来修改接收ajax请求的函数内容。比如,ajax评论的话,这里就需要定义数据库全局变量$wpdb,然后添加其它语句用于将评论添加到数据库内。
通过这几行简单的代码,已经给wordpress主题挂上了Ajax。当然,这是个非常简单的,利用wordpress提供的api和内置的jquery进行ajax应用的例子。通过这个例子,主要是想提醒Developer们,可以利用wordpress提供ajax的api接口来添加ajax。至于其它应用么,那是**带进门,修行呢是要靠个人的。另外,ajax的应用,还有很多要注意,比如安全性等等。这些进门后,自己都要好好考虑的。换句话说,我还没认真考虑呢。p.s,注意利用wordpress的check_ajax_referer()。
上面的代码测试完毕了吧。嗯,似乎少了点什么?怎么没有骨碌碌转的东西,比如这个:
1: function my_ajax_example(){
2: jQuery("#ajaxtest").append('<img src="http://www.thinkagain.cn/wp-content/uploads/2008/12/loading.gif"/>');
3: jQuery.post("<?php echo get_option('siteurl');?>/wp-admin/admin-ajax.php",{action:"my_ajax"},
4: function(str){
5: jQuery("#ajaxtest").empty();
6: jQuery("#ajaxtest").append(str);});}
注意,是添加了
语句1,jQuery("#ajaxtest").append(‘<img src="http://www.thinkagain.cn/wp-content/uploads/2008/12/loading.gif"/>’);
即在显示内容前,显示该loading图片。建议将这个图片地址改为本地地址,这样加载速度会快些。以及
语句2.jQuery("#ajaxtest").empty();
在显示内容前,将原内容清空。
p.s,加载内容前显示这种loading图片似乎是ajax的惯例了。处理方法也不单单是上面代码提到的这种,也可以利用jquery提供的其它ajax事件来激活。
补充资料,有兴趣延伸阅读下,(授之以渔):
用文本编辑器打开wp-admin/admin-ajax.php文件,注意Line1040(2.7版)的这行代码:do_action( ‘wp_ajax_’ . $_POST['action'] );
所以,上述代码中第5行,就是提交了一个action变量,其值为“myajax”;
要注意,调用jquery是用jQuery代替$。
转载文章请注明转载自:ThinkAgain - Let's Blog!


























2008.12.19 Friday 2:43 am
WordPress内置的函数功能太丰富了。
2008.12.19 Friday 10:33 am
先收下了,有时间在仔细研究,嘿嘿
2008.12.19 Friday 9:01 pm
不错,支持个!
2008.12.19 Friday 9:41 pm
帅帅的特效
2008.12.19 Friday 11:10 pm
一切…都先走本地
2008.12.20 Saturday 12:02 am
不小心又一次抛砖引玉了 哈哈…ajax的确帅气,我宁可损失图片,也要上效果啊 哈哈
2008.12.20 Saturday 12:09 am
@冰古 这就是wordpress最吸引人的地方了。
@i.robot 和@辐射鱼 这里只是抛砖引玉,真正的帅是要自己弄出来的。
@MY-Hou 安全第一麽。
@Yacca 想要上效果的话,好好利用wordpress内置的javascript库,如jquery和其插件dimension,UI等等。你的主题会变得很炫的。
2008.12.20 Saturday 1:16 am
好玩的东西,先收着~
2008.12.20 Saturday 3:40 pm
其实早就想看看ajax和wordpress插件的东西,但是一直也是给自己找借口,哈哈,太懒了
2008.12.21 Sunday 12:15 pm
wordpress内置的东西太多了, 但用上了的又太少了
2008.12.21 Sunday 2:11 pm
了解了解~
不知道ThinkAgain最近有什么插件大作?
2008.12.21 Sunday 10:18 pm
这些技术性太强的我没有什么天赋去懂,只关注现成的活!
2008.12.25 Thursday 8:58 am
Merry Christmas.
2008.12.25 Thursday 2:25 pm
呵呵,博主心情貌似不错,这篇日志写得很有调皮的味道啊。
圣诞快乐,哈哈
2008.12.29 Monday 11:29 am
loading图片很好看
2008.12.29 Monday 7:35 pm
我是来测试留言的
2009.01.01 Thursday 11:35 am
你好,我是驴头狗尾的博主,现在原来的boryee.cn域名不用了,改用www.TheWonder.cn了,麻烦你改一下链接,谢啦。
2009.01.01 Thursday 1:03 pm
@solincess 链接地址已经该啦。Happy New Year!
2009.01.01 Thursday 3:34 pm
没用过JQUERY,以后再研究
2009.01.01 Thursday 6:32 pm
入门,嗯,适合我这般菜鸟,考完试再慢慢研究!谢谢你的教程!
2009.01.10 Saturday 5:29 pm
感觉好复杂,还是先不要了,有你的回复插件就可以啦!
2009.01.23 Friday 4:42 pm
直接复制代码么,有什么语法要求呢。貌似我那里不成功。
2009.02.17 Tuesday 9:12 am
ajax不熟悉,不过看你的教程应该可以搞定,不错。
2009.02.19 Thursday 9:20 pm
2.7也能用的吧
2009.03.24 Tuesday 11:21 am
强悍,测试
2009.04.10 Friday 9:45 am
写得真不错,现在还用不上
2009.05.17 Sunday 4:09 am
我这天在试,你有没有发现代码的效果只在FF下有效?在IE下会输出一个“-1”,却得不到正确的值?有没有解决的办法?
2009.05.17 Sunday 6:27 pm
[...] 最后我找到12行代码给Wordpress主题挂上AJAX这篇文章提及到这个admin_ajax_函数接口的简单例子,自己尝试再更改主题的ajax调用,结果就是成功了!但是……条件是在Firefox下,在IE下会输出一个,仅仅一个数值:“-1”。失败。。。 [...]
2009.05.30 Saturday 10:25 am
@Jinwen 一样..
2009.06.19 Friday 4:32 pm
收藏
2009.06.27 Saturday 9:56 am
好东西啊,学习了
2009.12.19 Saturday 4:32 am
@我被WordPress中的admin_ajax折腾着 | Jinwen Say
有没有解决办法呀?
2009.12.30 Wednesday 1:18 am
我还是实现不了这个功能。哭泣啊。。
2010.04.10 Saturday 5:28 pm
唉,主题不支持ajax,装了@reply或者wp thread comments 都用不了,该怎么办呢~~