根据自定义字段和按日期排序显示将来的活动

时间:2014-02-08 作者:Kev

我有一个自定义内容类型(事件),在该类型中我有一个自定义日期字段,名称为:“date”。在我的模板中,我正在运行WP\\u查询以返回事件列表。我只想获取将来的事件(根据我的自定义“日期”字段),然后按同一字段对列表排序。

我尝试了以下方法,但它只返回系统中所有“事件”的列表,而不考虑日期

$today = date(\'d M, y\');

$args = array (
    \'post_type\'              => \'event\',
    \'meta_query\'             => array(
        array(
            \'key\'       => \'date\',
            \'value\'     => $today,
            \'compare\'   => \'>\',
            \'type\'      => \'CHAR\',
        ),
    ),
    \'meta_key\'               => \'date\',
    \'orderby\'                => \'meta_value_num\',
    \'order\'                  => \'ASC\'
);
请注意:如果我将类型从“CHAR”替换为“DATE”,则不会返回任何结果。。。

4 个回复
SO网友:svsdnb

我发现了实际问题,所以我想我应该更新一下。

ACF文档说要使用$today=date(\'Ymd\')来比较日期,但实际上需要使用current\\u time(\'Ymd\'),所以我删除了这些函数。我添加的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 ),
);
因此,对于您的查询,请尝试以下内容

$today = current_time(\'d M, y\');

$args = array (
    \'post_type\'              => \'event\',
    \'meta_query\'             => array(
        array(
            \'key\'       => \'date\',
            \'value\'     => $today,
            \'compare\'   => \'>=\',
        ),
    ),
    \'meta_key\'               => \'date\',
    \'orderby\'                => \'meta_value\',
    \'order\'                  => \'ASC\'
);
只要确保current\\u time(\'d M,y\')是通过您使用的任何日期选择器存储数据的方式,或者如果您在每个事件中键入数据,则在字段中键入数据。d M,y的读数为2014年6月19日。记住显示日期和存储日期的读取方式可能不同。我希望这有帮助。

SO网友:Marc Miller

这就是我所做的。我正在为自定义字段使用高级自定义字段插件。我按照这里的说明:http://wordpress.org/support/topic/plugin-advanced-custom-fields-sorting-by-date-picker, 最简单的方法是比较unix时间戳格式的日期。

ACF中的“我的日期”字段称为:event_start
日期保存在我的数据库中yymmdd 格式
我有自定义的帖子类型:events

步骤1是在ACF中创建开始日期字段
步骤2是将此函数添加到函数中。php(假设php>5.3)此函数接受我的可读前端输入,并将其转换为Unix时间戳,并将其保存在另一个post meta行中。

function custom_unixtimesamp ( $post_id ) {
  if ( get_post_type( $post_id ) == \'events\' ) {
    $startdate = get_post_meta($post_id, \'event_start\', true);
    if($startdate) {
        $newdate = DateTime::createFromFormat(\'Ymd\', $startdate)->getTimestamp();
        update_post_meta($post_id, \'unixstartdate\', $newdate  );
    }
  }
}
add_action( \'save_post\', \'custom_unixtimesamp\', 100, 2);
步骤3,现在可以在Unix时间戳上进行排序和比较

$today = time();            
$args = array(
    \'post_type\' => \'events\',
    \'posts_per_page\' => \'50\',
    \'meta_query\' => array(
        array(
            \'key\' => \'unixstartdate\',
            \'compare\' => \'>=\',
            \'value\' => $today,
        )
    ),
    \'meta_key\'=>\'event_start\',  
    \'orderby\' => \'meta_value_num\',
    \'order\' => \'ASC\'
);
$wp_query = new WP_Query( $args );

SO网友:svsdnb

马克的建议非常接近。

这是对我有效的方法,你也可以试试。

功能。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 ),
);

SO网友:lukeymo

您无需担心在函数中添加任何内容。php文件,或保存时间戳等。您只需添加正确的\'type\' 值输入到meta\\u查询数组中,让它知道您正在比较日期。所以\'type\' 应该是“DATE“。。。

例如。。。

$today = current_time(\'Y-m-d\');

$args = array (
    \'post_type\'              => \'event\',
    \'meta_query\'             => array(
        array(
            \'key\'       => \'event_date\',
            \'value\'     => $today,
            \'compare\'   => \'>=\',
            \'type\'      => \'DATE\',
        ),
    ),
    \'meta_key\'               => \'event_date\',
    \'orderby\'                => \'meta_value\',
    \'order\'                  => \'ASC\'
);
。。。在本例中,我的日期存储元字段称为“event\\u date”,我正在检查将来(或今天)有日期的条目。

结束

相关推荐

列出分类法:如果分类法没有POST,就不要列出分类法--取决于定制的POST-META?

这可能很难解释,我不知道是否有解决办法!?我有一个名为“wr\\u event”的自定义帖子类型和一个名为“event\\u type”的分层自定义分类法。自定义帖子类型有一个元框,用于event_date 并且与此帖子类型关联的所有帖子都按以下方式排序event_date. 我在循环中有一个特殊的条件来查询event_date 已经发生了-在这种情况下,它没有显示,但只列在我的档案中。就像你可以使用wp_list_categories() 我编写了一个自定义函数,它以完全相同的方式列出所有分类术语。现在