基于月份范围的元查询

时间:2017-03-15 作者:Joey Farruggio

我想根据季节(春、夏、秋、冬)将事件分为4个列表。

如果春天是3月20日到6月20日,我如何循环浏览自定义元字段(默认为mm/dd/yy格式)在该日期范围内而不受年份影响的帖子?

这是我停下来的地方$event\\u date\\u query在循环中打印正确的日期格式,但只要我离开当前的元查询,就找不到帖子。

$spring_start = \'2017-03-20\';
$spring_end = \'2017-06-20\';
$event_date_query = date(\'Y-m-d\', strtotime(get_post_meta($post->ID, \'_wccf_pp_event_date\', true)));

$args = array(
\'post_type\' => \'product\',
\'posts_per_page\' => -1,
\'meta_query\' => array(
      array(
          \'key\' => $event_date_query, 
          \'value\' => array($spring_start, $spring_end),
          \'compare\' => \'BETWEEN\', 
          \'type\' => \'DATE\',
      ),
  ),
);

1 个回复
最合适的回答,由SO网友:Paul \'Sparrow Hawk\' Biron 整理而成

问题是你传递了一个元VALUEkey 的字段meta_query...你应该通过你的metaKEY 有(“\\u wccf\\u pp\\u event\\u date”),如下所示:

$seasons = array (
    \'spring\' => array (\'2017-03-21\', \'2017-06-20\'),
    \'summer\' => array (\'2017-06-21\', \'2017-09-20\'),
    \'fall\' => array (\'2017-09-21\', \'2017-12-20\'),
    \'winter\' => array (\'2017-12-21\', \'2018-03-20\'),
    ) ;

foreach ($seasons as $season => $date_range) {
    $args = array (
        \'post_type\' => \'product\',
        \'posts_per_page\' => -1,
        \'meta_query\' => array (
            array (
                // the \'key\' should be the meta field, NOT a value you\'re looking for
                // in that field
                \'key\' => \'_wccf_pp_event_date\', //$event_date_query, 
                \'value\' => $date_range,
                \'compare\' => \'BETWEEN\', 
                \'type\' => \'DATE\',
                ),
            )
        ) ;
    $query = new WP_Query ($args) ;

    if ($query->has_posts ()) {
        while ($query->has_posts ()) {
            $query->the_post () ;
            // do something with this post
            }
        }
    else {
        echo "no $season products" ;
        }
    }
编辑,回答评论中提出的问题:不是通过标准WP\\U查询date_query.

那里might 是一种连接到从meta_query 合并一个或多个MySQLDate and Time Functions (我会先看看get_meta_sql), 但我怀疑这些日期&;时间funcs甚至会这么做。

然而,总是有“暴力”的方式:

在post\\u meta中查找日期的最短/最长年份,从最小值迭代到最大值,执行meta_query 根据我的原始答案,合并在每个迭代中找到的帖子,如下所示:

$sql = "
    SELECT YEAR(MIN(meta_value)), YEAR(MAX(meta_value))
    FROM $wpdb->postmeta
    WHERE meta_key = \'_wccf_pp_event_date\'
    " ;
list ($min_year, $max_year) = array_map (\'intval\', $wpdb->get_row ($sql, ARRAY_N)) ;

for ($year = $min_year ; $year < $max_year ; $year++) {
    // insert code from my 1st answer here, substituting $year into the dates in the $seasons array
    // (remembering to increment $year by 1 when substituting into the end date for winter)
    }
此外,分点/至点的日期每年都不同,这一点也很复杂(例如,有些年份的春季从3月20日开始,有些年份的春季从3月19日开始,等等)。然而,除非您的“产品”本质上是“天文数字”,否则您可能会忽略这一复杂性,而只是对任何一年使用相同的月/日值。

相关推荐

如何通过jQuery Datepicker搜索帖子?

我正在WordPress网站上工作,我有自己的搜索筛选页面,在那里我添加了jquery日期选择器,现在我想按日期选择器搜索帖子?Html Codescript> $(function() { jQuery( \"#datepicker-13\" ).datepicker({ dateFormat : \"yy-mm-dd\" }); $(\"#datepicker-13\").datepicker().datepick