我正在寻找替换我目前网站上的事件插件。我们意识到我们不需要一个完整的日历之类的东西,我们只需要能够在活动中输入开始和结束日期以及自定义时间。我使用高级自定义字段->日期选择器字段为开始日期和结束日期创建了自定义字段。当然,一个事件可能会跨越多个月。
所以,如果一个事件从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查询中使用进行比较吗?
很抱歉,如果我的帖子太冗长了,最终,一旦完成,我会发布一个最终的、有充分文件证明的答案来回答这个否则很难回答的问题。