利用AJAX实现WordPress中的文章列表及评论的分页功能


Posted in Javascript onMay 17, 2016

文章列表页分页
一.加载 jQuery 库
既然是 jQuery 驱动的 Ajax ,加载 jQuery 库是必须的。

二.文章列表格式
在你的文章列表页面(首页 index.php、归档 archive.php )需要确保有以下类似的结构

<!-- 包含所有文章的容器 -->
<div id="content">
  <!-- 各文章的容器 -->
  <div class="post"></div>
  <div class="post"></div>
  <div class="post"></div>
  <div class="post"></div>
  <div class="post"></div>
</div>

三.加入默认导航
因为 Ajax 分页每次获取的是下一页的内容,因此只需调用 WordPress 的默认导航。在你的 index.php (或是其他文章列表页面)加入以下代码,生成默认的 WordPress 导航。

<div id="pagination"><?php next_posts_link(__('LOAD MORE')); ?></div>

四.Ajax 获取下一页
在你的主题 js 文件里加入以下代码

// 使用 live() 使 js 对通过 Ajax 获得的新内容仍有效
  $("#pagination a").live("click", function(){
    $(this).addClass("loading").text("LOADING...");
    $.ajax({
  type: "POST",
      url: $(this).attr("href") + "#content",
      success: function(data){
        result = $(data).find("#content .post");
        nextHref = $(data).find("#pagination a").attr("href");
        // 渐显新内容
        $("#content").append(result.fadeIn(300));
        $("#pagination a").removeClass("loading").text("LOAD MORE");
        if ( nextHref != undefined ) {
          $("#pagination a").attr("href", nextHref);
        } else {
        // 若没有链接,即为最后一页,则移除导航
          $("#pagination").remove();
        }
      }
    });
    return false;
  });

 

五.滚动触发翻页
如果想当鼠标滚动到接近页面底部时自动翻页,则可以把代码改成下面的样式

// 给浏览器窗口绑定 scroll 事件
$(window).bind("scroll",function(){
// 判断窗口的滚动条是否接近页面底部
if( $(document).scrollTop() + $(window).height() > $(document).height() - 10 ) {
  $(this).addClass('loading').text('LOADING...');
  $.ajax({
    type: "POST",
    url: $(this).attr("href") + "#content",
    success: function(data){
      result = $(data).find("#content .post");
      nextHref = $(data).find("#pagination a").attr("href");
      // 渐显新内容
      $("#content").append(result.fadeIn(300));
      $("#pagination a").removeClass("loading").text("LOAD MORE");
      if ( nextHref != undefined ) {
        $("#pagination a").attr("href", nextHref);
      } else {
      // 若没有链接,即为最后一页,则移除导航
        $("#pagination").remove();
      }
    }
  });
}
});

 

六.添加导航 css
为导航添加一段 css 美化一下,另外还可以准备一张 gif 图来表示正在加载,下面是 Melody 的样式:

#pagination {padding: 20px 0 0 30px; }
#pagination .nextpostslink {width: 600px; color: #333; text-decoration: none; display: block; padding: 9px 0; text-align: center; font-size: 14px; }
#pagination .nextpostslink:hover {background-color: #cccccc; text-decoration: none; border-radius: 5px; -moz-border-radius: 5px; -webkit-border-radius: 5px; }
#pagination .loading {background: url("images/loading.gif") 240px 9px no-repeat; color: #555; }
#pagination .loading:hover {background-color: transparent; cursor: default; }

评论分页
一.准备
加载 jQuery 库,这个不解释了。

二.开启 WordPress 评论分页
打开 WordPress 后台 - 设置 - 讨论,在“其他评论设置”中勾选分页显示评论,设置一下评论数目,这里的评论数目仅计算主评论,回复评论不作计算。这里我填了比较大的数字(15),因为评论分页分得太细会使用户不便于阅读之前的评论。

在后台开启评论分页后,在 comments.php 中需要添加分页导航的地方加入以下代码(如主题中有类似代码则无须再添加,另外代码中的 nav 标签为 HTML5 标签,若主题没有使用 HTML5 则有 div 代替即可。)

<nav id="comments-navi">
  <?php paginate_comments_links('prev_text=?&next_text=?');?>
</nav>

三.评论分页的 SEO
从 SEO 的角度看,评论分页会造成重复内容(分页的内容正文都一样,并且 keywords 和 description 也相同),这样对于评论很多的博客很容易因为重复内容太多而降权,因此需要在 SEO 方面作出一些处理,最为方便有效的方法是使用 meta 标签。在你的 header.php 原有的 meta 标签下加入以下代码,这样分页的页面便会禁止被搜索引擎收录,防止内容重复。

<?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 '<meta name="robots" content="noindex, nofollow" />';
    echo "\n";
  }
}
?>

 
四.Ajax 评论
根据上文所述,现在主题中已经有评论分页了,要做到 Ajax 的评论分页,只需 JavaScript 的配合,不过在这之前首先要在评论列表前加入一个元素,用于在显示新一页评论列表时表示列表正在加载。假设主题模板 comments.php 的评论模块结构如下:

<div class="comments">
  <h3 id="comments-list-title">Comments</h3>
  <!-- 显示正在加载新评论 -->
  <div id="loading-comments"><span>Loading...</span></div>
  <!-- 评论列表 -->
  <ol class="comment_list">    
    <li>...</li>
    <li>...</li>
    <li>...</li>
  </ol>
  <!-- 评论分页导航 -->
  <nav id="comments-navi">
    <a class="prev page-numbers" href="#">1</a>
    ...
  </nav>
