WordPress分页评论Ajax载入

很久以前在网上乱逛,发现一种很好的效果,那就是评论分页可以ajax无刷新载入。当时就搜了一下教程只搜到了Kayo的文章,可是不知我哪里弄错了没成功。今年过年后在家无聊一鼓捣竟然被我整好了。分页的评论ajax无刷新载入其实多说就自带了这种效果,还有许多评论插件也有这些效果,不过本文介绍的是纯代码实现!
2014-03-11 19:10 Update 在js文件中beforeSend最后一行添加:
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
<code>$body.animate({scrollTop: $('#comments').offset().top - 65}, 800 );</code>
 
$body.animate({scrollTop: $('#comments-list-title').offset().top - 65}, 800 );
/*
$body 代表 body 的 DOM,$(‘#comments-list-title’).offset().top – 65 
是评论列表的标题到页面顶部的距离再减去 65。
因此这一句是控制整个页面向上滑动到评论列表标题的位置以下 65 像素(再往下 65 像素是为了确保能看到这个标题),
800 是滑动的时间,800毫秒。
http://kayosite.com/?p=1916#comment-8925
 
$(selector).animate(styles,options)
animate() 方法执行 CSS 属性集的自定义动画。
该方法通过CSS样式将元素从一个状态改变为另一个状态。
.animate : http://www.w3school.com.cn/jquery/effect_animate.asp

scrollTop() 方法返回或设置匹配元素的滚动条的垂直位置。
scroll top offset 指的是滚动条相对于其顶部的偏移。
如果该方法未设置参数,则返回以像素计的相对滚动条顶部的偏移。
scrollTop : http://www.w3school.com.cn/jquery/css_scrolltop.asp

offset() 方法返回或设置匹配元素相对于文档的偏移(位置)。
.offset : http://www.w3school.com.cn/jquery/css_offset.asp
*/
(所以多说用户就不需要折腾了。。。)好了,废话少说~ 等等,还有一句废话。您可以先去留言板看看分页载入效果。
嗯,对了,今天是一位好兄弟的生日~So~特意选一个特殊的时间定时发布,22:22:22——— 二货,生日快乐!

第一步 准备

  1. 后台“设置-讨论”启用评论分页,本站设置的是10条评论每页。(这里的10条指的是主评论,不含回复)
  2. 如果您使用主题的评论分页导航只有“早期评论“”较新评论”两个链接那么请用以下代码替换默认导航。
    1
    2
    3
    4
    5
    
    
    
      < ?php paginate_comments_links('prev_text=«&next_text=»');?>
    
     
  3. 评论分页后据说会对seo造成一定的影响,因为这几页内容差不多相同但地址不一样,因此可以通过<meta>标签解决:
     1
     2
     3
     4
     5
     6
     7
     8
     9
    10
    11
    12
    13
    
     
    //header.php
    <?php if( is_single() || is_page() ) {
      if(function_exists('get_query_var') ) {
        $cpage = intval(get_query_var('cpage'))
        $commentPage = intval(get_query_var('comment-page'));
      }
      if( !empty($cpage) || !empty($commentPage) ) {
        echo ''
        echo "n";
      }
    }
    ?> 
  4. 还需要设置一个Loading提示显示在加载评论时,不至于让用户感觉突然不知发生了什么。 在主题comment.php里插入,假设评论内容是这样的结构。(一般都是这样的)
     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
    
    
    <div id="comments" class="comments-area">
    	<h2 class="comments-title">%
    
    <!--Loading-->
    <div id="loading-comments"> <img alt="loading"/> Loading </div>
    
    	<lnav id="comment-nav-above" class="comments-navi navigation comment-navigation paging-navigation " role="navigation">
    		<?php paginate_comments_links('prev_text=«&next_text=»');?>
    		
    	</nav>
    
    	<ol class="comment-list">
    		< ?php
    			wp_list_comments( array(
    				'style'      => 'ol',
    				'short_ping' => true,
    				'avatar_size'=> 34,
    			) );
    		?>
    	</ol>
    
    	<nav id="comment-nav-below" class="comments-navi navigation comment-navigation paging-navigation " role="navigation">
    
    		<?php paginate_comments_links('prev_text=«&next_text=»');?>
    	</nav>
    
    </div>
    这里我们需要记住各个模块的id和/或class,等下的关键代码需要对应你的结构修改选择器

