麻豆小视频在线观看_中文黄色一级片_久久久成人精品_成片免费观看视频大全_午夜精品久久久久久久99热浪潮_成人一区二区三区四区

首頁 > 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"

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

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 国产精品剧情一区二区三区 | 欧美色另类 | 中文字幕涩涩久久乱小说 | 国产女做a爱免费视频 | 成人在线视频在线观看 | v天堂在线视频 | 欧美一级高潮 | 精品99在线视频 | 毛片视频网站 | 国产成人自拍小视频 | 黄色一级片在线免费观看 | 欧美福利视频一区二区三区 | 男人的天堂视频网站 | 国产精品美女一区二区 | 在线视频观看一区二区 | 欧美日韩电影 | 毛片大全 | 九九精品在线观看视频 | 99久久婷婷国产综合精品青牛牛 | jizzjizz中国人少妇中文 | 精品亚洲一 | 日本在线观看高清完整版 | 欧美大屁股精品毛片视频 | 九色成人在线 | 一级免费在线 | 337p日本欧洲亚洲大胆精蜜臀 | 午夜爱爱福利 | 久久免费视频8 | 国产精品成人免费一区久久羞羞 | 91网站链接| 亚洲一级片免费观看 | 精品一区二区视频在线观看 | 国产成人免费精品 | 精品国产一级毛片 | av成人免费| 欧美一级一区二区三区 | 成人在线观看免费 | 天堂精品在线 | 国产大片中文字幕在线观看 | 亚洲最新色 | 久久99国产精品久久 |