WordPress实现文章按最新评论时间排序

Ludou
文章目录

     "有点蓝" 读者已经不下2次在我的博客里留言想要实现这个功能了,还是满足他的这个愿望吧。WordPress的首页、分类页、标签页等存档页,默认是按照发布时间对文章进行排序的,现在想按最新评论时间排序,其实这个功能就是类似论坛的帖子列表效果,新发布的帖子置顶,有新评论的帖子也同样置顶,这样做的好处是可以增加互动,增加帖子评论数。在WordPress下也是可以实现这样的功能:

  • 新发布(新更改)的文章排在顶部
  • 有新评论的文章立即排到顶部
  • 所有文章按照其最新一条评论的时间排序

     实现的方法是给每篇文章添加一个自定义字段commentTime,这个字段的值为最新一条评论的时间,然后使用query_posts函数实现所有文章按照自定义字段commentTime的值进行排序。实现原理就这么简单,下面讲讲具体的实现方法:

一、给所有文章添加自定义字段commentTime

     给每篇文章添加这个自定义字段的目的是为了方便对文章进行排序。可能叫你手动一篇一篇文章地添加自定义字段,尤其是你有几百上千篇文章的情况下,一定会是你抓狂。不过请你放心,我不会让你用这么做,这里我写了个PHP脚本,可以帮你自动给所有文章添加字段commentTime。使用方法:下载以下文件,然后上传到跟wp-config.php相同的目录(就是WordPress的安装目录)下,然后在浏览器中运行这个文件,如 http://example/meta-sql.php

下载此文件

二、添加相应action代码

     这一步添加的代码可以实现发布新文章(或新更改)、有新评论的时候,自动添加/更新自定义字段commentTime的值,不需要你手动干预。在你当前使用主题的functions.php中添加以下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
29
30
31
32
33
34
/**
 * WordPress实现文章按最新评论时间排序,action代码
 * 作者:露兜
 * 博客:http://www.ludou.org/
 * 最后修改:2010年11月25日
 */


function comment_meta_add($post_ID)  {
    // 发布新文章或修改文章,更新/添加commentTime字段值
    global $wpdb;
    if(!wp_is_post_revision($post_ID)) {
        if( !update_post_meta($post_ID, 'commentTime', time()) ) {
            add_post_meta($post_ID, 'commentTime', time());
        }
    }
}

function comment_meta_update($comment_ID)  {
    // 发布新评论更新commentTime字段值
    $comment = get_comment($comment_ID);
    $my_post_id = $comment->comment_post_ID;
    update_post_meta($my_post_id, 'commentTime', time());
}

function comment_meta_delete($post_ID)  {
    // 删除文章同时删除commentTime字段
    global $wpdb;
    if(!wp_is_post_revision($post_ID)) {
        delete_post_meta($post_ID, 'commentTime');
    }
}
add_action('save_post', 'comment_meta_add');
add_action('delete_post', 'comment_meta_delete');
add_action('comment_post', 'comment_meta_update');

三、query_posts更改文章排序

     如果你只想实现首页的文章按最新评论时间排序,那么此步只修改主题目录下的index.php即可,如果还想修改其他存档页面如分类页、标签页等,那就修改相应的模板文件,如archive.php。

     举例说明,在index.php中查找代码 if (have_posts())while (have_posts()),在上一行添加query_posts函数即可:

1
2
3
4
5
6
7
8
9
10
if(!$wp_query)
    global $wp_query;

$args = array(
    'meta_key' => 'commentTime',
    'orderby'   => meta_value,
    'order' => DESC
);
$args = array_merge( $args, $wp_query->query );
query_posts($args);

     对archive.php的修改也一样!如果对query_posts的用法不熟悉,可以看这篇文章: WordPress函数query_posts用法汇总

数据库清理脚本

     如果某一天你不想使用这个功能了,你可以下载以下文件帮助你自动清理数据库中的无用信息,放到WordPress的安装目录下,然后在浏览器中执行一下就可以了,如http://example/meta-clear-sql.php

下载此文件

     好了,全部教程到此就结束了,完成以上步骤后就什么都不用管了,文章就是按照最新评论时间进行排序了。如果还有问题请给我留言

本文版权归露兜博客所有,转载引用请完整注明以下信息:
本文作者:Ludou
本文标题:WordPress实现文章按最新评论时间排序
本文地址:http://www.ludou.org/wordpress-post-orderby-comment-time.html

露兜博客博主,男生,业余Web程序员,儒家思想受益者。文采不佳,不喜欢聚光灯,不喜欢吹牛,不喜欢无序的做事方式。闲时喜欢写些代码自娱自乐,并在博客中分享一些个人技术经验。

标签:

37 条评论