第二步 加载jQuery库

是的,这是使用jquery库的代码。wordpress自带了jquery,但我们要的不是那个。(为什么?我怎么知道……)嗯,加载Google CDN的呗:
1
2

<script type=”text/javascript” src=”http://ajax.useso.com/ajax/libs/jquery/2.0.3/jquery.min.js”>

第三步 关键代码

这货才是关键。。。
 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
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54

/*wordpress评论分页ajax载入
 *
 *Kayo
 *WordPress Ajax 
 *http://kayosite.com/ajax-turn-page-for-wordpress-comments-list.html
 *
 * http://fatesinger.com/731.html
 *
 *  http://youthlin.com/?p=480
 *
 */
 
//ready里
jQuery(document).ready(function($) {
  $body = (window.opera) ? (document.compatMode == "CSS1Compat" ? $('html') : $('body')) : $('html,body');
  //
  $(document).on('click', '.comments-navi a', function(e) {//
    e.preventDefault();//
    $.ajax({//ajax无刷新载入评论
    /*
    *W3CSchool的教程
    *jQuery ajax - ajax() 
    *http://www.w3school.com.cn/jquery/ajax_ajax.asp
    */
      type: "GET",
      url: $(this).attr('href'), //
      beforeSend: function() {//

         //
         $('.comments-navi').remove();
         $('.comment-list').remove();
         
         $('#loading-comments').slideDown();//Loading提示
          ////////////////////////////////
         $body.animate({scrollTop: $('#comments').offset().top - 65}, 800 );
         },//beforeSend
      dataType: "html",//html
      success: function(out) {//
         result = $(out).find('.comment-list');//(html类型)
         abovenav = $(out).find('#comment-nav-above');//
         belownav = $(out).find('#comment-nav-below');//
         $('#loading-comments').slideUp(550);//Loading
         $('#loading-comments').after(result.fadeIn(800));//(result)Loading的后面(.after)
        result.before(abovenav);//
        result.after(belownav);//
         }//success
    });//$.ajax
  });//function(e)
});//ready
/*
 *
 *abovenav
 */

第四步 CSS设置

本站是这样的:(好吧,CSS也是来自Kayo)
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14

<style> 
#loading-comments {
display: none; //
width: 100%; //
height: 45px; //45
background: #a0d536; //背景淡绿色
text-align: center; //
color: #fff; //文本颜色
font-size: 22px; //
line-height: 45px;//45
}
 </style>

—————————————————————————————————————— OK!大功告成!! 主要参考自《WordPress Ajax 评论分页—KayoSite》 PS:使用2014默认主题的用户—— 可以给评论导航加一个class,使它样式和文章分页一样好看:
<nav id="comment-nav-above" class="comments-navi navigation comment-navigation paging-navigation " role="navigation">

Reader Echoes

