使用日期选取器字段在日期之间进行查询

时间:2014-06-09 作者:Robbiegod

我正在寻找替换我目前网站上的事件插件。我们意识到我们不需要一个完整的日历之类的东西,我们只需要能够在活动中输入开始和结束日期以及自定义时间。我使用高级自定义字段->日期选择器字段为开始日期和结束日期创建了自定义字段。当然,一个事件可能会跨越多个月。

所以,如果一个事件从5月持续到7月,我在6月,我希望这个事件出现。

我们的主页上有一个小部件,可以按月和按年加载事件。例如,它显示了5月份的所有事件。我遇到的问题是,如果一个活动从5月开始,到7月结束,我希望该活动也能在6月份出现,因为该活动仍在继续。也许我可以做一个前后比较的事情。我已经将wordpress更新到今天的最新版本。

我不太确定应该如何使用自定义字段处理日期查询。有没有更好的方法可以让我做到这一点?

我想知道您是否有一些建议,或者是否可以帮助我解决我试图写的问题。

以下是我目前掌握的情况:

$all_events = array (
\'post_type\' => \'events\',
    \'posts_per_page\' => 50,
    \'meta_query\' => array(
    array(
        \'key\'       => \'event_start_date\',
        \'compare\'   => \'>=\',
        \'value\'     => $startday,
    ),
     array(
        \'key\'       => \'event_end_date\',
        \'compare\'   => \'<=\',
        \'value\'     => $endday,
    )
    ),
);
这几乎奏效了。如果开始和结束日期在同一个月内,它将显示事件,但我看不到在另一个月或两个月后结束的事件。

我将月份和年份传递到页面以按月份和年份过滤列表。。。我想知道是否有一个更好的比较,我应该使用的结束日期,以便它看到这些事件可能已经开始在选定的月份,但也结束在一个更晚的时间。

如有任何建议,将不胜感激。

更新#1:

经过一些实验,我可能已经找到了一个解决方案。看看这个。

$all_events = array (
    \'post_type\' => \'events\',
        \'posts_per_page\' => 50,
        \'status\' => \'published\',
        \'meta_key\'      => \'event_start_date\',
        \'orderby\'       => \'meta_value_num\',
        \'order\'         => \'ASC\',
        \'meta_query\' => array(
        array(
            \'key\'       => \'event_start_date\',
            \'compare\'   => \'>=\',
            \'value\'     => $startday,
        ),
            array(
            \'key\'       => \'event_start_date\',
            \'compare\'   => \'BETWEEN\',
            \'value\'     => array($startday, $endday),
        ),

             array(
            \'key\'       => \'event_end_date\',
            \'compare\'   => \'>=\',
            \'value\'     => $endday,
        )
    ),
);
这个也不行。我能够获取并显示事件,但有些事件无法准确显示。最困难的部分是一个事件可能会持续几个月。例如,它可能从4月1日开始,一直持续到7月15日。我面临的问题是如何在5月和6月展示这些事件。

我尝试了另一种方法,那就是编写SQL查询来获取帖子并显示它们。我遇到了同样的问题,但也许对这个查询进行一些进一步的调整,我们可以让它工作。

$startday和$endday的值分别为20140601和20140630。我想抓住这两个日期之间可能发生的所有事件。我现在看到了我写的方式,如果结束日期超过20140630,那么它将不会显示。我还认为日期值是以字符串形式存储的,所以我需要转换它们还是对这些值做些什么,使其行为类似于真实的日期字段?是否有一种方法可以将此分为两个查询。第一个查询将查询所有事件,然后其他查询可以获得初始查询结果的子集?

