使用 jQuery 实现 wordpress 的 Ajax 留言

这篇文章早就想写了,但一直心里没什么底,不知道自己写出来的东西大家能不能够充分的理解和接受,呵呵!因为自己当初就被搞晕了,研究了好长一段时间,不过真正懂得其原理和用法后就可以灵活运用了。当然对于高手来说这些都是小菜了,写给对 jQuery 和 Ajax 还很陌生的人!!具体效果可看本站留言效果!

写在前面:

本文参考至:北极冰仔部落格 使用 jQuery 实现 Ajax 留言 ,我当时就是研究的这篇文章。另外特别感谢 Shawn ,在学习的过程中,他给了我很大的帮助,要不然真不知道自己会搞到什么时候,哈哈!他博客里有很多好玩和实用的东西,大家可以多去逛逛, :grin:

基本知识:

jQuery :jQuery是一个快速,简练的的JavaScript工具箱。它能够让你以简单的方式来操作HTML元素、处理事件、实现特效并为Web页面添加Ajax交互。是现在比较流行的一个 JS 库,而且很小,压缩后传输只有17KB左右!

Ajax :全称为“Asynchronous JavaScript and XML”(异步JavaScript和XML),是一种创建交互式网页应用的网页开发技术。体现在这里就是无刷新留言,留言后不需要刷新整个页面即可显示。在一定程度上加强了用户体验和减少了页面请求,提高访问效率。

过多的就不介绍了,大家可以去 Google 哈。

小小要求:

此方法基本不用修改自己的模版文件,如果你的 comments.php 足够标准的话。因为过程中会控制一些元素的动作,此时会用到元素的 ID 或 class 属性,记住这点很重要,要不然会被搞得莫名其妙。呵呵!具体的下面再说。

开始行动,

第一步:编写 comments-ajax.php  。

这个文件的代码不用管,复制就可以,不过要将你模版中 comments.php 中 li 之间的代码替换到指定的地方,即一条留言的样式代码。然后将此文件上传至模版目录下。下面是 comments-ajax.php 的代码:

<?php
if ($_SERVER["REQUEST_METHOD"] != "POST") {
    
header('Allow: POST');
    
header("HTTP/1.1 405 Method Not Allowed");
    
header("Content-type: text/plain");
    
exit;
}
$db_check = true;
function kill_data() {
    
return '';
}
function check_db() {
    
global $wpdb, $db_check;
    
if($db_check) {
        
// Check DB
        
if(!$wpdb->dbh) {
            
echo('Our database has issues. Try again later.');
        
} else {
            
echo('We\'re currently having site problems. Try again later.');
        
}
        
die();
    
}
}
ob_start('kill_data');
register_shutdown_function('check_db');
require_once(dirname(__FILE__)."/../../../wp-config.php");
$db_check = false;
ob_end_clean();
nocache_headers();
function fail($s) {
    
header('HTTP/1.0 500 Internal Server Error');
    
echo $s;
    
exit;
}
$comment_post_ID = (int) $_POST['comment_post_ID'];
$status = $wpdb->get_row("SELECT post_status, comment_status FROM $wpdb->posts WHERE ID = '$comment_post_ID'");
if ( empty($status->comment_status) ) {
    
do_action('comment_id_not_found', $comment_post_ID);
    
fail('The post you are trying to comment on does not currently exist in the database.');
} elseif ( 'closed' ==  $status->comment_status ) {
    
do_action('comment_closed', $comment_post_ID);
    
fail('Sorry, comments are closed for this item.');
} elseif ( in_array($status->post_status, array('draft', 'pending') ) ) {
    
do_action('comment_on_draft', $comment_post_ID);
    
fail('The post you are trying to comment on has not been published.');
}
$comment_author       = trim(strip_tags($_POST['author']));
$comment_author_email = trim($_POST['email']);
$comment_author_url   = trim($_POST['url']);
$comment_content      = trim($_POST['comment']);
// If the user is logged in
$user = wp_get_current_user();
if ( $user->ID ) {
    
$comment_author       = $wpdb->escape($user->display_name);
    
$comment_author_email = $wpdb->escape($user->user_email);
    
$comment_author_url   = $wpdb->escape($user->user_url);
    
if ( current_user_can('unfiltered_html') ) {
        
if ( wp_create_nonce('unfiltered-html-comment_' . $comment_post_ID) != $_POST['_wp_unfiltered_html_comment'] ) {
            
kses_remove_filters(); // start with a clean slate
            
kses_init_filters(); // set up the filters
        
}
    
}
} else {
    
if ( get_option('comment_registration') )
        
fail('Sorry, you must be logged in to post a comment.');
}
$comment_type = '';
if ( get_option('require_name_email') && !$user->ID ) {
    
if ( 6> strlen($comment_author_email) || '' == $comment_author )
        
fail('Error: please fill the required fields (name, email).');
    
elseif ( !is_email($comment_author_email))
        
fail('Error: please enter a valid email address.');
}
if ( '' == $comment_content )
    
