3

我创建了一个自定义帖子类型的主题reports。我安装了一个与这种帖子类型交互的评级插件,允许用户对报告进行评级。它将帖子评分存储在两个字段中,sum其中countsum 是所有评分的总和,count 是单个评分的数量。

示例:如果 5 个人将帖子评分为 1、2、3、4 和 5,sum则将是15count将是5

当用户访问存档页面时,他们会看到帖子类型reports的所有帖子的列表。report但是,我想添加一个查询参数来过滤到平均评分为 4 或更高的帖子。我目前正在尝试pre_get_posts按如下方式使用钩子:

add_filter( 'pre_get_posts', 'filterReports' );

function filterReports( $query ) {
  if( is_post_type_archive( 'reports' ) && $_GET['top'] ) {
    global $wpdb;
    $query = $wpdb->prepare(
      "SELECT * 
      FROM 
        wp_postmeta AS sum
        wp_postmeta AS count
      WHERE
        sum.meta_key = 'sum' AND
        count.meta_key = 'count' AND
        sum.meta_value / count.meta_value >= 4"
    );
  }
}

我不完全确定如何在上面构建我的自定义查询。任何建议将不胜感激。

4

2 回答 2

0

使用下面的代码将根据您的情况工作。

add_filter( 'pre_get_posts', 'filterReports' );

function filterReports( $query ) {
  if( is_post_type_archive( 'reports' ) && $_GET['top'] ) {
     $reports_meta_query = $query->get('meta_query');

     //Add our meta query to the original meta queries
     $reports_meta_query[] = array(
                    'key'=>'count',
                    'value'=> 4,
                    'compare'=>'>=',
                );
     $query->set('meta_query',$reports_meta_query);
     // somehow construct a query that checks if sum / count >= 4
  }
}
于 2019-12-31T06:56:01.733 回答
0

很确定您要查找的查询是这样的:

SELECT 
 sum.post_id,
 sum.meta_value,
 count.meta_value,
 (sum.meta_value / count.meta_value) as result
  FROM 
    wp_postmeta sum
  LEFT JOIN wp_postmeta count USING(post_id)
  WHERE
    sum.meta_key = 'sum' AND
    count.meta_key = 'count'
  HAVING 
    result >= 4

您基本上是根据 post_id 加入同一个表的两次,因此您可以通过 sum 和 count 的 meta_key 查询,然后在Having子句中查找数学结果以检查结果是否大于 4请求。

希望有了这个你能得到你想要的东西。

干杯

于 2020-01-07T15:15:22.507 回答