0

我正在使用自定义字段和帖子类型在 WP 中创建一些事件类型的帖子。每个事件(帖子类型:事件)包含以下字段:

  • 标题(the_title)
  • 说明(the_content)
  • 开始日期 (meta_key: start_date) 在 meta_value 中存储时间戳
  • 结束日期 (meta_key: end_date) 在 meta_value 中存储时间戳

我想要的是,获取日期之间的所有记录。例如,我想显示一个日历(月视图)。我想查询在特定月份/可能发生的所有此类事件。

主要问题是,如果事件是单一日期(同一天)或短范围(同一个月,跨越几天)或相邻月份之间的短范围(几天,但日期介于 2013 年 4 月和 2013 年 5 月之间,假设) 一切正常。但是,当一个事件跨越数月时,例如如果一个事件从 2013 年 4 月 20 日开始到 2013 年 7 月 25 日结束,它就不会出现。它仅在 2013 年 4 月和 2013 年 7 月可见 - 而我想在所有发生的月份(2013 年 4 月、13 年 5 月、13 年 6 月和 13 年 7 月)显示它。

谁能帮我建立一个 WP 的自定义查询(WP_Query 或对 Posts 和 Posts Meta 表的直接 MySQL 查询)来解决这个问题?请记住,有 2 个元字段(如上所述),它们以时间戳存储开始和结束日期。

- 编辑 -

为了深入了解我目前使用的内容,以下是我正在使用的 SQL 查询:

SELECT DISTINCT 
    wpmh_posts.* 
FROM 
    wpmh_posts, wpmh_postmeta 
WHERE 
    wpmh_posts.ID = wpmh_postmeta.post_id 
    AND wpmh_posts.post_status = 'publish' 
    AND wpmh_posts.post_type = 'events_calendar' 
    AND ( 
            ( 
                (
                    wpmh_postmeta.meta_key='wpcf-start_date' 
                    AND wpmh_postmeta.meta_value >= 1364774400
                ) OR (
                    wpmh_postmeta.meta_key='wpcf-end_date' 
                    AND wpmh_postmeta.meta_value >= 1364774400
                ) 
            ) OR ( 
                (
                    wpmh_postmeta.meta_key='wpcf-start_date' 
                    AND wpmh_postmeta.meta_value <= 1367366399
                ) OR (
                    wpmh_postmeta.meta_key='wpcf-end_date' 
                    AND wpmh_postmeta.meta_value <= 1367366399
                ) 
            ) 
    ) 
    ORDER BY 
        wpmh_postmeta.meta_value ASC

其中 1364774400 是 2013 年 4 月 1 日的时间戳,1367366399 是 2013 年 4 月 30 日的时间戳(显然分别包含时间 00:00:00 和 23:59:59)。但我不想比较时间,我只想选择所有那些介于这两个时间戳之间的记录,即使事件的开始日期是上个月的并在下个月或下个月的某个地方结束——这在逻辑上是一个发生的事件2013 年 4 月也是。

对于事件的示例,我有以下事件:

  • 测试活动 1:2013 年 3 月 1 日开始 2013 年 3 月 10 日结束
  • 测试活动 2:2013 年 4 月 10 日开始 2013 年 4 月 26 日结束
  • 测试活动 3:2013 年 4 月 10 日开始 2013 年 5 月 5 日结束
  • 测试活动 4:2013 年 3 月 15 日开始 2013 年 6 月 10 日结束
4

1 回答 1

1

编辑:修改 WP_Query 下面

如果你不分享自己的代码,很难给你很好的帮助。

我在 WordPress 中为自定义日历使用了以下代码:

// Query arguments for upcoming events query
$args = array(
    'meta_query' => array(
        array(
            'key' => 'end_date',
            'value' => strtotime(date("Y-m-d")), // Uses current server timestamp now
            'compare' => '>=',
            'type' => 'NUMERIC' // I think you will need to use numeric here, instead of datestamp
        )
    ),
    'orderby' => 'meta_value_num', // Edit: Changed this so its sorted after numeric value
    'meta_key' => 'start_date', // Sort after 'start_date'
    'post_type' => 'events_calendar', // Change this value to your own 'post_type_name'
    'posts_per_page' => -1,
    'order' => 'ASC',
);

// The Query
$upcoming_events_query = new WP_Query( $args );

while ( $upcoming_events_query->have_posts() ) : $upcoming_events_query->the_post();
    // Your template code here!
endwhile;
wp_reset_query();

帖子将在您的 start_date 之后排序,但超过结束日期的事件将从查询中排除。

这仅在您的所有事件 start_date 和 end_date 值都保存为以下日期格式时才有效:'Ymd' - 此查询仅在日期上进行了测试,并且尚未与日期中的时间相结合。在最坏的情况下,这可能会为您提供一些基础。

如果您需要更多帮助,请分享您的代码。

于 2013-04-29T09:16:48.523 回答