由于本站采用了缓存,所以访客的留言都无法及时更新,感觉这样很不太友好,那么解决的办法有两个:1.去掉 缓存。2.采用 ajax异步刷新留言。为了保证缓存的优势,我采用了第二种 方案。
好了,决定了方案,便开始在网上搜索ajax评论插件,搜索到了几个,可能是由于我个人的原因吧 ,总是安装失败。不得以,只好自己动手了。
基于ajax评论实现的难点有3个:
- 如何在不改变wp的代码的情况下编写代码,这一点wp做得很好,评论的php文件(wp-comments-post.php)中有redirect url这个东西,我可以用它来回传评论处理的状态
- ajax post和get的实现。这个我通过外加js代码来完成。
- 如何在读取已知post的评论。这个问题是困扰了我最久的问题。我查询了wp的 API,wp的 tags,都没有完美的办法,后来我想到了一个巧妙的方法,那就是在single.php的模板中根据URI做判断。如果URI中有action=show_comments那么我就直接把comments.php文件 include进来,同时在comments.php文件中也做判断。代码如下:
< ?php if( 'show_comments' == $_GET['action']) ://如果是仅仅显示评论?> < ?php if (have_posts()) :?> < ?php comments_template(); ?> < ?php endif;?> < ?php elseif( 'refresh_comments' == $_GET['action'])://如果是提交之后的显示?> < ?php // 这里不显示内容,如果显示则在javascript中判断有错误出现,即留言失败?> < ?php else://否则则正常显示?> < ?php include (TEMPLATEPATH . "/ThemeCache/cache_start.php");?> < ?php include (TEMPLATEPATH . "/config.php");?> < ?php get_header(); ?> //这里照常显示 < ?php endif;?>
那么对于 comments处理的方法最重要的就是这里
< ?php if( strstr ( $_SERVER['REQUEST_URI'], '?') ){ /* if this is no ? in the URI */ $URL = $_SERVER['REQUEST_URI']."&action=show_comments"; $REDIRECT = $_SERVER['REQUEST_URI']."&action=refresh_comments"; }else{ $URL = $_SERVER['REQUEST_URI']."?action=show_comments"; $REDIRECT = $_SERVER['REQUEST_URI']."?action=refresh_comments"; //通过redirect url将留言处理成功后的页面返回到 action=refresh_comments, //这样我就可以在single页面将处理的结果返回到ajax }>
具体的效果,请参考本站的评论!如果你对此很感兴趣。可以下载。下载链接在这里cosbeta_ajax_comments.zip
补充:修改了一个bug,由于评论时填写用户 email的form也被cache了,所以第一个人打开页面评论后,cache就记录了他的信息,后面的人留言就可以用第一次的留言信息进行留言,如本页的第三楼第四楼,现在通过js调用此form,已经解决问题,如果有朋友需要,请留言!

不知是wp的bug还是我ajax程序的bug,留言删除后,居然 显示的“x条评论 ”不对?
还是cache惹的祸,已经修正了,爽,逛街去了
还是cache惹的祸,已经修正了
[quote]
还是cache惹的祸,已经修正了
[/quote]
试试看,呵呵
帮你测试
别测了,已经没有问题了哈,呵呵
[quote]帮你测试[/quote]
测试一下,看看效果。
还是cache惹的祸,已经修正了,爽,逛街去了
[quote]
还是cache惹的祸,已经修正了,爽,逛街去了
[/quote]???
3,4楼,并不是我留言
我已经知道了哈,那个是cache的原因,因为你留言后就产生cache了,所以别人访问的时候还是记录下了你的信息,显示就是你的留言,我现在已经改进了,留言的姓名输入框通过js动态调用,就没有上面描述的问题了,呵呵[quote]
3,4楼,并不是我留言
[/quote]
不错,和K2会不会有冲突?
没有研究过K2,不过要做进去应该也不是很困难的事情!
不错的东东
好东西
什么效果呢…
好像Cookie有点问题
我这里正常
试试看
set
不知道效果怎么样,试试!
谢谢楼主,谢谢你的无私分享
不错的东西