查询日期数组以仅显示未来事件 - PHP

Posted

技术标签:

【中文标题】查询日期数组以仅显示未来事件 - PHP【英文标题】:Query date array to display future events only - PHP 【发布时间】:2014-08-08 22:59:47 【问题描述】:

在 Wordpress 中,我创建了一个名为“事件”的自定义帖子类型,并使用高级自定义字段添加到自定义字段中。我只有基本字段,因为我们对日历的需求本身就是基本的。

字段为:开始日期、结束日期、开始时间、结束时间、位置、标题

我正在尝试使用基本上是“如果结束日期大于今天的日期,则显示帖子”的数组来查询帖子。

问题是高级自定义字段有一个内置的 DatePicker,它将日期格式化为 YYYYMMDD,而不是像 php 那样的 YYYY-MM-DD。这是我今天的代码:

if (isset($_GET['_m'])) 

    $current_month = $_GET['_m'];
    $current_day = date('d'); // the actual day
    $current_year = $_GET['_y'];
    $future_year = 2016;

    $startday = $current_year.$current_month.$current_day;
    $endday = $future_year.$current_month.$current_day;

    echo $startday;
    echo $endday;


    $args = array(
        'post_type' => 'events',
    'post_status' => 'publish',
    'posts_per_page' => '10',
    'meta_key' => 'event_date_ends',
    'meta_query' => array( 
                'key' => 'event_date_ends',
                'compare' => '>=',
                'value' => $startday,
                'type' => 'DATE'
            ), 
    'orderby' => 'meta_value_num',
    'order' => 'ASC',
    'paged' => ( get_query_var('paged') ? get_query_var('paged') : 1 ),
);

我已经尝试了至少 20 种变体和技术,最终结果是 A)返回所有已发布的“事件”或 B)不返回已发布的“事件”。

出于各种原因,我试图避免使用日历插件,主要是因为大多数资源都很庞大,而且客户希望特别列出返回值,而我无法找到一个日历插件可定制的。从视觉上看,它现在已被批准,但过去的事件不会自行自动删除。

更新:

我能够将高级自定义字段日期转换为 YYYY-MM-DD 并使用此代码,但它返回所有“事件”

$args = array(
        'post_type' => 'events',
    'post_status' => 'publish',
    'posts_per_page' => '10',
    'meta_query' => array(
                'key' => 'event_date_ends',
                'compare' => '>=',
                'value' => date(Y-m-d),
                'type' => 'DATE'
            ),
    'orderby' => 'meta_value_num',
    'order' => 'ASC',
    'paged' => ( get_query_var('paged') ? get_query_var('paged') : 1 ),
);

【问题讨论】:

仅供参考,您可以更改 ACF 保存日期的格式。 @pmandell 谢谢。我能够改变格式! 【参考方案1】:

原来我只需要通过 functions.php 将其转换为 unix 时间戳就可以了。

functions.php

function custom_unixtimesamp ( $post_id ) 
    if ( get_post_type( $post_id ) == 'events' ) 
    $startdate = get_post_meta($post_id, 'event_date_begins', true);

        if($startdate) 
            $dateparts = explode('/', $startdate);
            $newdate1 = strtotime(date('d.m.Y H:i:s', strtotime($dateparts[1].'/'.$dateparts[0].'/'.$dateparts[2])));
            update_post_meta($post_id, 'unixstartdate', $newdate1  );
        
    

add_action( 'save_post', 'custom_unixtimesamp', 100, 2);

然后查询

$today = time();    

    $args = array(
        'post_type' => 'events',
    'post_status' => 'publish',
    'posts_per_page' => '10',
    'meta_query' => array(
        array(
            'key' => 'unixstartdate',
            'compare' => '>=',
            'value' => $today,
            )
            ),
    'meta_key' => 'event_date_begins',
    'orderby' => 'meta_value',
    'order' => 'ASC',
    'paged' => ( get_query_var('paged') ? get_query_var('paged') : 1 ),
);

希望其他人能发现这很有用。

【讨论】:

【参考方案2】:

我发现了实际问题,所以我想我会更新。

ACF 文档说要使用 $today = date ('Ymd') 来比较日期,但您确实需要使用 current_time('Ymd') 所以我删除了我添加的 functions.php 代码并修复了问题而不是工作围绕它。

这是我现在的查询

$event1 = current_time('Ymd');
    $args = array(
        'post_type' => 'events',
    'post_status' => 'publish',
    'posts_per_page' => '10',
    'meta_query' => array(
        array(
            'key' => 'event_date_ends',
            'compare' => '>=',
            'value' => $event1,
            )
            ),
    'meta_key' => 'event_date_ends',
    'orderby' => 'meta_value',
    'order' => 'ASC',
    'paged' => ( get_query_var('paged') ? get_query_var('paged') : 1 ),
);

【讨论】:

以上是关于查询日期数组以仅显示未来事件 - PHP的主要内容,如果未能解决你的问题,请参考以下文章

如何更改引导 datetimepicker 以仅显示日期而不显示时间

如何更改显示日期和时间的 x 轴以仅显示月份名称?

如何在 Swift 中制作日期格式化程序以仅显示日期的年份部分?

过滤以仅显示在单元格中输入的日期之后的数据

使用php从字符串中显示日历上的日期

如何格式化 mssql 日期时间列以仅在网页输入字段上显示时间?