</div>

在你的 js 文件中加入以下 js 代码实现评论分页

// 评论分页
$body=(window.opera)?(document.compatMode=="CSS1Compat"?$('html'):$('body')):$('html,body');
// 点击分页导航链接时触发分页
$('#comments-navi a').live('click', function(e){
  e.preventDefault();
  $.ajax({
    type: "GET",
    url: $(this).attr('href'),
    beforeSend: function(){
      $('#comments-navi').remove();
      $('.comment_list').remove();
      $('#loading-comments').slideDown();
      $body.animate({scrollTop: $('#comments-list-title').offset().top - 65}, 800 );
    },
    dataType: "html",
    success: function(out){
      result = $(out).find('.comment_list');
      nextlink = $(out).find('#comments-navi');
      $('#loading-comments').slideUp('fast');
      $('#loading-comments').after(result.fadeIn(500));
      $('.comment_list').after(nextlink);
    }
  });
});

加载条的 css (仅供参考)

#loading-comments {display: none; width: 100%; height: 45px; background: #a0d536; text-align: center; color: #fff; font-size: 22px; line-height: 45px; }
Javascript 相关文章推荐
js控制框架刷新
Aug 01 Javascript
原生Js实现按的数据源均分时间点幻灯片效果(已封装)
Dec 28 Javascript
JavaScript判断变量是否为undefined的两种写法区别
Dec 04 Javascript
JS+CSS实现大气的黑色首页导航菜单效果代码
Sep 10 Javascript
BootStrap与validator 使用笔记(JAVA SpringMVC实现)
Sep 21 Javascript
jQuery编写设置和获取颜色的插件
Jan 09 Javascript
Vue自定义指令详解
Jul 28 Javascript
vue项目中公用footer组件底部位置的适配问题
May 10 Javascript
Vue 数组和对象更新,但是页面没有刷新的解决方式
Nov 09 Javascript
Vue前端判断数据对象是否为空的实例
Sep 02 Javascript
在vue中使用jsonp进行跨域请求接口操作
Oct 29 Javascript
Javascript执行上下文顺序的深入讲解
Nov 04 Javascript
Bootstrap教程JS插件弹出框学习笔记分享
May 17 #Javascript
Bootstrap组件学习之导航、标签、面包屑导航(精品)
May 17 #Javascript
BootStrap的alert提示框的关闭后再显示怎么解决
May 17 #Javascript
Jquery修改image的src属性,图片不加载问题的解决方法
May 17 #Javascript
使用jQuery Mobile框架开发移动端Web App的入门教程
May 17 #Javascript
jquery获取img的src值的简单实例
May 17 #Javascript
jQuery Mobile框架中的表单组件基础使用教程
May 17 #Javascript
You might like
PHP中json_encode、json_decode与serialize、unserialize的性能测试分析
2010/06/09 PHP
MySQL时间字段究竟使用INT还是DateTime的说明
2012/02/27 PHP
PHP Curl多线程原理实例详解
2013/11/06 PHP
PHP使用ActiveMQ实例
2018/02/05 PHP
VBScript版代码高亮
2006/06/26 Javascript
再谈ie和firefox下的document.all属性
2009/10/21 Javascript
禁止js文件缓存的代码
2010/04/09 Javascript
jquery的Theme和Theme Switcher使用小结
2010/09/08 Javascript
js中数组Array的一些常用方法总结
2013/08/12 Javascript
jQuery实现渐变弹出层和弹出菜单的方法
2015/02/20 Javascript
JavaScript通过join函数连接数组里所有元素的方法
2015/03/20 Javascript
jQuery scrollFix滚动定位插件
2015/04/01 Javascript
深入理解js中this的用法
2016/05/28 Javascript
基于d3.js实现实时刷新的折线图
2016/08/03 Javascript
Angularjs 实现一个幻灯片示例代码
2016/09/08 Javascript
第一次接触神奇的Bootstrap
2016/10/14 Javascript
Node.js设置CORS跨域请求中多域名白名单的方法
2017/03/28 Javascript
前端构建工具之gulp的配置与搭建详解
2017/06/12 Javascript
Vue配合iView实现省市二级联动的示例代码
2018/07/27 Javascript
Vuex的actions属性的具体使用
2019/04/14 Javascript
基于vue实现探探滑动组件功能
2020/05/29 Javascript
实现vuex原理的示例
2020/10/21 Javascript
ant design vue中表格指定格式渲染方式
2020/10/28 Javascript
Python实现全局变量的两个解决方法
2014/07/03 Python
Python3.2模拟实现webqq登录
2016/02/15 Python
浅谈Python基础之I/O模型
2017/05/11 Python
windows下python之mysqldb模块安装方法
2017/09/07 Python
使用Keras加载含有自定义层或函数的模型操作
2020/06/10 Python
使用CSS3的ruby-position固定注音位置的用法示例
2016/07/05 HTML / CSS
加拿大在线隐形眼镜专家:PerfectLens.ca
2016/11/19 全球购物
露营世界:Camping World
2017/02/02 全球购物
八项规定整改措施
2014/02/12 职场文书
电子工程专业毕业生求职信
2014/03/14 职场文书
青奥会口号
2014/06/12 职场文书
辞职信格式模板
2015/02/27 职场文书
2015年小学中秋节活动总结
2015/03/23 职场文书