fail('Error: please type a comment.');
// Simple duplicate check
$dupe = "SELECT comment_ID FROM $wpdb->comments WHERE comment_post_ID = '$comment_post_ID' AND ( comment_author = '$comment_author' ";
if ( $comment_author_email ) $dupe .= "OR comment_author_email = '$comment_author_email' ";
$dupe .= ") AND comment_content = '$comment_content' LIMIT 1";
if ( $wpdb->get_var($dupe) ) {
    
fail('Duplicate comment detected; it looks as though you\'ve already said that!');
}
$commentdata = compact('comment_post_ID', 'comment_author', 'comment_author_email', 'comment_author_url', 'comment_content', 'comment_type', 'user_ID');
$comment_id = wp_new_comment( $commentdata );
$comment = get_comment($comment_id);
if ( !$user->ID ) {
    
setcookie('comment_author_' . COOKIEHASH, $comment->comment_author, time() + 30000000, COOKIEPATH, COOKIE_DOMAIN);
    
setcookie('comment_author_email_' . COOKIEHASH, $comment->comment_author_email, time() + 30000000, COOKIEPATH, COOKIE_DOMAIN);
    
setcookie('comment_author_url_' . COOKIEHASH, clean_url($comment->comment_author_url), time() + 30000000, COOKIEPATH, COOKIE_DOMAIN);
}
@
header('Content-type: ' . get_option('html_type') . '; charset=' . get_option('blog_charset'));
$comment->comment_type = 'comment';
$comment_index = $_POST['comment_count'] + 1;
?>
<li id="comment-
<?php echo $comment->comment_ID; ?>">
<!-- 这里需要添加你的代码 -->
</li>
第二步:实现相应的 jQuery 代码:comments.js 。

这段代码大家尽量去理解,我也做了比较详细的解释。要不然会有莫名奇妙的问题出现,代码如下:

下载: comments.js
$(document).ready(function() {   
if ($('#commentform').length) {
    $
('#commentform').submit(function(){    //ID为 commentform 的表单提交时发生的函数,也就是整个留言输入框 form 的ID。
        
jQuery.ajax({
            
url: 'comments-ajax.php',    //刚刚创建的 comments-ajax.php 文件的位置,建议用绝对路径。
            
data: $('#commentform').serialize(),   
            
type: 'POST',
            
beforeSend: function() {
            $
('#commenterror').hide();
            
var submit='<div id="commentload" style="display: none;background: url("img/spinner.gif") no-repeat scroll 0 50%;margin: 0 auto;">Submitting Comment...</div>';    //创建名为 submit 的字符串,稍后插入,这里的样式大家自己根据需要定义,那个背景图片自己去下哈。
        
var error='<div id="commenterror" style="display: none;margin: 0 auto;"></div>';    //创建名为 error 的字符串
            $
('#comments').after(submit);    // 在ID为 comments 的元素后插入刚定义的 submit
            $
('#comments').after(error);    // 同样插入刚定义的 error
                $
('#commentload').slideDown()// 让submit 向下滑出
            
},
            
error: function(request) {    //发生错误时
                $
('#commentload').hide();    //隐藏  submit
                $
('#commenterror').show("slow").html(request.responseText); //显示 error
            
},
            
success: function(data) {
                $
('textarea').each(function(){
                    
this.value='';
                
});
                $
('#commenterror').hide().html();
                
if (!$('#thecomments').length) {
                $
('#pinglist').before('<ol id="thecomments"></ol>');}
                $
('#thecomments').append(data);    //向ID为 thecomments 的元素添加数据,也就是整个 ol 或 ul
                
var new_comment = $('#thecomments li:last').hide();    //让最新添加的数据隐藏
                
new_comment.slideDown(1000);    //再显示,这里是为了实现滑出的效果,不想要也可以直接显示
                $
('#commentform:input').attr('disabled', true);
                $
('#commentload').slideUp("slow");
        $
('#nocomment').slideUp("slow");    //这是针对我模版而加的,因为我模版在没有留言时会有个 nocomment 的元素,我要让添加一条留言后他自动隐藏,要不然会矛盾,呵呵,这个可以自行选择要或不要
        
setTimeout(function() {
                $
('#commentform:input').removeAttr('disabled');
                
}, 10000);        //这里是设置10秒之后才可以再次留言,自行设置,单位毫秒。
            
}
        
});
      
return false;
  
} );
}})

