我们在做wordpress网站的时候经常会用wp-postratings插件来给文章打分,这个插件会把评分存在字段为 ratings_average 的字段里面。
下面针对自定义字段atings_average 来进行自定义排序。
简单的方法就是在主题函数functions.php中加入下面代码:
PHP
function sort_by_ratings( $query ){
if ( ( $query->is_home() || $query->is_archive() ) && $query->is_main_query() ) {
$query->set( 'meta_key', 'ratings_average' );
$query->set( 'orderby', 'meta_value_num');
$query->set( 'order', 'DESC' );
}
}
add_action( 'pre_get_posts', 'sort_by_ratings' );
用这个方法会有一个错误出现,就是没有评分的文章会在列表中消失,要解决这个方法我们可以给没有评分的文章都创建这个字段,默认值为0就可以了。
在主题函数里面加入下面代码:
PHP
function sort_by_ratings( $query ){
if ( ( $query->is_home() || $query->is_archive() ) && $query->is_main_query() ) {
add_filter( 'posts_fields', 'ratings_fields' );
add_filter( 'posts_join', 'ratings_join' );
add_filter( 'posts_where', 'ratings_where' );
add_filter( 'posts_groupby', 'ratings_group' );
add_filter( 'posts_orderby', 'ratings_orderby' );
}
}
add_action( 'pre_get_posts', 'sort_by_ratings' );
function ratings_fields($fields){
$order_key = "mt1.meta_value";
return $fields . ",$order_key AS avg";
}
function ratings_join($join){
global $wpdb;
$new_join = "
INNER JOIN $wpdb->postmeta ON $wpdb->posts.ID = $wpdb->postmeta.post_id
LEFT JOIN $wpdb->postmeta AS mt1 ON ($wpdb->posts.ID = mt1.post_id AND mt1.meta_key = 'ratings_average')
";
return $join . ' ' . $new_join;
}
function ratings_where($where){
global $wpdb;
$new_where = "
AND ($wpdb->postmeta.meta_key = 'ratings_average'
OR mt1.post_id IS NULL )";
return $where . ' ' . $new_where;
}
function ratings_group( $group ){
global $wpdb;
return "$wpdb->posts.ID";
}
function ratings_orderby( $orderby ){
global $wpdb;
return "ISNULL(avg), avg,$wpdb->posts.post_date ASC";
}
这样排序是分数由低到高,如果需要由高到低可以改成:
PHP
function ratings_fields($fields){
// 只能升序排列,所以要降序排列时先做一次运算
$max_rating = 5;
$order_key = "$max_rating - mt1.meta_value";
return $fields . ",$order_key AS avg";
}
这样我们就可以自定义wordpress评分排序了。
发表评论