我来说两句
  1. 有点蓝

    很棒很棒,这就试试去,话说如果折腾后想撤销这样的效果怎么办? 删掉function里的代码就可以了吧? 还有,这个计算不包括页面比如留言板里的评论吧?

    • Ludou

      不想用的话都得去了,不然给你产生不必要的数据。
      不计算页面page的的评论。

      • 有点蓝

        哪偶就没什么顾虑了,可以放心折腾了。
        不过话又说回来,这个对收录啊SEO什么的会不会又影响呢?

        • Ludou

          那你说文章的排列顺序会对SEO造成影响吗?那原来的按时间排序又会不会对SEO造成影响呢?我想这个比你频繁换主题对SEO的影响会更小!我对SEO不太懂,需要的话,具体可以去咨询SE

  2. Blues

    这里我提供一个更简单的思路.
    SELECT DISTINCT comment_post_ID FROM `wp_comments` order by `comment_ID` desc limit 5
    获取评论最新的5篇文章的id.这样就不用自定义字段了
    本来想写成文章的,不过最近考试,过几天再写.

    • Ludou

      这样只适用于类似侧边栏最近评论的栏目,而不是对首页、分类页等的文章排序,如果偏要这种方法就得放弃WordPress的Loop,或者只能置顶5篇文章

      • Blues

        不啊.
        获取id后处理下,何况不是有下面的参数么
        $args= array('post__in' => array(122,153,177));
        query_posts($args);

        • Ludou

          那这样就只能显示这几篇文章了122,153,177,莫非首页只放这几篇文章,而且没有翻页?
          你可以亲自做一下实验,看看是什么样的结果,有时候实验数据更有说服力。

          • Blues

            - – 我这只是简单的例子.. 其他的当然还要完善.122,153,177我只是举例,实际应该是SELECT DISTINCT comment_post_ID FROM `wp_comments` order by `comment_ID` desc limit 5
            获取的结果,至于翻页 有limit在还怕翻页,至于搜索那些更简单,is_home()就有首页才这样就行了.其他细节我还没想,只是看到你的文章标题的时候想到的.

          • Ludou

            我还是没法理解你的思路,有空你可以亲自做实验,并写篇文章详细分享一下过程。

            当然你可以去除SQL中limit,获取所有的post_ID,这样获取到的post_ID是按照评论最新排序的,但是query_posts的参数post__in中post_ID并不能控制文章显示顺序,文章仍会按照发布日期进行排序。

          • Blues

            好的,我尽快写个实例,并实验下.

  3. Firm

    哈,这个实在是够另类的。。

  4. Blues

    中午花了点时间做一个,不过有点小缺点,已经有解决办法,不过面临考试- – 先放弃.
    wp:文章以最新评论排序,像论坛那样.

    • Blues

      不过后面想了下,还是你那种方法灵活,好用.我那种自定义参数就无用之地了,还有一些小问题.虽然不用加自定义字段,不过有些得不偿失.白忙活了- – 不过也发现了好多不太会用的用法和特性,也算收获了

      • Ludou

        嗯,多动手是好习惯。

        • Blues

          不过最后有一个小问题.我还没研究wordpress在加载自定义字段的时候是如何加载的.是读取完总后在读取相应的自定义字段,还是在读取的时候就join in了.在我看来第一种方法比较好,毕竟join in很耗费资源.但是从用自定义字段排序来看,看来是先join in如果文章多了,怕会很费资源吧.另外 先不join in的问题,开发软件的时候都知道,如果想以某个值段其排序,不给他加索引,结果是很悲剧的.我想你这个唯一的缺点就是这个,不过也要文章上千才有影响.我对wordpress数据库类和插件开发还不熟悉,如果能直接在post表上扩充一个字段,并给以索引,我想可能是最好的.

          • Ludou

            我想WordPress能够采用的多表查询也就是连接了。现在的数据库都做了很多的优化,10000行数据我想还不至于对它的速度构成重大影响,WordPress本身是为了Blog设计的,而不是用来采集的,我想也很少有不采集不复制的博客能够写出5000篇文章。个人用而且技术熟悉的话,给post表扩充字段是好办法。

  5. WordPress啦

    这个代码加的不错,文章的排序对SEO的影响应该不是很大

  6. yesureadmin

    是不是有求必应啊,Ludou?

  7. 博客之家

    大家都在讨论wp,我还在用zblog

  8. 王3峰

    这个功能很不错啊。

  9. wmtimes

    这样不太好吧。还是按发布时间排序合理一点。

  10. 远走高飞

    的确很不错,非常实用~~

  11. iwww

    这个不错~很有创意啊~博主人才~

  12. 蚊子

    复杂且用不着…

  13. badJohnny

    想请教一下,为什么把数目showposts设置为1或者2时,实际显示结果会比设置的多一个?

  14. lu

    文章分类中文章按最新评论时间排序,但文章月存档中文章顺序不变,如何实现.

  15. bestkaola

    博主真是超牛啊,我要是有这技术就好了。

  16. bestkaola

    我觉得你还是很用心的写你的博客,但我看了几篇感觉,好像对我有用的内容太少。当然,只是对于我个人。或者说,你应该写点对人们都有更大意义的插件。比如,你看我博客上,我就介绍如果让人们清除网页上的广告,便于浏览,我想,这种介绍对很多人都会有意义。

    • Ludou

      我写博客的目的是写给有需要的人,不一定要满足所有人的胃口,能帮上一个人的忙我就知足了。

  17. zyhh

    请问一下,如果想按照最新的修改时间来排序,该怎么实现?

    • Ludou

      你按照第三部分内容的说明修改就可以了,将:
      $args = array(
      'meta_key' => 'commentTime',
      'orderby' => meta_value,
      'order' => DESC
      );
      改成:
      $args = array(
      'orderby' => 'modified',
      'order' => DESC
      );
      就可以了

发表评论

订阅评论