具有多个日期的事件,按时间顺序显示事件

时间:2013-08-20 作者:Erik

这几天来,我一直在为这件事绞尽脑汁,似乎弄不明白(我的知识有限)。我希望实现以下目标:

我有一个自定义的帖子类型“Events”。每个事件每年可以发生多次,所以我有日期的自定义字段,比如“dateA”、“dateB”、“dateC”。我想在检查日期是否在将来之后,按时间顺序在页面上显示所有事件日期组合。

有几种简单的方法可以做到这一点,但它们都有主要缺陷:

为每个日期创建单独的事件,但这将是一个需要维护的任务。

多次循环事件,第一次循环显示带有日期A的事件,第二次循环显示带有日期B的事件等。这要求所有日期B都在最后一个日期A之后。

因此,基本上我需要(以某种方式)做的是:

创建唯一的日期事件组合

将日期与当前日期进行比较

根据事件日期按时间顺序显示未来事件。

是否可以做到这一点,如果可以,我将如何处理。任何指点都将不胜感激!

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

给你,解释作为评论

// setup array to store things in while we loop
$events_out = array();

// assume you already have your loop built the way you want
while($loop->have_posts()) : $loop->the_post();
    $instances = array();
    // grab meta dates
    $instances[] = get_post_meta($post->ID, \'dateA\', true);
    $instances[] = get_post_meta($post->ID, \'dateB\', true);
    $instances[] = get_post_meta($post->ID, \'dateC\', true);

    foreach($instances as $instance){
        if(!empty($instance)){
            // save into outter array with post_id so we can ref more data
            $events_out[] = array(
                \'timestamp\' => $instance,
                \'post_id\' => $post->ID,
            );
        }
    }

endwhile;

// use array_msort to sort by date! defined below
$events_sorted = array_msort($events_out, array(\'timestamp\' => SORT_ASC));

// output in order, with whatever meta/stuff you want
foreach($events_sorted as $event){
    echo \'<div>\';
    echo \'<h2>\'.get_the_title($event[\'post_id\']).\'</h2>\';
    echo \'<h3>\'.date(\'m/d/Y\', $event[\'timestamp\']).\'</h3>\';
    echo get_post_meta($event[\'post_id\'], \'some_meta_stuff\', true);
    echo \'<a href="\'.get_permalink($event[\'post_id\']).\'">Read More</a>\';
    echo \'</div>\';
}

/**
 * array_msort: array_multisort variant
 * use: array_msort($array, array(\'name\'=>SORT_DESC, \'cat\'=>SORT_ASC));
 */
function array_msort($array, $cols)
{
    $colarr = array();
    foreach ($cols as $col => $order) {
        $colarr[$col] = array();
        foreach ($array as $k => $row) { $colarr[$col][\'_\'.$k] = strtolower($row[$col]); }
    }
    $eval = \'array_multisort(\';
    foreach ($cols as $col => $order) {
        $eval .= \'$colarr[\\\'\'.$col.\'\\\'],\'.$order.\',\';
    }
    $eval = substr($eval,0,-1).\');\';
    eval($eval);
    $ret = array();
    foreach ($colarr as $col => $arr) {
        foreach ($arr as $k => $v) {
            $k = substr($k,1);
            if (!isset($ret[$k])) $ret[$k] = $array[$k];
            $ret[$k][$col] = $array[$k][$col];
        }
    }
    return $ret;
}

SO网友:Stephen Harris

插件推荐在这里是无关紧要的,但是(冒着偏见的风险),我已经开发了Event Organiser 它允许您选择任意日期/重复事件,并列出它们。虽然并非所有事件管理插件都支持任意日期,但大多数插件都具有其他功能。

但无论如何,如果你想推出自己的,我强烈建议你使用post-meta。从架构上看,这很混乱,您将在性能方面受到影响。您已经列出了这种方法的一个缺陷。此外,如果您编辑/删除日期,这可能意味着您需要重新调整以后日期的键值对。

我建议采用以下方式为事件创建一个单独的表:

date ID   |   post ID    |   timestamp
---------------------------------------
    1     |      1       |      ...
    2     |      1       |      ...   
    3     |      2       |      ...   
    4     |      3       |      ...   
    5     |      3       |      ...   
    6     |      3       |      ...   
然后需要更改SQL查询,使用post ID和wp_posts.ID 列。简而言之,这就是活动组织者所做的。

这种方法的好处是性能(为列编制索引)——特别是对于复杂的日期查询。日期不必按顺序输入(但下次编辑事件时,可能应该按顺序显示)。

结束

相关推荐

使用新的WP-Query()从循环中过滤后期格式;

嗨,我目前正在为我的博客构建一个主题。下面的代码指向最新的帖子(特色帖子)。因为这将有一个不同的风格比所有其他职位。然而我想过滤掉帖子格式:链接使用我在循环中定义的WP查询,因为它给我带来了更多的灵活性。我该怎么做呢? <?php $featured = new WP_Query(); $featured->query(\'showposts=1\'); ?> <?php while ($featured->have_post