使用META_QUERY在自定义字段中按日期显示事件

时间:2018-09-04 作者:Gozer

我正在为自定义帖子类型事件的特定类别存档制作模板。

我需要做一个查询,显示未来和正在进行的事件,按自定义字段中的日期排序。

$termName = get_queried_object()->name;
$termSlug = get_queried_object()->slug;
$event1 = current_time(\'Y-m-d\');

$args = array(
    \'post_type\' => \'event\',
    \'event-categories\' => $termSlug,
    \'post_status\' => \'publish\',
    \'posts_per_page\' => 10,
    \'order\' => \'ASC\',
    \'meta_query\' => array(
        \'relation\'    => \'OR\',
        array(
            \'relation\'    => \'AND\',

        array(

            \'key\' => \'_event_start_date\',
            \'value\' => $event1,
            \'compare\' => \'>=\',
            \'type\' => \'DATE\',

        ),


        array(

            \'key\' => \'_event_end_date\',
            \'value\' => $event1,
            \'compare\' => \'>=\',
            \'type\' => \'DATE\',

        )
        ),
        array(
            \'key\' =>  $event1,
            \'value\' => array(\'_event_start_date\',\'_event_start_date\'),
            \'type\' => \'DATE\',
            \'compare\' => \'BETWEEN\'
        )

    ),

     \'orderby\' => \'_event_start_date\',
 );
$events = new WP_Query($args);
echo $events->post_count   ;
结果仅显示未来事件,而不显示正在进行的事件。

怎么了?

1 个回复
最合适的回答,由SO网友:Fayaz 整理而成

更简单的代码:

逻辑上,当您检查>= 对于两者_event_start_date_event_end_date, 自动覆盖BETWEEN 检查

因此,以下代码应该可以工作:

$termName = get_queried_object()->name;
$termSlug = get_queried_object()->slug;
$event1 = current_time( \'Y-m-d\' );

$args = array(
    \'post_type\'        => \'event\',
    \'event-categories\' => $termSlug,
    \'post_status\'      => \'publish\',
    \'posts_per_page\'   => 10,
    \'order\'            => \'ASC\',
    \'meta_query\' => array(
        \'relation\'    => \'OR\',
        array(
            \'key\'     => \'_event_start_date\',
            \'value\'   => $event1,
            \'compare\' => \'>=\',
            \'type\'    => \'DATE\',
        ),
        array(
            \'key\'     => \'_event_end_date\',
            \'value\'   => $event1,
            \'compare\' => \'>=\',
            \'type\'    => \'DATE\',
        )
    ),
    \'orderby\' => \'_event_start_date\',
);
$events = new WP_Query( $args );
echo $events->post_count;
日期检查:此外,请确保日期值$event1 正确地设置为存储在数据库中的(在post元表中)。通常,WordPress内部会考虑所有dateGMT 时区。但是,这可能会因_event_start_date_event_end_date 保存在您的案例中。根据存储值的不同,它可能会有所不同:

// MySQL DATETIME field format
$event1 = current_time( \'mysql\' );

// MySQL DATETIME field format in GMT
$event1 = current_time( \'mysql\', 1 );

// Unix timestamp in local time zone
$event1 = current_time( \'timestamp\' );

// Unix timestamp in GMT
$event1 = current_time( \'timestamp\', 1 );
所以,最好检查数据是如何保存的,或者用这些差异进行测试。如果date 字段也包括时间,然后您还可以使用DATETIME 类型

还有,来自codex:

仅当日期以以下格式存储时,“type”日期才与“compare”值一起使用YYYY-MM-DD 并用这种格式进行了测试。

tax 查询:

tax 查询已弃用。因此,不要使用:

\'event-categories\' => $termSlug,
使用:

\'tax_query\' => array(
    array(
        \'taxonomy\' => \'event-categories\',
        \'field\'    => \'slug\',
        \'terms\'    => $termSlug,
    ),
),

结束

相关推荐

Should I update my _s theme?

我知道如何使用儿童主题及其背后的原因。但它与在美国建立你的主题有什么不同呢?也会自动更新,不是吗?显然,如果我下载最新版本,它将覆盖我主题中的所有内容,所以我不会这么做。那么,它与需要更新的正常父主题有什么不同,它不需要更新(即使有更新的版本可用)?非常感谢。