后续工作:

代码的工作差不多就到这里了,最后大家需要做的就是引入 jQuery 框架和刚刚建立的 comment.js ,注意comment.js 的引入要放在 jQuery 框架的后面,否则会无效的。

引入 jQuery 框架的方法可以看下这里

最后可能还会有一些小问题出现,大家要根据自己的模版来做具体的调试,我这里只是提供基本的思路和代码,呵呵,相信调试的过程中你会学到更多的东西的……

相关参考:

关于留言提交时的小图标可以到这里下载,有很多,总有你喜欢的。

另外,关于 jQuery 中用到的一些函数,可以参考下有关jQuery动画的一些基本知识。当然还有更权威的 jQuery API 参考文档中文版,所有的函数都可以在那里找到具体的用法和例子。

大家感兴趣的可以去试下,如果遇到什么问题可以留言,我会认真回答的。 :oops:

Share with Del.icio.us Google书签 Digg Live Bookmark Technorati Furl Yahoo书签 Facebook 百度搜藏 新浪ViVi 365Key网摘 天极网摘 和讯网摘 博拉网 POCO网摘 添加到饭否 QQ书签 Digbuzz我挖网

相关文章本月热门点击排行

  • N/A
Post a comment 2008/11/16 – 23:0416,961 Views
Post a comment | Trackback URL | RSS Comments 225 Comments
  1. 2010/01/21 at 18:38 | #201

    测试一下效果如果

  2. 2010/01/21 at 23:45 | #202
    jzinfoNotify

    测试下效果

  3. 2010/01/22 at 14:26 | #203
    xiao3Notify

    提交评论的时候会有一个Loading的过程吗~

  4. 2010/01/22 at 15:42 | #204

    奇怪!我的照这个来的,发表以后将实现滑出的效果评论变为为发表之前的最后一个啦!不知道为什么啊!我用的就是inove啊~

  5. 2010/01/26 at 08:57 | #205

    再来淘金!很难啊~

  6. 2010/02/02 at 11:32 | #206

    路过,测试

  7. 2010/02/02 at 12:20 | #207
    testNotify

    test again

  8. 2010/02/02 at 19:39 | #208

    @test
    again too

  9. 2010/02/03 at 15:19 | #209

    测试下效果如何..

  10. 2010/02/07 at 13:58 | #210

    学习了,谢谢提供

  11. 2010/02/09 at 21:43 | #211
    fgfdgfdNotify

    sadsadsadsadad

  12. 2010/02/10 at 13:30 | #212

    ご家族や恋人に夜の仕事を内緒にしたい、賃貸契約やキャッシング、ローンなどで短期間会社に籍を置きたい、様々なご事情で会社名を記入しなければいけない、会社にお客様宛の在籍確認のお電話があるので「只今席を外しております」「外出しております」「営業に出ております」などの対応をして欲しい、etc…などのお悩みを解決!!その他にもお客様のご要望にもお答え致します!
