【问题标题】:WordPress: Query posts by date rangeWordPress:按日期范围查询帖子
【发布时间】:2017-10-11 00:26:54
【问题描述】:

我正在处理 WordPress 网站中的页面,以使用 event_start_dateevent_end_date 的自定义字段以及自定义帖子类型 event 来按日期范围显示“即将到来的”和“存档的”事件。我希望“即将发布”页面显示当前日期在此范围内和/或等于开始日期或结束日期的帖子;和“存档”页面显示当前日期完全在日期范围之后的事件。因此,如果今天是 10 月 10 日,日期为 10 月 9 日至 11 日或 10 月 10 日至 12 日的活动将显示在“即将举行”中,而任何之前日期的活动将显示在“已归档”页面上。

我在下面包含我对即将到来的页面和存档页面的查询;即将到来的查询似乎工作正常,但在存档页面中,如果当前日期在它仍会显示的日期范围内,我希望它显示过去的事件:

/* upcoming events query */
$event_args = array(
        'post_type'     =>  'event',
        'ignore_sticky_posts'   => 1,
        'posts_per_page'        => 10,
        'post_status'           => 'publish',
        'paged' => get_query_var( 'paged' ),
        'orderby'       =>  'meta_value_num',
        'order'         =>  'ASC',
        'meta_query' => array(
            'relation' => 'OR',
            array(
                'key'     => 'event_start_date',
                'type'    => 'DATE',
                'value'   => current_time('Ymd'),
                'compare' => '>=',
            ),
            array(
                'key'     => 'event_end_date',
                'type'    => 'DATE',
                'value'   => current_time('Ymd'),
                'compare' => '>=',
            ),

        ),
    );

/* archived events query */
$event_args = array(
        'post_type'     =>  'event',
        'ignore_sticky_posts'   => 1,
        'posts_per_page'        => 10,
        'post_status'           => 'publish',
        'paged' => get_query_var( 'paged' ),
        'orderby'       =>  'meta_value_num',
        'order'         =>  'ASC',
        'meta_query' => array(
            'relation' => 'OR',
            array(
                'key'     => 'event_start_date',
                'type'    => 'DATE',
                'value'   => current_time('Ymd'),
                'compare' => '<',
            ),
            array(
                'key'     => 'event_end_date',
                'type'    => 'DATE',
                'value'   => current_time('Ymd'),
                'compare' => '<',
            ),

        ),
    );

因此,用于即将发生的事件查询的meta_query 似乎适用于所有情况,但存档页面的行为未达到预期。感谢您在这里提供的任何帮助,如果我的问题有任何不清楚之处,请告诉我。 编辑我最初忽略了提到我还需要考虑只输入开始日期的场景,即单日事件,这被证明是存档页面查询的症结所在。

【问题讨论】:

    标签: php wordpress date custom-wordpress-pages


    【解决方案1】:

    在您的存档查询中,您使用了两个 meta_query 条件,我认为问题在于第一个条件

    第一个条件:event_start_date

    array(
        'key'     => 'event_start_date',
        'type'    => 'DATE',
        'value'   => current_time('Ymd'),
        'compare' => '<',
    ),
    

    如果event_start_date 小于current_time,这将查询所有事件。还要考虑您正在创建一个OR 关系。

    现在,假设今天是 10 月 10 日,偶数从 10 月 9 日到 10 月 12 日,上面的 meta_query 也将包括此事件,因为 event_start_date 小于 current_time。有意义吗?

    解决方案是只为event_end_date 包含meta_query。这样,只会查询结束日期小于current_time 的事件。

    /* archived events query */
    $event_args = array(
        'post_type'             =>  'event',
        'ignore_sticky_posts'   => 1,
        'posts_per_page'        => 10,
        'post_status'           => 'publish',
        'paged'                 => get_query_var( 'paged' ),
        'orderby'               =>  'meta_value_num',
        'order'                 =>  'ASC',
        'meta_query' => array(
             array(
                'key'     => 'event_end_date',
                'type'    => 'DATE',
                'value'   => current_time('Ymd'),
                'compare' => '<',
            ),
        ),
    );
    

    更新: 嵌套的 meta_query 逻辑也可以处理过去一天的事件。

    /* archived events query */
    $event_args = array(
        'post_type'     =>  'event',
        'ignore_sticky_posts'   => 1,
        'posts_per_page'        => 10,
        'post_status'           => 'publish',
        'paged' => get_query_var( 'paged' ),
        'orderby'       =>  'meta_value_num',
        'order'         =>  'ASC',
        'meta_query' => array(
            'relation' => 'AND',
            array(
                'key'     => 'event_start_date',
                'type'    => 'DATE',
                'value'   => current_time('Ymd'),
                'compare' => '<',
            ),
            array(
                'relation' => 'OR',
                array(
                    'key'     => 'event_end_date',
                    'type'    => 'DATE',
                    'value'   => current_time('Ymd'),
                    'compare' => '<',
                ),
                array(
                    'key'     => 'event_end_date',
                    'type'    => 'DATE',
                    'value'   => NULL,
                    'compare' => '=',
                ),
            )
        ),
    );
    

    【讨论】:

    • 感谢您的回复-我应该指定我需要考虑仅指定开始日期的实例,即仅一天的事件;因此,我需要存档模板仍将两个日期都考虑在内 - 关于如何合并该场景的任何想法?
    • 我认为您可以通过我的方法获取所有可能的事件,然后在循环时过滤它们,即如果 event_start_date 存在或您的事件插件/管理器正在管理,则不显示事件两种类型的事件。
    • 我没有使用任何类型的插件或事件管理器——只是一个带有自定义字段的简单自定义帖子类型,需要找到正确的查询。
    • 如果一个事件只针对一整天,event_start_dateevent_end_date 的值/状态是什么以及填充了哪些其他自定义字段?
    • 更新了代码。只是改变了一个值。请立即测试。
    猜你喜欢
    • 1970-01-01
    • 2018-04-10
    • 2017-11-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多