查询两个日期之间的帖子(自定义元键)CMB2

时间:2016-01-30 作者:efoula

我有一个自定义的post类型(projects),它有自定义的cmb2元键(str\\u dte和end\\u dte),因此每个项目都有一个开始日期和结束日期。我想做的是在两个日期之间完成项目。

示例:

项目#1:开始日期=20120101(2012年1月)/结束日期=20120601(2012年6月)(Ymd)

项目#2:开始日期=20120401(2012年4月)/结束日期=20121201(2012年12月)(Ymd)

查询:

query_posts(array(
               \'posts_per_page\' => $numPosts,
               \'paged\'          => $page,
               \'post_type\' => \'projects\',
               \'meta_query\' => array(
        \'relation\' => \'AND\',
        array(
            \'key\'       => \'str_dte\',
            \'compare\'   => \'>=\',
            \'value\'     => \'20120501\', //May 2012
            \'type\'      => \'DATE\'
        ),
        array(
            \'key\'       => \'end_dte\',
            \'compare\'   => \'<=\',
            \'value\'     => \'20120701\', //July 2012
            \'type\'      => \'DATE\'
        )
    ),

               ));
问题:此查询没有显示任何项目,因为它没有意识到每个项目的开始日期和结束日期之间的日期范围。

简而言之:考虑到每个项目开始日期和结束日期之间的日期范围,我需要找到一个在两个日期(开始日期和结束日期)之间查询项目/帖子的解决方案。

在线资源:我在网上找到的最有用的解决方案是(robbiegod/keesiemeijer) solution 但这对我不起作用,我不知道为什么!

非常感谢您的帮助。非常感谢。

SOLUTION

query_posts(array(
                   \'posts_per_page\' => $numPosts,
                   \'paged\'          => $page,
                   \'post_type\' => \'projects\',
                   \'meta_query\' => array(
            \'relation\' => \'AND\',
            array(
                \'key\'       => \'str_dte\',
                \'compare\'   => \'<=\',
                \'value\'     => \'$end_date_value\', // 20120701 July (Ymd or UnixTime)
                \'type\'      => \'DATE\'
            ),
            array(
                \'key\'       => \'end_dte\',
                \'compare\'   => \'>=\',
                \'value\'     => \'$start_date_value\', // 20120501 May (Ymd or UnixTime)
                \'type\'      => \'DATE\'
            )
        ),

                   ));
只需将开始日期值结果(date)作为结束日期元键的值,并将结束日期值结果(date)作为开始日期元键的值。

就是这样。

2 个回复
SO网友:Milo

要查找在一定日期范围内发生的项目,您必须考虑以下三种情况:

项目在范围内开始,在范围内结束。项目在范围之前开始,在范围之后结束。您可以使用OR 元查询和1个嵌套AND:

\'meta_query\' => array(
    \'relation\' => \'OR\',
    array(
        \'key\'     => \'str_dte\',
        \'value\'   => array( $range_start, $range_end ),
        \'compare\' => \'BETWEEN\',
    ),
    array(
        \'key\'     => \'end_dte\',
        \'value\'   => array( $range_start, $range_end ),
        \'compare\' => \'BETWEEN\',
    ),
    array(
        \'relation\' => \'AND\',
        array(
            \'key\' => \'str_dte\',
            \'value\' => $range_start,
            \'compare\' => \'<\',
        ),
        array(
            \'key\' => \'end_dte\',
            \'value\' => $range_end,
            \'compare\' => \'>\',
        ),
    ),
),
如果您正在执行大量这些查询,并且性能是一个问题,那么您可能可以手动生成一个比这更快的查询。

SO网友:nyan

首先,不要使用query\\u帖子!(为什么不呢?That is why!)

第二,如果您的自定义字段(CF)保存在Ymd表单中(您确信这一点,是吗?!),即使您没有将“type”定义为“date”,也应该一切正常。阅读关于SE等的多个讨论。如果不将日期值与一个meta\\u query-array中包含两个日期的数组进行比较,那么最好避免使用“date”类型。所以,删除\'type\'=>\'date\'.

话虽如此,我还是想知道您的查询是否返回了一个结果,因为如果我遍历它,结果就是这样的:当您使用relation “和”。

First condition: 如果20120101的值(=value) 大于或等于(=compare) 存储在str\\u date中的值(=key), 我们可以走了。

项目#1:20120101>=20120101:正确

  • 项目#2:20120101>=20120401:错误
  • Second condition: 如果值20120630(=value) 小于或等于(=compare) 存储在end\\u dte中的值(=key), 我们可以走了。

    项目1:20120630<;=20120601:错误由于两个项目都不满足这两个条件,我想知道WP会返回哪怕一个。我认为对于您想要的,这个查询应该可以:

    // New Query: se216174
    $se216174_args = array(
      \'posts_per_page\' => -1, // Why \'-1\'? Because the custom fields limit the results anyway
      \'post_type\' => \'projects\',
      \'meta_query\' => array(
        \'relation\' => \'AND\', // This is default, you could skip it
        array(
          \'key\' => \'str_dte\',
          \'compare\' => \'<=\', // I have changed this, so everything with a date greater than what we have in the next line should be displayed.
          \'value\' => \'20120101\',
        ),
        array(
          \'key\' => \'end_dte\',
          \'compare\' => \'>=\', // Same as above
          \'value\' => \'20121201\', // New date so that both your projects will match
        ),
      ),
    );
    $se216174_query = new WP_Query( $se216174_args );
    if ( $se216174_query->have_posts() ) : 
      while ( $se216174_query->have_posts() ) :
        $se216174_query->the_post();
        // Display post, eg. echo the_title();
      endwhile; wp_reset_postdata();
    else :
      // No posts, eg. echo \'Nothing found\';
    endif;
    
    未测试,但这应该可以工作。让我像上面一样快速检查:

    First condition: 如果20120101的值(=value) 小于或等于(=compare) 存储在str\\u date中的值(=key), 我们可以走了。

    项目1:20120101<;=20120101:正确项目#2:20120101<;=20120401:正确Second condition: 如果值20120630(=value) 大于或等于(=compare) 存储在end\\u dte中的值(=key), 我们可以走了。

    项目1:20121201>=20120601:正确

  • 项目#2:20121201>=20121201:正确
  • 相关推荐

    将wp_Query替换为wp_User_Query

    我在插件中制作了一些订阅者档案和单曲(个人资料页),其中我还包括了一个“用户单曲”模板,通过template_include. 不过,我正在尝试从插件中删除一些模板,以使其使用主题模板。我用了locate_template( \'single.php\' ) 从活动主题中选择单个模板。我没有使用全局wp_query 在本例中显示我的内容,但页面显示了基于查询默认值的循环(十篇帖子)。我想知道的是,我是否可以完全放弃默认查询,用wp_user_query 我可以将查询到的用户ID输入其中。然后我想筛选the