北极寒流 » 网络资源 » wordpress文章按最新评论排列 - 2012.03.22

wordpress文章按最新评论排列

wordpress网站正常情况下都是按文章发布日期排列的,那有没有办法实现像论坛一样的效果:按评论的先后顺序排列呢?其实这个功能就是类似论坛的帖子列表效果,新发布的帖子置顶,有新评论的帖子也同样置顶,这样做的好处是可以增加互动,增加帖子评论数。在WordPress下也是可以实现这样的功能。(演示效果直接见壹品下载首页)

wordpress文章按最新评论排列效果需要用到wordpress的自定义域功能,给每篇文章添加一个自定义字段commentTime,这个字段的值为最新一条评论的时间,然后使用query_posts函数实现所有文章按照自定义字段commentTime的值进行排序。

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

如果是新wordpress博客,给每篇文章添加这个自定义字段的还不大麻烦,那如果你的博客已经有很多文章,可能叫你手动一篇一篇文章地添加自定义字段,尤其是你有几百上千篇文章的情况下,一定会是你抓狂。不过我们利用PHP代码可以轻松搞定。下面就是为你wordpress网站所有文章自动增加commentTime自定义域的代码。复制后另存为“meta-add.php”然后把它传到你网站的根目录,再在浏览器中运行这个文件,如 http://example.com/meta-add.php,这样就可以自动为你所有文章增加自定义域commentTime。

<?php
include('./wp-config.php' );

// 连接数据库
mysql_connect(DB_HOST, DB_USER, DB_PASSWORD) or die(mysql_error());
mysql_query("set names 'utf8'");
mysql_select_db(DB_NAME) or die(mysql_error());

// 获取所有文章ID
$postids = mysql_query("SELECT ID FROM {$table_prefix}posts WHERE post_status = 'publish' AND post_type='post'");
$postid = mysql_fetch_assoc($postids);

$insertSQL = 'INSERT INTO ' . $table_prefix . 'postmeta (post_id, meta_key, meta_value) VALUES ';

if($postids) {
    do {
        $insertSQL .= '(' . $postid['ID'] . ', \'commentTime\', \'-1\'), ';                           
    } while ( $postid = mysql_fetch_assoc($postids) );
    // 去除末尾的半角逗号 ,
    $insertSQL = substr($insertSQL, 0, strlen($insertSQL)-2);
}

// 给每篇文章添加自定义字段commentTime,值都为-1
mysql_query($insertSQL);
echo 'OK!';
?>

2、添加相应action代码

这一步添加的代码可以实现发布新文章(或新更改)、有新评论的时候,自动添加/更新自定义字段commentTime的值,不需要你手动干预。在你当前使用主题的functions.php中添加以下php代码:

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');

3、query_posts更改文章排序

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

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

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);

4、数据库清理脚本

     如果某一天你不想使用这个功能了,你可以使用下面的php代码帮助你自动清理数据库中的无用信息,使用方法和上面那段增加自定义域的代码一样,也是复制出来另存为“meta-clear.php”文件(当然,这个名称你自己可以随意取),放在你服务器跟目录运行即可。

<?php
include('./wp-config.php' );

// 连接数据库
mysql_connect(DB_HOST, DB_USER, DB_PASSWORD) or die(mysql_error());
mysql_query("set names 'utf8'");
mysql_select_db(DB_NAME) or die(mysql_error());

// 清理wp_postmeta中的commentTime信息
$deleteSQL = "DELETE FROM {$table_prefix}postmeta WHERE meta_key = 'commentTime'";
mysql_query($deleteSQL);
echo 'OK!';
?>

考虑到有童鞋可能复制代码都闲麻烦,下面本站直接提供了这2个文件,放到你网站上运行即可。

资料来源:http://www.ludou.org/wordpress-post-orderby-comment-time.html

22

wordpress文章按最新评论排列

正在提取下载地址,请稍侯...[重试]
分享到: