让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就可以了。
在主题函数里面加入下面代码:
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"; }
这样排序是分数由低到高,如果需要由高到低可以改成:
function ratings_fields($fields){ // 只能升序排列,所以要降序排列时先做一次运算 $max_rating = 5; $order_key = "$max_rating - mt1.meta_value"; return $fields . ",$order_key AS avg"; }
这样我们就可以自定义wordpress评分排序了。
© 版权声明
文章版权归作者所有,未经允许请勿转载。
THE END