$querystr = "
    SELECT *
    FROM $wpdb->posts wposts, $wpdb->postmeta metastart, $wpdb->postmeta metaend
    WHERE (wposts.ID = metastart.post_id AND wposts.ID = metaend.post_id)
        AND (metastart.meta_key = \'event_start_date\' AND metastart.meta_value > $startday )
        AND (metaend.meta_key = \'event_end_date\' AND metaend.meta_value <= $endday )
        AND wposts.post_type = \'events\'
    AND wposts.post_status = \'publish\'
    ORDER BY metastart.meta_value ASC
 ";

UPDATE #3

我已经取得了一点进步,我想我已经快到终点了,但我需要一些帮助来完成这最后一点。

我们提出的解决方案对我来说似乎有点古怪,但我认为我们可以让它发挥作用。我就是这么做的。我创建了两个字段,一个用于开始日期,一个用于结束日期。我创建了一个额外的自定义字段来保存其中的日期范围。它们以逗号分隔的字符串形式出现。然后我查询该字段,查看从月初到月末的日期范围中是否有任何日期匹配。这就是我现在一直坚持的部分。

告诉我此设置是否正确。

首先是我的职能。php文件中,我设置了两个函数来处理创建日期范围,然后将范围保存到自定义字段(默认情况下,该字段将被隐藏,因此用户甚至不知道它在哪里)。

制作一个日期范围函数-我在互联网上的某个地方找到了这个函数,可能是在这个网站上。

function makeDateRangeArray($startday,$endday)
{
$aryRange=array();

$iDateFrom=mktime(1,0,0,substr($startday,5,2), substr($startday,8,2),substr($startday,0,4));
$iDateTo=mktime(1,0,0,substr($endday,5,2), substr($endday,8,2),substr($endday,0,4));

if ($iDateTo>=$iDateFrom)
{
    array_push($aryRange,date(\'Ymd\',$iDateFrom)); // first entry
    while ($iDateFrom<$iDateTo)
    {
        $iDateFrom+=86400; // add 24 hours
        array_push($aryRange,date(\'Ymd\',$iDateFrom));
    }
}
return $aryRange;
}
然后,我创建了一个函数,用转换为日期范围字符串的数组更新textarea字段。如果我的开始日期是1月1日,结束日期是1月15日,我会将20140101-20140115放入这个额外字段。稍后我将查询此字段,而不是两个日期选择器字段。

function update_event_date_range( $post_id ) {

    $slug = \'events\';

    // If this isn\'t an \'event\' post, don\'t update it.
  if ( $slug != $_POST[\'post_type\'] ) {
      return;
  }

    // Qry the post by ID
    if ( isset( $post_id ) ) {

        // Get the date field values
        $tempstartday = get_field( "event_start_date", $post_id);
        $tempendday = get_field( "event_end_date", $post_id);

        // setup date vars
        $startday = date(\'Y-m-d\', strtotime($tempstartday)); // keep hyphens
        $endday = date(\'Y-m-d\', strtotime($tempendday)); // keep hyphens

        // Make the array
        $DateRangeAry = makeDateRangeArray($startday, $endday);
        $date_str = implode(\', \', $DateRangeAry);

    // Update the new post field with the date span
    update_post_meta( $post_id, \'auto_event_date_span\', $date_str );

}
}
add_action( \'save_post\', \'update_event_date_range\' );
所以,所有这些都很有效,我看到我所有的活动帖子都在新字段中插入了正确的日期字符串。

我基于月初和月末创建了一个新的日期范围,因为我只想看到发生在5月、6月或7月的事件。如果一个事件跨越多个月,那么它也应该在这些月出现。

$aryDates = createDateRangeArray($startday, $endday);
$date_str = implode(\', \', $aryDates);
我设置自定义查询:

$all_events = array (
\'post_type\' => \'events\',
    \'posts_per_page\' => 50,
    \'status\' => \'published\',
    \'meta_query\' => array(
    array(
    \'key\' => \'auto_event_date_span\',
    \'value\' => $date_str,
    \'compare\' => \'IN\'
  )
 )
);
我尝试将“值”作为数组和字符串发送。我知道我可以在“值”中发送一个数组,但我不知道我正在比较的数组的“字段”中是否也可以包含多个值?

我在这里遗漏了什么,或者这不管用吗?

我确实看到,如果有一天的事件,这意味着在“auto\\u event\\u date\\u span”字段中,如果只有一个日期,如20140116,它将能够匹配这些类型的事件,但一旦我在字段中添加了一系列日期,它就会停止工作。真倒霉

问题是我可以发送一个数组或字符串并在meta\\u查询中使用进行比较吗?

很抱歉,如果我的帖子太冗长了,最终,一旦完成,我会发布一个最终的、有充分文件证明的答案来回答这个否则很难回答的问题。

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

wordpress的“keesiemeijer”获得了100%的积分。组织提出有效的解决方案。

如果其他人正在努力解决这个问题,下面是答案。下面是场景。您有使用高级自定义字段日期选择器字段类型的具有开始和结束日期的事件。您正在尝试查询按月发生的事件,并且某些事件跨越多个月。

为了能够做到这一点,您需要在函数中删除此函数。php文件:

function get_meta_sql_date( $pieces, $queries ) {
    global $wpdb;

    // get start and end date from query
    foreach ( $queries as $q ) {

        if ( !isset( $q[\'key\'] ) ) {
            return $pieces;
        }

        if ( \'event_start_date\' === $q[\'key\'] ) {
            $start_date = isset( $q[\'value\'] ) ?  $q[\'value\'] : \'\';
        }
        if ( \'event_end_date\' === $q[\'key\'] ) {
            $end_date = isset( $q[\'value\'] ) ?  $q[\'value\'] : \'\';
        }
    }

    if ( ( \'\' === $start_date ) || ( \'\' === $end_date ) ) {
        return $pieces;
    }

    $query = "";

    // after start date AND before end date
    $_query = " AND (
        ( $wpdb->postmeta.meta_key = \'event_start_date\' AND ( CAST($wpdb->postmeta.meta_value AS DATE) >= %s) )
        AND ( mt1.meta_key = \'event_end_date\' AND ( CAST(mt1.meta_value AS DATE) <= %s) )
    )";
    $query .= $wpdb->prepare( $_query, $start_date, $end_date );

    // OR before start date AND after end end date
    $_query = " OR (
        ( $wpdb->postmeta.meta_key = \'event_start_date\' AND ( CAST($wpdb->postmeta.meta_value AS DATE) <= %s) )
        AND ( mt1.meta_key = \'event_end_date\' AND ( CAST(mt1.meta_value AS DATE) >= %s) )
    )";
    $query .= $wpdb->prepare( $_query, $start_date, $end_date );

    // OR before start date AND (before end date AND end date after start date)
    $_query = " OR (
        ( $wpdb->postmeta.meta_key = \'event_start_date\' AND ( CAST($wpdb->postmeta.meta_value AS DATE) <= %s) )
        AND ( mt1.meta_key = \'event_end_date\'
            AND ( CAST(mt1.meta_value AS DATE) <= %s )
            AND ( CAST(mt1.meta_value AS DATE) >= %s )
        )
    )";
    $query .= $wpdb->prepare( $_query, $start_date, $end_date, $start_date );

    // OR after end date AND (after start date AND start date before end date) )
    $_query = "OR (
        ( mt1.meta_key = \'event_end_date\' AND ( CAST(mt1.meta_value AS DATE) >= %s ) )
        AND ( $wpdb->postmeta.meta_key = \'event_start_date\'
            AND ( CAST($wpdb->postmeta.meta_value AS DATE) >= %s )
            AND ( CAST($wpdb->postmeta.meta_value AS DATE) <= %s )
        )
    )";
    $query .= $wpdb->prepare( $_query, $end_date, $start_date, $end_date );

    $pieces[\'where\'] = $query;

    return $pieces;
}
然后在页面模板中,将以下内容添加到查询中:

<?php
add_filter( \'get_meta_sql\', \'get_meta_sql_date\', 10, 2 );
$all_events = array (
    \'post_type\' => \'events\',
    \'posts_per_page\' => 50,

    // creates the meta sql join and where clauses
    // which will be filtered in functions.php
    // must be two meta_query arrays
    \'meta_query\' => array(
        \'relation\' => \'AND\',
        array(
            \'key\'       => \'event_start_date\',
            \'compare\'   => \'>=\',
            \'value\'     => \'20140601\',
            \'type\'      => \'DATE\'
        ),
        array(
            \'key\'       => \'event_end_date\',
            \'compare\'   => \'<=\',
            \'value\'     => \'20140630\',
            \'type\'      => \'DATE\'
        )
    ),
);

$date_query = new WP_Query( $all_events );
remove_filter( \'get_meta_sql\', \'get_meta_sql_date\', 10, 2 );
?>
在我的主题中进行测试后,将从5月开始到7月结束的活动将在5月、6月和7月出现。

再次感谢keesiemeijer!

SO网友:Milo

Codex列出了WP_Query page.

如果希望事件的开始日期介于一系列日期之间,或者希望事件的结束日期介于一系列日期之间,那么类似的方式应该可以-

\'relation\' => \'OR\',
    array(
        \'key\' => \'event_start_date\',
        \'value\' => array( $beginning_of_range, $end_of_range ),
        \'compare\' => \'BETWEEN\',
        \'type\' => \'DATE\'
    ),
    array(
        \'key\' => \'event_end_date\',
        \'value\' => array( $beginning_of_range, $end_of_range ),
        \'compare\' => \'BETWEEN\',
        \'type\' => \'DATE\'
    )

结束

相关推荐

DELETE_OPTION()和UPDATE_OPTION()返回假

我知道当delete_option() 或update_option() 如果无法执行各自的数据库交互,则返回false。有人知道为什么他们不能执行这些操作吗?这只是针对特定选项。大多数选项都会起作用,然而,少数选项似乎会“消亡”。他们会好好工作一段时间,然后停止工作。有什么想法吗?

使用日期选取器字段在日期之间进行查询 - 小码农CODE - 行之有效找到问题解决它

使用日期选取器字段在日期之间进行查询

时间:2014-06-09 作者:Robbiegod

我正在寻找替换我目前网站上的事件插件。我们意识到我们不需要一个完整的日历之类的东西,我们只需要能够在活动中输入开始和结束日期以及自定义时间。我使用高级自定义字段->日期选择器字段为开始日期和结束日期创建了自定义字段。当然,一个事件可能会跨越多个月。

所以,如果一个事件从5月持续到7月,我在6月,我希望这个事件出现。

我们的主页上有一个小部件,可以按月和按年加载事件。例如,它显示了5月份的所有事件。我遇到的问题是,如果一个活动从5月开始,到7月结束,我希望该活动也能在6月份出现,因为该活动仍在继续。也许我可以做一个前后比较的事情。我已经将wordpress更新到今天的最新版本。

我不太确定应该如何使用自定义字段处理日期查询。有没有更好的方法可以让我做到这一点?

我想知道您是否有一些建议,或者是否可以帮助我解决我试图写的问题。

以下是我目前掌握的情况:

$all_events = array (
\'post_type\' => \'events\',
    \'posts_per_page\' => 50,
    \'meta_query\' => array(
    array(
        \'key\'       => \'event_start_date\',
        \'compare\'   => \'>=\',
        \'value\'     => $startday,
    ),
     array(
        \'key\'       => \'event_end_date\',
        \'compare\'   => \'<=\',
        \'value\'     => $endday,
    )
    ),
);
这几乎奏效了。如果开始和结束日期在同一个月内,它将显示事件,但我看不到在另一个月或两个月后结束的事件。

我将月份和年份传递到页面以按月份和年份过滤列表。。。我想知道是否有一个更好的比较,我应该使用的结束日期,以便它看到这些事件可能已经开始在选定的月份,但也结束在一个更晚的时间。

如有任何建议,将不胜感激。

更新#1:

经过一些实验,我可能已经找到了一个解决方案。看看这个。

$all_events = array (
    \'post_type\' => \'events\',
        \'posts_per_page\' => 50,
        \'status\' => \'published\',
        \'meta_key\'      => \'event_start_date\',
        \'orderby\'       => \'meta_value_num\',
        \'order\'         => \'ASC\',
        \'meta_query\' => array(
        array(
            \'key\'       => \'event_start_date\',
            \'compare\'   => \'>=\',
            \'value\'     => $startday,
        ),
            array(
            \'key\'       => \'event_start_date\',
            \'compare\'   => \'BETWEEN\',
            \'value\'     => array($startday, $endday),
        ),

             array(
            \'key\'       => \'event_end_date\',
            \'compare\'   => \'>=\',
            \'value\'     => $endday,
        )
    ),
);
这个也不行。我能够获取并显示事件,但有些事件无法准确显示。最困难的部分是一个事件可能会持续几个月。例如,它可能从4月1日开始,一直持续到7月15日。我面临的问题是如何在5月和6月展示这些事件。

我尝试了另一种方法,那就是编写SQL查询来获取帖子并显示它们。我遇到了同样的问题,但也许对这个查询进行一些进一步的调整,我们可以让它工作。

$startday和$endday的值分别为20140601和20140630。我想抓住这两个日期之间可能发生的所有事件。我现在看到了我写的方式,如果结束日期超过20140630,那么它将不会显示。我还认为日期值是以字符串形式存储的,所以我需要转换它们还是对这些值做些什么,使其行为类似于真实的日期字段?是否有一种方法可以将此分为两个查询。第一个查询将查询所有事件,然后其他查询可以获得初始查询结果的子集?

$querystr = "
    SELECT *
    FROM $wpdb->posts wposts, $wpdb->postmeta metastart, $wpdb->postmeta metaend
    WHERE (wposts.ID = metastart.post_id AND wposts.ID = metaend.post_id)
        AND (metastart.meta_key = \'event_start_date\' AND metastart.meta_value > $startday )
        AND (metaend.meta_key = \'event_end_date\' AND metaend.meta_value <= $endday )
        AND wposts.post_type = \'events\'
    AND wposts.post_status = \'publish\'
    ORDER BY metastart.meta_value ASC
 ";

UPDATE #3

我已经取得了一点进步,我想我已经快到终点了,但我需要一些帮助来完成这最后一点。

我们提出的解决方案对我来说似乎有点古怪,但我认为我们可以让它发挥作用。我就是这么做的。我创建了两个字段,一个用于开始日期,一个用于结束日期。我创建了一个额外的自定义字段来保存其中的日期范围。它们以逗号分隔的字符串形式出现。然后我查询该字段,查看从月初到月末的日期范围中是否有任何日期匹配。这就是我现在一直坚持的部分。

告诉我此设置是否正确。

首先是我的职能。php文件中,我设置了两个函数来处理创建日期范围,然后将范围保存到自定义字段(默认情况下,该字段将被隐藏,因此用户甚至不知道它在哪里)。

制作一个日期范围函数-我在互联网上的某个地方找到了这个函数,可能是在这个网站上。

function makeDateRangeArray($startday,$endday)
{
$aryRange=array();

$iDateFrom=mktime(1,0,0,substr($startday,5,2), substr($startday,8,2),substr($startday,0,4));
$iDateTo=mktime(1,0,0,substr($endday,5,2), substr($endday,8,2),substr($endday,0,4));

if ($iDateTo>=$iDateFrom)
{
    array_push($aryRange,date(\'Ymd\',$iDateFrom)); // first entry
    while ($iDateFrom<$iDateTo)
    {
        $iDateFrom+=86400; // add 24 hours
        array_push($aryRange,date(\'Ymd\',$iDateFrom));
    }
}
return $aryRange;
}
然后,我创建了一个函数,用转换为日期范围字符串的数组更新textarea字段。如果我的开始日期是1月1日,结束日期是1月15日,我会将20140101-20140115放入这个额外字段。稍后我将查询此字段,而不是两个日期选择器字段。

function update_event_date_range( $post_id ) {

    $slug = \'events\';

    // If this isn\'t an \'event\' post, don\'t update it.
  if ( $slug != $_POST[\'post_type\'] ) {
      return;
  }

    // Qry the post by ID
    if ( isset( $post_id ) ) {

        // Get the date field values
        $tempstartday = get_field( "event_start_date", $post_id);
        $tempendday = get_field( "event_end_date", $post_id);

        // setup date vars
        $startday = date(\'Y-m-d\', strtotime($tempstartday)); // keep hyphens
        $endday = date(\'Y-m-d\', strtotime($tempendday)); // keep hyphens

        // Make the array
        $DateRangeAry = makeDateRangeArray($startday, $endday);
        $date_str = implode(\', \', $DateRangeAry);

    // Update the new post field with the date span
    update_post_meta( $post_id, \'auto_event_date_span\', $date_str );

}
}
add_action( \'save_post\', \'update_event_date_range\' );
所以,所有这些都很有效,我看到我所有的活动帖子都在新字段中插入了正确的日期字符串。

我基于月初和月末创建了一个新的日期范围,因为我只想看到发生在5月、6月或7月的事件。如果一个事件跨越多个月,那么它也应该在这些月出现。

$aryDates = createDateRangeArray($startday, $endday);
$date_str = implode(\', \', $aryDates);
我设置自定义查询:

$all_events = array (
\'post_type\' => \'events\',
    \'posts_per_page\' => 50,
    \'status\' => \'published\',
    \'meta_query\' => array(
    array(
    \'key\' => \'auto_event_date_span\',
    \'value\' => $date_str,
    \'compare\' => \'IN\'
  )
 )
);
我尝试将“值”作为数组和字符串发送。我知道我可以在“值”中发送一个数组,但我不知道我正在比较的数组的“字段”中是否也可以包含多个值?

我在这里遗漏了什么,或者这不管用吗?

我确实看到,如果有一天的事件,这意味着在“auto\\u event\\u date\\u span”字段中,如果只有一个日期,如20140116,它将能够匹配这些类型的事件,但一旦我在字段中添加了一系列日期,它就会停止工作。真倒霉

问题是我可以发送一个数组或字符串并在meta\\u查询中使用进行比较吗?

很抱歉,如果我的帖子太冗长了,最终,一旦完成,我会发布一个最终的、有充分文件证明的答案来回答这个否则很难回答的问题。

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

wordpress的“keesiemeijer”获得了100%的积分。组织提出有效的解决方案。

如果其他人正在努力解决这个问题,下面是答案。下面是场景。您有使用高级自定义字段日期选择器字段类型的具有开始和结束日期的事件。您正在尝试查询按月发生的事件,并且某些事件跨越多个月。

为了能够做到这一点,您需要在函数中删除此函数。php文件:

function get_meta_sql_date( $pieces, $queries ) {
    global $wpdb;

    // get start and end date from query
    foreach ( $queries as $q ) {

        if ( !isset( $q[\'key\'] ) ) {
            return $pieces;
        }

        if ( \'event_start_date\' === $q[\'key\'] ) {
            $start_date = isset( $q[\'value\'] ) ?  $q[\'value\'] : \'\';
        }
        if ( \'event_end_date\' === $q[\'key\'] ) {
            $end_date = isset( $q[\'value\'] ) ?  $q[\'value\'] : \'\';
        }
    }

    if ( ( \'\' === $start_date ) || ( \'\' === $end_date ) ) {
        return $pieces;
    }

    $query = "";

    // after start date AND before end date
    $_query = " AND (
        ( $wpdb->postmeta.meta_key = \'event_start_date\' AND ( CAST($wpdb->postmeta.meta_value AS DATE) >= %s) )
        AND ( mt1.meta_key = \'event_end_date\' AND ( CAST(mt1.meta_value AS DATE) <= %s) )
    )";
    $query .= $wpdb->prepare( $_query, $start_date, $end_date );

    // OR before start date AND after end end date
    $_query = " OR (
        ( $wpdb->postmeta.meta_key = \'event_start_date\' AND ( CAST($wpdb->postmeta.meta_value AS DATE) <= %s) )
        AND ( mt1.meta_key = \'event_end_date\' AND ( CAST(mt1.meta_value AS DATE) >= %s) )
    )";
    $query .= $wpdb->prepare( $_query, $start_date, $end_date );

    // OR before start date AND (before end date AND end date after start date)
    $_query = " OR (
        ( $wpdb->postmeta.meta_key = \'event_start_date\' AND ( CAST($wpdb->postmeta.meta_value AS DATE) <= %s) )
        AND ( mt1.meta_key = \'event_end_date\'
            AND ( CAST(mt1.meta_value AS DATE) <= %s )
            AND ( CAST(mt1.meta_value AS DATE) >= %s )
        )
    )";
    $query .= $wpdb->prepare( $_query, $start_date, $end_date, $start_date );

    // OR after end date AND (after start date AND start date before end date) )
    $_query = "OR (
        ( mt1.meta_key = \'event_end_date\' AND ( CAST(mt1.meta_value AS DATE) >= %s ) )
        AND ( $wpdb->postmeta.meta_key = \'event_start_date\'
            AND ( CAST($wpdb->postmeta.meta_value AS DATE) >= %s )
            AND ( CAST($wpdb->postmeta.meta_value AS DATE) <= %s )
        )
    )";
    $query .= $wpdb->prepare( $_query, $end_date, $start_date, $end_date );

    $pieces[\'where\'] = $query;

    return $pieces;
}
然后在页面模板中,将以下内容添加到查询中:

<?php
add_filter( \'get_meta_sql\', \'get_meta_sql_date\', 10, 2 );
$all_events = array (
    \'post_type\' => \'events\',
    \'posts_per_page\' => 50,

    // creates the meta sql join and where clauses
    // which will be filtered in functions.php
    // must be two meta_query arrays
    \'meta_query\' => array(
        \'relation\' => \'AND\',
        array(
            \'key\'       => \'event_start_date\',
            \'compare\'   => \'>=\',
            \'value\'     => \'20140601\',
            \'type\'      => \'DATE\'
        ),
        array(
            \'key\'       => \'event_end_date\',
            \'compare\'   => \'<=\',
            \'value\'     => \'20140630\',
            \'type\'      => \'DATE\'
        )
    ),
);

$date_query = new WP_Query( $all_events );
remove_filter( \'get_meta_sql\', \'get_meta_sql_date\', 10, 2 );
?>
在我的主题中进行测试后,将从5月开始到7月结束的活动将在5月、6月和7月出现。

再次感谢keesiemeijer!

SO网友:Milo

Codex列出了WP_Query page.

如果希望事件的开始日期介于一系列日期之间,或者希望事件的结束日期介于一系列日期之间,那么类似的方式应该可以-

\'relation\' => \'OR\',
    array(
        \'key\' => \'event_start_date\',
        \'value\' => array( $beginning_of_range, $end_of_range ),
        \'compare\' => \'BETWEEN\',
        \'type\' => \'DATE\'
    ),
    array(
        \'key\' => \'event_end_date\',
        \'value\' => array( $beginning_of_range, $end_of_range ),
        \'compare\' => \'BETWEEN\',
        \'type\' => \'DATE\'
    )

相关推荐

如何通过jQuery Datepicker搜索帖子?

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