国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > CMS > Wordpress > 正文

WordPress實現文章按照自定義字段排序

2024-09-07 00:51:16
字體:
來源:轉載
供稿:網友

我們一起來看看WordPress實現文章按照自定義字段排序的方法,因為碰以一個朋友博客希望增加自定義字段之后再按這個字段排序了,下面是我整理了一個方法,希望能幫助到各位同學.

用Meta Query可以實現WordPress文章按照自定義排序,假設安裝了WP-PostRatings給文章打分,該插件會把文章平均分存成名叫ratings_average的自定義字段,現在就來按照這個字段排序.

簡潔優雅的方法,就是Meta Query,代碼放在主題的functions.php里,代碼如下:

  1. function sort_by_ratings( $query ){ 
  2.     if ( ( $query->is_home() || $query->is_archive() ) && $query->is_main_query() ) { 
  3.         $query->set( 'meta_key''ratings_average' ); 
  4.         $query->set( 'orderby''meta_value_num'); 
  5.         $query->set( 'order''DESC' ); 
  6.     } 
  7. add_action( 'pre_get_posts''sort_by_ratings' ); 

卻有個嚴重的問題,該插件只會給打過分的文章創建ratings_average字段,而Meta Query只會選擇帶有這個字段的文章,也就是說所有沒打過分的文章都會從blog首頁和存檔頁消失.

解決的方法呢,直接點就是給每篇文章都創建這個字段,值為0.

復雜點呢,stackoverflow上有對這個問題的討論,按照給出的方案改進了一下,找到一個暫時的解決方法如下,思路是直接修改sql語句,代碼如下:

  1. function sort_by_ratings( $query ){ 
  2.     if ( ( $query->is_home() || $query->is_archive() ) && $query->is_main_query() ) { 
  3.         add_filter( 'posts_fields''ratings_fields' ); 
  4.         add_filter( 'posts_join''ratings_join' ); 
  5.         add_filter( 'posts_where''ratings_where' );   
  6.         add_filter( 'posts_groupby''ratings_group' ); 
  7.         add_filter( 'posts_orderby''ratings_orderby' ); 
  8.     } 
  9. add_action( 'pre_get_posts''sort_by_ratings' ); 
  10. function ratings_fields($fields){ 
  11.     $order_key = "mt1.meta_value"
  12.     return $fields . ",$order_key AS avg"
  13. function ratings_join($join){ 
  14.     global $wpdb
  15.     $new_join = " 
  16.         INNER JOIN $wpdb->postmeta ON $wpdb->posts.ID = $wpdb->postmeta.post_id 
  17.         LEFT JOIN $wpdb->postmeta AS mt1 ON ($wpdb->posts.ID = mt1.post_id AND mt1.meta_key = 'ratings_average'
  18.     "; 
  19.     return $join . ' ' . $new_join
  20. function ratings_where($where){ 
  21.     global $wpdb
  22.     $new_where = " 
  23.         AND ($wpdb->postmeta.meta_key = 'ratings_average' 
  24.         OR  mt1.post_id IS NULL )"; 
  25.     return $where . ' ' . $new_where
  26. function ratings_group( $group ){ 
  27.     global $wpdb
  28.     return "$wpdb->posts.ID"
  29. //Vevb.com 
  30. function ratings_orderby( $orderby ){ 
  31.     global $wpdb
  32.     return "ISNULL(avg), avg,$wpdb->posts.post_date ASC"

生成的sql語句如下:

  1. SELECT SQL_CALC_FOUND_ROWS wp_posts.*,mt1.meta_value AS avg FROM wp_posts 
  2. INNER JOIN wp_postmeta ON wp_posts.ID = wp_postmeta.post_id 
  3. LEFT JOIN wp_postmeta AS mt1 ON (wp_posts.ID = mt1.post_id AND mt1.meta_key = 'ratings_average'
  4. WHERE 1=1 
  5. AND wp_posts.post_type = 'post' 
  6. AND (wp_posts.post_status = 'publish' OR wp_posts.post_status = 'private'
  7. AND (wp_postmeta.meta_key = 'ratings_average' OR mt1.post_id IS NULL ) 
  8. GROUP BY wp_posts.ID 
  9. ORDER BY ISNULL(avg), avg,wp_posts.post_date ASC LIMIT 0, 10 

結果是分數按照從低分到高分排序,即使order by DESC也是升序排列,如果要讓高分上前面,只能用點奇怪的方法,比如最大分數是5,把posts_fields改成這樣,代碼如下:

  1. function ratings_fields($fields){ 
  2.     // 只能升序排列,所以要降序排列時先做一次運算 
  3.     $max_rating = 5; 
  4.     $order_key = "$max_rating - mt1.meta_value"
  5.     return $fields . ",$order_key AS avg"

如果還有更簡單的方法,歡迎留言指教.

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 英超| 出国| 仙游县| 小金县| 乃东县| 定日县| 五河县| 万盛区| 额尔古纳市| 扎兰屯市| 宜宾市| 乌兰浩特市| 文昌市| 万山特区| 湾仔区| 吉木乃县| 福建省| 朔州市| 民乐县| 渝北区| 和林格尔县| 龙州县| 永康市| 湖州市| 江永县| 遂宁市| 辽宁省| 抚远县| 当雄县| 齐齐哈尔市| 高清| 平凉市| 武威市| 伊金霍洛旗| 双牌县| 蒙山县| 文成县| 呼图壁县| 抚顺市| 甘南县| 洛宁县|