正文 主页 > 站长学院 > Cms教程 >

wordpress文章按照评分进行排序的方法

下载我资源网

我们在做wordpress网站的时候经常会用wp-postratings插件来给文章打分,这个插件会把评分存在字段为 ratings_average 的字段里面。

下面针对自定义字段atings_average 来进行自定义排序。

简单的方法就是在主题函数functions.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评分排序了。

-- 展开阅读全文 --