按开始日期和结束日期以及介于两者之间的所有日期对元框值进行排序

时间:2013-11-11 作者:Yvonne

我一直在尝试编写一个函数,该函数允许我按照WordPress帖子的元值开始日期、结束日期以及两者之间的所有日期对其进行排序。

我已经设置了一个带有三个字段的自定义元数据库:

事件名称(IDevenement-name)evenement-datum-start), 存储为事件的YY mm dd结束日期(IDevenement-datum-end), 存储为YY-mm-dd/ul>我想要的是未来将发生的事件的列表,按年、月、日分组。

示例:

事件A发生于2013年11月24日至2013年11月26日,事件B发生于2013年11月25日,示例结果:

2013

十一月

24

事件A

25

事件A

事件B

26

事件A

不幸的是,从理论上讲,这一切听起来容易得多。

我确实设法让元盒工作,并运行查询以返回一个包含元值的帖子列表evenement-datum-end 是今天还是将来。我甚至还弄到了一份evenement-datum-startevenement-datum-end, 所以我现在得到的是:

2013年11月24日-事件A

2013年11月25日-事件A

2013年11月26日-事件A

2013年11月25日-事件B

我的代码:

//This is the function I use to get all the dates between the start date and the end date:
function getDateRange($startDate, $endDate, $format="Y-m-d"){
    //Create output variable
    $datesArray = array();
    //Calculate number of days in the range
    $total_days = round(abs(strtotime($endDate) - strtotime($startDate)) / 86400, 0) + 1;

    //Populate array of weekdays and counts
    for($day=0; $day<$total_days; $day++)
    {
        $datesArray[] = date($format, strtotime("{$startDate} + {$day} days"));
    }
    //Return results array: de inhoud van de array wordt uitgelezen 
    return $datesArray;
}


//Query
$args = array ( 
    \'cat\'               => \'1,6\',
    \'post_type\'         => \'post\', 
    \'meta_key\'          => \'evenement-datum-start\',
    \'posts_per_page\'    => -1,
    \'meta_query\'        => array(
        array(
            \'key\'       => \'evenement-datum-end\',
            \'value\'     => date(\'Y-m-d\'),
            \'compare\'   => \'>=\',
            \'type\'      => \'DATE\'
        )
    ),
 );

$agenda_query_full = new WP_Query ( $args );


if ( $agenda_query_full->have_posts() ) {
echo \'<ul>\';

    while ( $agenda_query_full->have_posts() ) {
        $agenda_query_full->the_post();

        $meta_event_name    = get_post_meta( get_the_ID(), \'evenement-name\', true );
        $meta_event_start   = get_post_meta( get_the_ID(), \'evenement-datum-start\', true );
        $meta_event_end     = get_post_meta( get_the_ID(), \'evenement-datum-end\', true );
        $dateRange      = getDateRange($meta_event_start, $meta_event_end); 

        asort($dateRange);
        $today              = date(\'Y-m-d\');

        foreach ($dateRange as $key => $val) {
            $datum      = date("d-m-Y", strtotime($val));   

            if($val>=$today) {

                if(in_category( \'acties\' ) ){
                    echo \'<li>\'.$datum.\' - <a href="\' . get_page_link() . \'">\' . $meta_event_name . \'</a></li>\';
                }
                else {
                    echo \'<li>\'.$datum.\' - \' . $meta_event_name . \'</li>\';
                };
            };
        }
    }
    echo \'</ul>\';
} else {
    echo \'No events found.\';
}

wp_reset_postdata();
据我所知,我只是PHP的初学者,在运行循环之前,我无法查询日期列表。但当我运行循环时,我无法按时间顺序对日期进行排序,因为我已经检索到了一篇帖子。陷入僵局。

我已经为此工作了好几天了,现在我绝望了。。。有什么帮助吗?

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

我认为您可以通过运行2个循环来实现这一技巧,第一个循环是准备一个按日期排序的帖子的助手数组,第二个循环是显示这个数组:

类似这样(完全未经测试):

if ( $agenda_query_full->have_posts() ) {
  $date_events = array(); // helper array
  $today = date(\'Y-m-d\');
  while ( $agenda_query_full->have_posts() ) {
    $agenda_query_full->the_post();
    global $post;
    $metas = get_post_custom();
    // save event name in the post object
    $post->ename = array_pop( $metas[\'evenement-name\'] ); 
    $meta_event_start = array_pop( $metas[\'evenement-datum-start\'] );
    $meta_event_end = array_pop( $metas[\'evenement-datum-end\'] );
    $dateRange = getDateRange( $meta_event_start, $meta_event_end ); 
    asort($dateRange);
    foreach ( $dateRange as $date ) {
      if( $date < $today ) continue; // skip past events
      if ( ! isset($date_events[$date]) ) $date_events[$date] = array();
      $date_events[$date][] = $post; // put post in helper array that is keyed by date
    }
  }
  if ( ! empty($date_events) ) {
    foreach ( $date_events as $date => $events ) {
      $datum = date( "d-m-Y", strtotime($date) );
      echo \'<h3>\' . $datum . \'</h3>\';
      echo \'<ul>\'; 
      foreach ( $events as $event ) {
        if( in_category( \'acties\', $event ) ){
        echo \'<li><a href="\' . get_page_link( $event->ID ) . \'">\' . $event->ename . \'</a></li>\';
        } else {
        echo \'<li>\' . $event->ename . \'</li>\';
        };
      }
      echo \'</ul>\';
    }
  } else {
    echo \'No events found.\';
  }
} else {
    echo \'No events found.\';
}
wp_reset_postdata();

结束

相关推荐

Tags Sorted By Characters?

如果我在一篇文章中放置了多个标签,那么在发布文章后,所有标签都会按字符序列自动排列,比如B C D。。。任何想法,如果我希望有所有的标签将不会排序或按字符序列排列。。。。所以,第一个标签将是第一个,最后一个标签将放置在最后。。。尽管第一个标记可能以Z开头,最后一个标记以A开头。。那么,我所说的保持标签序列静态的方法是什么呢?