WordPress实现文章按最新评论时间排序
"有点蓝" 读者已经不下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

很棒很棒,这就试试去,话说如果折腾后想撤销这样的效果怎么办? 删掉function里的代码就可以了吧? 还有,这个计算不包括页面比如留言板里的评论吧?
不想用的话都得去了,不然给你产生不必要的数据。
不计算页面page的的评论。
哪偶就没什么顾虑了,可以放心折腾了。
不过话又说回来,这个对收录啊SEO什么的会不会又影响呢?
那你说文章的排列顺序会对SEO造成影响吗?那原来的按时间排序又会不会对SEO造成影响呢?我想这个比你频繁换主题对SEO的影响会更小!我对SEO不太懂,需要的话,具体可以去咨询SE
这里我提供一个更简单的思路.
SELECT DISTINCT comment_post_ID FROM `wp_comments` order by `comment_ID` desc limit 5
获取评论最新的5篇文章的id.这样就不用自定义字段了
本来想写成文章的,不过最近考试,过几天再写.
这样只适用于类似侧边栏最近评论的栏目,而不是对首页、分类页等的文章排序,如果偏要这种方法就得放弃WordPress的Loop,或者只能置顶5篇文章
不啊.
获取id后处理下,何况不是有下面的参数么
$args= array('post__in' => array(122,153,177));
query_posts($args);
那这样就只能显示这几篇文章了122,153,177,莫非首页只放这几篇文章,而且没有翻页?
你可以亲自做一下实验,看看是什么样的结果,有时候实验数据更有说服力。
- – 我这只是简单的例子.. 其他的当然还要完善.122,153,177我只是举例,实际应该是SELECT DISTINCT comment_post_ID FROM `wp_comments` order by `comment_ID` desc limit 5
获取的结果,至于翻页 有limit在还怕翻页,至于搜索那些更简单,is_home()就有首页才这样就行了.其他细节我还没想,只是看到你的文章标题的时候想到的.
我还是没法理解你的思路,有空你可以亲自做实验,并写篇文章详细分享一下过程。
当然你可以去除SQL中limit,获取所有的post_ID,这样获取到的post_ID是按照评论最新排序的,但是query_posts的参数post__in中post_ID并不能控制文章显示顺序,文章仍会按照发布日期进行排序。
好的,我尽快写个实例,并实验下.
哈,这个实在是够另类的。。
应该不算另类,大多数论坛都是这么干的。
中午花了点时间做一个,不过有点小缺点,已经有解决办法,不过面临考试- – 先放弃.
wp:文章以最新评论排序,像论坛那样.
不过后面想了下,还是你那种方法灵活,好用.我那种自定义参数就无用之地了,还有一些小问题.虽然不用加自定义字段,不过有些得不偿失.白忙活了- – 不过也发现了好多不太会用的用法和特性,也算收获了
嗯,多动手是好习惯。
不过最后有一个小问题.我还没研究wordpress在加载自定义字段的时候是如何加载的.是读取完总后在读取相应的自定义字段,还是在读取的时候就join in了.在我看来第一种方法比较好,毕竟join in很耗费资源.但是从用自定义字段排序来看,看来是先join in如果文章多了,怕会很费资源吧.另外 先不join in的问题,开发软件的时候都知道,如果想以某个值段其排序,不给他加索引,结果是很悲剧的.我想你这个唯一的缺点就是这个,不过也要文章上千才有影响.我对wordpress数据库类和插件开发还不熟悉,如果能直接在post表上扩充一个字段,并给以索引,我想可能是最好的.
我想WordPress能够采用的多表查询也就是连接了。现在的数据库都做了很多的优化,10000行数据我想还不至于对它的速度构成重大影响,WordPress本身是为了Blog设计的,而不是用来采集的,我想也很少有不采集不复制的博客能够写出5000篇文章。个人用而且技术熟悉的话,给post表扩充字段是好办法。
这个代码加的不错,文章的排序对SEO的影响应该不是很大
是不是有求必应啊,Ludou?
得看我是否有这个心情,有这个能力!
大家都在讨论wp,我还在用zblog
这个功能很不错啊。
这样不太好吧。还是按发布时间排序合理一点。
的确很不错,非常实用~~
这个不错~很有创意啊~博主人才~
复杂且用不着…
想请教一下,为什么把数目showposts设置为1或者2时,实际显示结果会比设置的多一个?
本文的代码中未使用showposts参数,但我给query_posts添加showposts,测试未出现你所说的问题。
文章分类中文章按最新评论时间排序,但文章月存档中文章顺序不变,如何实现.
创建两个php文件,命名为category.php和date.php,分别对应分类页和日期页,将archive.php中的代码复制到这个文件,然后query_posts修改显示顺序即可:
http://www.ludou.org/wordpress_query_posts.html
具体请自行上网搜索。
具体怎么做,代码是?
博主真是超牛啊,我要是有这技术就好了。
我觉得你还是很用心的写你的博客,但我看了几篇感觉,好像对我有用的内容太少。当然,只是对于我个人。或者说,你应该写点对人们都有更大意义的插件。比如,你看我博客上,我就介绍如果让人们清除网页上的广告,便于浏览,我想,这种介绍对很多人都会有意义。
我写博客的目的是写给有需要的人,不一定要满足所有人的胃口,能帮上一个人的忙我就知足了。
请问一下,如果想按照最新的修改时间来排序,该怎么实现?
你按照第三部分内容的说明修改就可以了,将:
$args = array(
'meta_key' => 'commentTime',
'orderby' => meta_value,
'order' => DESC
);
改成:
$args = array(
'orderby' => 'modified',
'order' => DESC
);
就可以了