自定义查询,检查多个元键的值

时间:2016-06-10 作者:zplirf

我正在使用两个插件,在组合它们时遇到了一些问题。一个是事件日历,它向帖子添加新的元键,另一个是显示帖子为网格插件,它使用自定义查询从日历插件获取事件帖子。

我需要有一个自定义查询,只获取结束时间早于当前时间的事件帖子。

我的问题是,事件结束时间的元键没有存储为完整的时间戳,而是分为3个键(见下文)。

pec_end_time_hh = \'19\'
pec_end_time_mm = \'00\'
pec_end_date = \'2016-06-10\'
如果结束时间全部存储在一个元密钥中,我可以执行以下操作:

$query[\'meta_query\'] = array(
  array(
    \'key\' => \'pec_end_datetime\',
    \'compare\' => \'<=\',
    \'value\' => current_time(\'mysql\')
  )
);
但由于结束时间被分成多个键,我被卡住了。

任何帮助都将不胜感激!

1 个回复
SO网友:Tim Malone

您可以使用meta_query 使用AND或or关系组合多个查询。诚然,在这种情况下确实有点复杂,但因为可以嵌套多个查询,所以仍然可以实现它。

这在WP_Meta_Query documentation 在某种程度上WP_Query docs.

我认为应该这样做。我还没有对此进行测试,但它应该做您想做的事情:比较这三个字段以确保事件发生在过去。

在代码下方滚动以了解其功能的说明。

$query[\'meta_query\'] = array(
  \'relation\' => \'OR\',
  array(
    \'key\' => \'pec_end_datetime\',
    \'compare\' => \'<\',
    \'value\' => current_time(\'Y-m-d\'),
    \'type\' => \'DATE\',
  ),
  array(
    \'relation\' => \'AND\',
    array(
      \'key\' => \'pec_end_datetime\',
      \'compare\' => \'=\',
      \'value\' => current_time(\'Y-m-d\'),
      \'type\' => \'DATE\',
    ),
    array(
      \'key\' => \'pec_end_time_hh\',
      \'compare\' => \'<\',
      \'value\' => current_time(\'G\'),
      \'type\' => \'NUMERIC\',
    ),
  ),
  array(
    \'relation\' => \'AND\',
    array(
      \'key\' => \'pec_end_datetime\',
      \'compare\' => \'=\',
      \'value\' => current_time(\'Y-m-d\'),
      \'type\' => \'DATE\',
    ),
    array(
      \'key\' => \'pec_end_time_hh\',
      \'compare\' => \'=\',
      \'value\' => current_time(\'G\'),
      \'type\' => \'NUMERIC\',
    ),
    array(
      \'key\' => \'pec_end_time_mm\',
      \'compare\' => \'<\',
      \'value\' => current_time(\'i\'),
      \'type\' => \'NUMERIC\',
    ),
  ),
);
我们所做的是用OR关系提供三个不同的meta\\u查询。如果其中任何一项为真,则事件发生在过去:

如果日期小于今天的日期,或者如果日期是今天,小时小于当前的小时,或者如果日期是今天,小时是当前的小时,分钟小于当前的分钟,不幸的是,我们不能将所有这些合并到一个简单的查询中,因为我们显然不希望在未来三个小时内发生事件,在半小时后,在45分钟后,作为过去事件出现!

发送到的字符串current_time() 全部匹配PHP date formats.