问题描述
我在 WP 模板中有一个 query_posts 调用。通过使用更多字段插件,我可以让网站管理员创建一个事件 (自定义帖子类型),然后输入格式为日期的日期:YYYY /mm /dd 。
主要问题是我应该传递什么值到 meta_query 数组中的值选项?我目前正试图通过”date(“Y /m /d h:i A”)”(减去引号),因为据了解,这将打印当前日期。我不在乎日期的时间,所以这可能是无关紧要的。 Ulitimatly 我试图使用比较选项来确定即将到来的事件,过去的事件在这个网站的不同的地方。在另一个地方,我实际上需要传递值选项一个打印当月的第一天和最后一天的数组,将输出限制在本月发生的事件中。
<?php
query_posts( array(
'post_type' => 'event', // only query events
'meta_key' => 'event_date', // load up the event_date meta
'orderby' => 'meta_value', // sort by the event_date
'order' => 'asc', // ascending, so earlier events first
'posts_per_page' => '2',
'meta_query' => array( // restrict posts based on meta values
'key' => 'event_date', // which meta to query
'value' => date("Y/m/d h:i A"), // value for comparison
'compare' => '>=', // method of comparison
'type' => 'DATE' // datatype, we don't want to compare the string values
) // end meta_query array
) // end array
); // close query_posts call
?>
最佳解决方案
我结束了同样的事情,这篇文章是非常有帮助的。我使用自定义字段,这里是我用来创建大于当前日期的所有事件的列表的代码。注意额外的基于分类法的过滤器。
<?php // Let's get the data we need to loop through below
$events = new WP_Query(
array(
'post_type' => 'event', // Tell WordPress which post type we want
'orderby' => 'meta_value', // We want to organize the events by date
'meta_key' => 'event-start-date', // Grab the "start date" field created via "More Fields" plugin (stored in YYYY-MM-DD format)
'order' => 'ASC', // ASC is the other option
'posts_per_page' => '-1', // Let's show them all.
'meta_query' => array( // WordPress has all the results, now, return only the events after today's date
array(
'key' => 'event-start-date', // Check the start date field
'value' => date("Y-m-d"), // Set today's date (note the similar format)
'compare' => '>=', // Return the ones greater than today's date
'type' => 'DATE' // Let WordPress know we're working with date
)
),
'tax_query' => array( // Return only concerts (event-types) and events where "songs-of-ascent" is performing
array(
'taxonomy' => 'event-types',
'field' => 'slug',
'terms' => 'concert',
),
array(
'taxonomy' => 'speakers',
'field' => 'slug',
'terms' => 'songs-of-ascent',
)
)
)
);
?>
次佳解决方案
它在很大程度上取决于您的日期如何存储在元数据中。一般来说,将 MySQL 的日期存储为 MySQL 日期/时间戳是个好主意。
MySQL 时间戳格式为 Y-m-d h:i:s
。
但是,使用 WP 自己的日期管理函数总是一个好主意。因此,要以 MySQL 格式获取当前日期,请使用 current_time('mysql')
。
要格式化 MySQL 日期进行显示,请使用 mysql2date($format, $mysql_date)
。在这种情况下,最好在设置中显示配置的日期,因此请使用 $format = get_option('date_format');
。
要存储 user-selected 日期,您必须将其转码为 MySQL 日期。为此,date('Y-m-d h:i:s', $unix_timestamp);
最简单但不是最安全的方式。 $unix_timestamp
通常可以通过 strtotime($user_input)
得到。
但是,strtotime()
没有对自己的身体进行健全检查,所以最好编写自己的收敛功能。
至于获取月份范围,我使用的功能是获取任何 MySQL 时间戳的月份边界:
function get_monthrange($time) {
$ym = date("Y-m", strtotime($time));
$start = $ym."-01";
$ym = explode("-", $ym);
if ($ym[1] == 12) {
$ym[0]++; $ym[1] = 1;
} else {
$ym[1]++;
}
$d = mktime( 0, 0, 0, $ym[1], 1, $ym[0] );
$d -= 86400;
$end = date("Y-m-d", $d);
return array( $start, $end );
}
如果你想获得周界,WP 已经有了一个功能:get_weekstartend($time);
,它也将边界作为一个数组。
然后,您可以通过进行两次单独的比较,在 meta_query
参数中使用这些参数。
第三种解决方案
我结束了以下的事情。我设置了一个 event-momth 字段并从中进行比较。谢谢您的帮助
<?php
$event_query = new WP_Query(
array(
'post_type' => 'event', // only query events
'meta_key' => 'event-month', // load up the event_date meta
'order_by' => 'event_date',
'order' => 'asc', // ascending, so earlier events first
'meta_query' => array(
array( // restrict posts based on meta values
'key' => 'event-month', // which meta to query
'value' => date("n"), // value for comparison
'compare' => '=', // method of comparison
'type' => 'NUMERIC' // datatype, we don't want to compare the string values
) // meta_query is an array of query ites
) // end meta_query array
) // end array
); // close WP_Query constructor call
?>
<?php while($event_query->have_posts()): $event_query->the_post(); //loop for events ?>
参考文献
注:本文内容整合自 Google/Baidu/Bing 辅助翻译的英文资料结果。如果您对结果不满意,可以加入我们改善翻译效果:薇晓朵技术论坛。