私は少し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);
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
データがないので、私はそれをテストすることができません、しかし私はそれが正しいと確信しています。それは、少なくともあなたに道を譲るべきです。