WP_QUERY:具有特定值的自定义规则的META_KEY

时间:2013-05-05 作者:hawkidoki

我有点被WP\\U查询代码卡住了。这是:

$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的所有帖子(此代码可以正常工作)。但是如果有业力=100的帖子,只显示其中的3篇+其余的帖子。

例如:9篇业力=150、133、100、100、100、100、100、100、33、11的帖子。

我想展示:150、133、100、100、100、33、11。(只允许3个业力=100的帖子)。

你知道如何做到这一点吗?也许是add_filter(\'posts_where\'); ?

更新:好的,根据@s\\u ha\\u 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);

1 个回复
最合适的回答,由SO网友:s_ha_dum 整理而成

A.meta_query 是数组的数组。看看examples in the the Codex.

 $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的所有帖子(此代码可以正常工作)。但是如果有业力=100的帖子,只显示其中的3篇+其余的帖子。

。。。用一个WP_Query. 这听起来像是你想要拉3个,而且只有3个,业力大于100的帖子,然后用其他任何东西来填充其余的帖子。这对于纯SQL来说是很棘手的。我认为这在SQL中是可能的,但我必须想很多才能确定,更不用说让它工作了。

我建议两个查询——一个是获取“大于100”的查询,另一个是获取其余的查询。

$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 我的服务器上的数据,但我相当肯定这是正确的。至少,这应该能让你走到最前面。

结束

相关推荐

使用新的WP-Query()从循环中过滤后期格式;

嗨,我目前正在为我的博客构建一个主题。下面的代码指向最新的帖子(特色帖子)。因为这将有一个不同的风格比所有其他职位。然而我想过滤掉帖子格式:链接使用我在循环中定义的WP查询,因为它给我带来了更多的灵活性。我该怎么做呢? <?php $featured = new WP_Query(); $featured->query(\'showposts=1\'); ?> <?php while ($featured->have_post