PHP:按天分组项目以显示结果

时间:2012-02-19 19:19:08

标签: php grouping

很抱歉,如果这是一个n00b问题,因为我更多的是UX设计师,而不是开发人员。我在WordPress论坛上发布了这个,并且是在这里发布的,所以这里就是......

我正在尝试在Wordpress中查询自定义帖子类型,并返回按自定义元日期分组的结果。我有循环和代码工作来显示我想要的所有帖子,但是在尝试按自定义元日期对它们进行分组时遇到问题。

我希望查询能够找到meta_value中的所有日期,将它们显示为h3,然后为帖子创建一个ul,每个日期都为li。

自定义元日期保存为mm / dd / yy HH:MM。我是这样做的,因为无论如何我需要一个相关的开始日期字段,它让我使用WordPress的orderby。我只是根据需要格式化输出。

我似乎无法绕头1)把h3和ul放在哪里; 2)按日期对项目进行分组。这是我到目前为止的代码:

<ul>
<?php
global $post;
$all_args = array(
    'post_type' => 'agenda',
    'category' => the_title,
    'post_status' => 'publish',
    'meta_key' => 'cpt_agenda-event-date',
    'posts_per_page' => 5,
    'orderby' => 'meta_value',
    'order' => 'ASC'
);

$all_agenda_posts = get_posts( $all_args );                         
foreach( $all_agenda_posts as $post ) : setup_postdata($post);
$metas = get_post_meta( get_the_ID( ), 'cpt_agenda-event-date', false );

// If you want to show values
foreach ( $metas as $meta ) {
    $meta;
    $formatted = date("l, F j", strtotime($meta));
    echo '<h3>' . $formatted . '</h3>';
}
?>

    <li><a href="<?php the_permalink(); ?>"><?php the_title(); ?></a></li>
<?php endforeach; ?>
</ul>

我还在https://wordpress.stackexchange.com/questions/42846/group-posts-by-custom-meta-field-date张贴了显示当前输出和所需输出的图像。一旦正常工作,请忽略时间字段和样式,因为CSS需要应用。

感谢您的帮助!

更新:我得到了这个工作,代码在下面,以防它帮助其他人。我需要使用tax_query ......

2 个答案:

答案 0 :(得分:0)

您的部分问题可能是您对$ post var的使用。您正在调用全局$ post var,然后在foreach中使用相同的var名称:

foreach( $all_agenda_posts as $post ) : setup_postdata($post);

这些是冲突的,请尝试更改为

foreach( $all_agenda_posts as $aa_post ) : setup_postdata($aa_post);

另一个可能的问题是你的arg数组。 你有:

'category' => the_title,

我认为这应该是

'category' => the_title(),

最后,get_the_ID()返回由于第一个错误而覆盖的当前/全局$ post的id。假设您将foreach中的$ post重命名为$ aa_post,请更改

$metas = get_post_meta( get_the_ID( ), 'cpt_agenda-event-date', false );

$metas = get_post_meta( $aa_post->ID, 'cpt_agenda-event-date', false );

这可以让你更近一点。

答案 1 :(得分:0)

使用tax_query帮助了我。我只是复制/粘贴了工作示例中的代码,因此添加了一些内容。

<?php
global $post;

$term = get_term_by('name', $event_name, 'agenda_category');


$all_args = array(
    'post_type' => 'agenda',
    'post_status' => 'publish',
    'meta_key' => 'cpt_agenda-event-date',
    'posts_per_page' => -1,
    'orderby' => 'meta_value',
    'order' => 'ASC',
    'tax_query' => array(
        array(
            'taxonomy' => 'agenda_category',
            'field' => 'id',
            'terms' => $term->term_id
        )
    )
);

$all_agenda_posts = new WP_Query($all_args);
$prev_start_date    =   "";

while ( $all_agenda_posts->have_posts() ) : $all_agenda_posts->the_post();
    $agenda_date = get_post_meta( get_the_ID( ), 'cpt_agenda-event-date', true);
    $agenda_end_time = get_post_meta( get_the_ID( ), 'cpt_agenda-end-time', true);

    if($prev_start_date!=date("l, F dS", strtotime($agenda_date))) {
        echo    "<h3>".date("l, F dS", strtotime($agenda_date))."</h3>";
        $prev_start_date    =   date("l, F dS", strtotime($agenda_date));   
    }
 ?>
<div class="schedule">
    <div class="stime"><?php echo date("h:i a", strtotime($agenda_date)); ?>
<?php if ($agenda_end_time){
    echo ' to ';
    echo date("h:i a", strtotime($agenda_end_time));
} else {
    echo '';
}
?>
    </div>
    <div class="stitle">
        <a href="<?php the_permalink(); ?>"><?php the_title(); ?></a>
    </div>
</div>
<?php endwhile;

if ( $agenda_disclaimer ) { ?>
    <p class="change">~ <?php echo $agenda_disclaimer; ?> ~</p>
<?php }
wp_reset_postdata();
?>