家庭の事情など様々な問題で夜のお仕事をしている方が多い中、アリバイ会社のOPSはそのようなお客様の「信用」と「信頼」を守るアリバイ対策をご提供致します。アリバイ会社のOPSはお客様のニーズにあわせたサービスを提供しています!どのようなことでもまずはご相談下さい!必ずお力になります!

  13. 2010/02/15 at 19:58 | #213

    谢谢,测试一下效果

  14. 2010/02/21 at 00:40 | #214
    testNotify

    测试

  15. 2010/02/21 at 03:41 | #215

    博客写的不错啊 比我年前来的时候多了很多东西啊 O(∩_∩)O哈哈~继续加油啊 回踩谢谢济南SEO(www.xinheng99.com)

  16. 2010/02/22 at 01:04 | #216

    路过测试~

  17. 2010/02/24 at 20:28 | #217

    感谢分享~学习了

  18. 2010/02/26 at 01:57 | #218

    拿下来看看效果

  19. 2010/02/26 at 01:57 | #219

    效果貌似很好…我下载来试试

  20. 2010/03/09 at 19:56 | #220
    玩玩Notify

    看看效果

  21. 2010/03/09 at 20:10 | #221
    玩玩Notify

    非常

  22. 2010/03/09 at 21:56 | #222
    玩玩Notify

    不错

  23. 2010/03/09 at 23:03 | #223

    夜光粉(www.gyfgcl.com)
    轻轻地楼上的走了,正如我轻轻地来,我轻轻地招手,我的哥们全都会一窝蜂地来……悄悄的我走了,我楼下的照样会来,我挥一挥衣袖,不带走一片云彩。

  24. 2010/03/14 at 01:42 | #224

    学习啦 有时间就来弄 …

  25. 2010/03/15 at 00:15 | #225
    FNotify

    测试效果

Comment pages 1 ... 3 4 5
7 Trackbacks
  1. By 修改inove主题 on 2008/12/06 at 21:17

    [...] 是通过jQuery来实现的.这里几乎没有遇到什么问题.详细修改方法: 使用jQuery实现wordpress的Ajax留言 Ctrl+Entert提交留言 这个很简单.几行js就实现了.详细查看 [...]

  2. By 观察博客运行速度与网速优化 on 2008/12/24 at 05:14

    [...] 还有关于js文件的合并,说到这里我要非常感觉xiaorsz,昨天晚上在他博客看到一篇使用jQuery 实现wordpress的Ajax 留言,心血来潮~很想想试试,在过程中遇到一点意外,大半夜也不好请教人家。就查看了他的博客源码想找点思路~结果发现他的源码js、css以及header都优化的非常好!~博主的细心可见一斑!最让我感兴趣的就是他的js文件的合并~为此我还特意找了不少关于js优化的资料才了解了这么做的真正用意!而且我最后不但学会了合并js文件也顺利的把他介绍的ajax留言给成功应用到博客中!:),其实我这款theme的comments.php由于当时不兼容wp2.7,于是找来了m12的theme来做参考,所以你现在看到的我的评论部分和m12 的布局很类似!同时也使用上了highslide4wp插件,发现这些精致的小功能和可爱的smilie,总能另人心情愉快! [...]

  3. By jQuery 优化评论方法总结 on 2009/01/02 at 16:24

    [...] Ajax 评论是 K2 模板自带的功能,北极冰仔同学将其中的代码提炼出来,写了使用 jQuery 实现 Ajax 留言。Xiaorsz 打算应用到自己的模板内,却遇上了问题,于是他找到我。在帮忙的过程中,我加入了评论提交到显示过程的过渡效果,于是有了 Xiaorsz 版使用 jQuery 实现 wordpress 的 Ajax 留言。 [...]

  4. By 近况~~ | Just A Blog on 2009/01/12 at 10:36

    [...] 2、没有网络那几天就在本地折腾Jat-Theme,现在的版本已经继承了UBD Block Ad Plugin广告轮放、添加了AJAX评论和Loading进度条。首页的布局也有一点点的变化,觉得这样的布局会清晰一点。不足之处还需要大家点评一下。。 [...]

  5. [...] 关于 AJAX 评论 ,忧伤的 Xiaorsz 同学,有篇教程《使用 jQuery 实现 wordpress 的 Ajax 留言》。 [...]

  6. [...] 火星了,现在才看到这样的好文。 [...]

  7. [...]       刚开始使用Quick Comments插件效果很好,这也是iNove主题作者mg12推荐的插件之一。但后来不知道怎么回事发现提交评论总是跳转到另一个页面,卸载重装该插件问题还是没有解决,有可能是装其他插件给弄成这样的。但不管到底是怎么回事,现在用不了总得小办法解决。既然插件不行,那么就试试看非插件方式吧。于是找到了Xiaorsz的这篇文章使用 jQuery 实现 wordpress 的 Ajax 留言,沿用了他的代码,做了一点细微的修改。总算恢复了ajax评论功能。 [...]

Post a Comment

(必填)

(必填,有回复时方便邮件通知)

(可不填,填了方便回访)

Sharing technology, recording life