79 comments

  • #976leejon
    ajax评论测试
  • #974bookcase
    测试下评论
    • #975Youth.霖
      回复 @bookcase最近不知怎么了,评论提交很慢。。。
  • #973小二苘
    流泪 我用了这个代码,点第一次分页的时候挺正常的,再点击分页就没反应了,不翻页了
  • #967软件酷(Softku)
    好像没效果
    • #968Youth.霖
      回复 @软件酷(Softku)仔细看看选择器class名id名之类的静下心看看就好使了~
    • #969软件酷(Softku)
      回复 @Youth.霖今天再试试,原先可以的,后来把这个功能去掉之后就不知道为什么不可以了
  • #966试试
    试试评论效果
  • #963恋羽
    貌似我也打算弄这个来着,看哪天有时间弄下
  • #960Era
    没有成功:没有效果…:( 加了js后能出现loading,但就没下文了,你最后是怎么解决的呢?
    • #961Youth™霖
      回复 @Era当初我可能是class和id没对应,我就搁置了一段时间,后来从头开始竟然一下就好了。 发呆
    • #962Era
      回复 @Era这确实相当的凌乱。。。 搞不定的飘过。。
  • #957彼岸时光网
    这个不错,支持收藏。
    • #958Youth™霖
      回复 @彼岸时光网其实还有个小问题,我这里点击下方的页码,加载后怎么使它跳到新评论列表顶部?
    • #959Youth™霖
      回复 @Youth™霖已经更新解决了。。。
  • #955saxo bank cyclisme
    操作起来会不会很复杂?
  • #952无节操妹子版可爱颂
    这个样子也可以嘛??
  • #951寇铈鑫
    一直使用多说 所以对于这个分页 我还是不用操心的
  • #948tennfy
    一直不太了解ajax怎么使用,有机会学一下
    • #950Youth™霖
      回复 @tennfy前两天在火车上没网今天才回复喔 实际上我也都不懂php别说ajax了。。。
  • #947博客互推联盟
    看到博主分享这么多内容,特别想把这些内容让更多博友看到,如果博主能够经常跟其他博友互动,希望博主能够加入到“博客互推联盟”,这里有很多很勤奋的博友,和您一样,每天在坚持为大家分享好的内容。 在这个互联网快速变革的时代,我们还在坚持,但我们不想孤军奋战,让更多博友看到你,让我们彼此多一点交流,一起发展。
  • #945Dzing
    学习了
    • #946Youth™霖
      回复 @Dzing受宠若惊!
    • #970小兽
      回复 @Dzing学习了。 发现两个bug 1.点击页数,再点回复其他人的评论,会出现卡,而且页面URL会变 2.点击回复之后,在点击分页数,留言框就不见了,留着上一页内容消失了
    • #971Youth.霖
      回复 @小兽关于1卡应该是网络慢,应为这是伪ajax,实际上还是请求了整个页面再用选择器把需要的内容呈现。不过我刚刚测试了下url没变啊。 关于2,的确是bug,不过我也不会修改 撇嘴 因为其实我不懂js。。。留言框不见了是因为点击回复后留言框出现在回复的下面,再点击页码时把.comment-list给remove了,而result里不包含留言框#response: <code>result = $(out).find('.comment-list');//从返回数据中(html类型)找到评论</code> 感谢反馈。
    • #972Youth.霖
      回复 @Youth.霖好吧,1中url在有的情况下是会变,可能是?replytocom=评论id这个参数
  • #943雨林亭
    我的ajax评论框是从别的主题里面复制出来的,制作方法不懂。 收录的话其实是那种ajax加载文章才会影响,翻页应该没什么,我首页也是用ajax翻页的,挺好的。 不过你这个翻页的loading好像没显示出来呀~
    • #944Youth™霖
      回复 @雨林亭什么主题这么厉害哇? 说实话其实seo我不懂,貌似ajax载入新页面后把之前一页压入浏览器历史,并使新页面地址显示在浏览器地址栏就不影响。 至于翻页,是因为分页的内容(文章内容)都一样而地址不同,所以可能不利于seo。。 还有我这里的Loading提示我自己翻页会显示的啊,在上方的评论页码之上
  • #941c
    ajax大赞,搜索引擎搜不到评论实际上有利于seo。
    • #942Youth™霖
      回复 @c嗯嗯,听说是这样的,所以评论分了页就要阻止收录
  • #939PHP二次开发
    赞一个!
  • #935Era
    绿色的ajax有点刺眼,不太美。。
    • #936Youth™霖
      回复 @Era呃,你是说这个Loading的背景吗
    • #940Era
      回复 @Youth™霖嗯 是的。 这个功能还是比较好的。 回头用上试试。
  • #933cervelo jersey
    看起来好像不错,值得一试。
  • #926
    唉,都懒得折腾了。。
    • #928Youth™霖
      回复 @东我也主要是在家没什么干才折腾了下的

表情

评论提交后需经审核才会显示。