如前所述,Wordpress本机不支持此功能,但这并不意味着它无法实现。
要实现这一点,您需要添加一个自定义query_vars
, 并添加自定义sql查询,并通过posts_join
posts_orderby
过滤器。此代码已从Filter By Comments 凯文·英格索尔的插件。可以下载完整的插件here. 我已经对它进行了彻底的测试,尽管两年多没有更新,但它仍然有效。
下面是实现这一切的自定义代码
<?php
FilterByComments::getInstance();
class FilterByComments {
static function getInstance() {
static $instance;
return $instance ? $instance : $instance = new self;
}
private function __clone() {}
protected function __construct() {
add_filter(\'query_vars\', array(&$this, \'query_vars\'));
add_filter(\'posts_join\', array(&$this, \'posts_join\'));
add_filter(\'posts_orderby\', array(&$this, \'posts_orderby\'));
}
function query_vars($vars) {
$vars[] = \'orderby_last_comment\';
return $vars;
}
function posts_join($sql) {
global $wpdb;
if(get_query_var(\'orderby_last_comment\')) {
return $sql.\'
LEFT JOIN (SELECT `comment_post_ID` AS `post`, MAX(`comment_date`) AS `date` FROM `\'.$wpdb->comments.\'` WHERE `comment_approved`="1" GROUP BY `post`) AS `last_comment`
ON `last_comment`.`post` = `\'.$wpdb->posts.\'`.`ID`
\';
}
return $sql;
}
function posts_orderby($sql) {
if(get_query_var(\'orderby_last_comment\')) {
return \'`last_comment`.`date` DESC\'.($sql !== \'\' ? \', \'.$sql : \'\');
}
return $sql;
}
}
?>
通过
pre_get_posts
或
WP_Query
.您可以直接使用
query_vars
orderby_last_comment
. 要按最新评论排序帖子,只需设置
orderby_last_comment
到
true
或
1
USING pre_get_posts
function order_by_newest_comment( $query ) {
if ( $query->is_main_query() && $query->is_home() ) {
$query->set( \'orderby_last_comment\', true );
}
}
add_action( \'pre_get_posts\', \'order_by_newest_comment\' );
一
$the_query = new WP_Query(\'orderby_last_comment=true\');