web-dev-qa-db-ja.com

WP_query:特定の値に対するカスタムルールを持つmeta_key

私は少しWP_Queryコードで立ち往生しています。ここにあります :

$args = array(
      'post_type' => 'post',
      'meta_query'=> array(
          'key' => 'karma',
          'compare' => '>=',
          'value' => 0,
          'type' => 'numeric'),
        'posts_per_page' => 9,
        'meta_key' => 'karma',
        'orderby' => 'meta_value_num', 
        'order' => 'DESC',
        'post__not_in' => $dont_show_me
    );

私がやりたいこと :

Karma> = 0の投稿をすべて表示する(このコードでうまく動作する)。しかし、karma = 100の投稿がある場合は、それらのうち3つ+その他の投稿のみ表示されます。

例:カルマ= 150、133、100、100、100、100、100、33、11の9投稿。

150、133、100、100、100、33、11を表示します(カルマ= 100の投稿は3件のみ許可されています)。

これを達成する方法について何か考えがありますか。多分add_filter('posts_where');ですか?

更新:さて、@ s_ha_dumの回答に基づいて、うまくいきました。ちょっとトリッキーですが、結果はうまくいきます;)

$args = array(
       // Check for 9 last posts with karma = 100
       'post_type' => 'post',
       'meta_query'=> array(
          array(
              'key' => 'karma',
              'compare' => '=', 
              'value' => 100,
              'type' => 'numeric'
           )
        ),
       'posts_per_page' => 9,
       'meta_key' => 'karma',
       'orderby' => 'meta_value_num', 
       'order' => 'DESC',
       'post__not_in' => $dont_show_me
    );
    $karma_qry = new WP_Query($args);

    if (!empty($karma_qry->posts)) {
        $i = 0;
        foreach ($karma_qry->posts as $p) {
            $i++;
            // Check for more than 3 posts with karma = 100
            // Add them in the $dont_show_me array 
            if($i > 3){
                $dont_show_me[] = $p->ID;
            }
        }
    }

    // Setup the final query that excluded addional posts with karma = 100
    $args['meta_query'][0]['compare'] = '>=';
    $args['meta_query'][0]['value'] = 0;
    $args['post__not_in'] = $dont_show_me;

    $wp_query = new WP_Query($args);
2
hawkidoki

meta_queryは配列の配列です。コーデックスの の例を見てください

 $args = array(
   'post_type' => 'my_custom_post_type',
   'meta_key' => 'age',
   'orderby' => 'meta_value_num',
   'order' => 'ASC',
   'meta_query' => array(
       array(
           'key' => 'age',
           'value' => array(3, 4),
           'compare' => 'IN',
       )
   )
 );
 $query = new WP_Query($args);

あなたが持っているのは単なる配列です。それはトラブルを引き起こす可能性があります。あなたがやりたいことはこれです:

$args = array(
   'post_type' => 'post',
   'meta_query'=> array(
      array(
          'key' => 'karma',
          'compare' => '>=', // limit to "karma value = 100"
          'value' => 0, // limit to "karma value = 100"
          'type' => 'numeric'
       )
    ),
   'posts_per_page' => 9,
   'meta_key' => 'karma',
   'orderby' => 'meta_value_num', 
   'order' => 'DESC',
   'post__not_in' => $dont_show_me
);

しかし、質問自体にたどり着くには、必要なほど複雑なロジックを実行することはできません。

Karma> = 0の投稿をすべて表示する(このコードでうまく動作する)。しかし、karma = 100の投稿がある場合は、それらのうち3つ+その他の投稿のみ表示されます。

... WP_Queryが1つあります。 100以上のカルマを持つ投稿を3つ、そして3つだけ投稿し、残りを他のもので埋めたいように思えます。純粋なSQLではこれは難しいかもしれません。私はそれがSQLで可能であると思います、しかし、私は lot を確実にするために考えなければならないでしょう。

2つのクエリを提案します。1つは "100以上"を取得し、もう1つは残りを取得するためです。

$dont_show_me = array(1);
$args = array(
   'post_type' => 'post',
   'meta_query'=> array(
      array(
          'key' => 'karma',
          'compare' => '>=', 
          'value' => 100,
          'type' => 'numeric'
       )
    ),
   'posts_per_page' => 3,
   'meta_key' => 'karma',
   'orderby' => 'meta_value_num', 
   'order' => 'DESC',
   'post__not_in' => $dont_show_me
);
$karma_qry = new WP_Query($args);

if (!empty($karma_qry->posts)) {
  $args['posts_per_page'] = 9 - $karma_qry->found_posts;
  $args['meta_query'][0]['value'] = 0;
  foreach ($karma_qry->posts as $p) {
      // assuming $dont_show_me is an array
      $dont_show_me[] = $p->ID;
  }
  $args['post__not_in'] = $dont_show_me;
} else {
  $args['posts_per_page'] = 9;
  $args['meta_query'][0]['value'] = 0;
}

$the_rest_qry = new WP_Query($args);

私のサーバーにあなたのkarmaデータがないので、私はそれをテストすることができません、しかし私はそれが正しいと確信しています。それは、少なくともあなたに道を譲るべきです。

3
s_ha_dum