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


PHP: Group items by day to display results

如果这是一个n00b问题,我很抱歉,因为我更多的是一个用户体验设计师,而不是开发人员。我在WordPress论坛上发布了这篇文章,并被引导到这里,所以它开始了。。。

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

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

自定义元日期保存为mm/dd/yy HH:mm。我这样做是因为我需要一个相关的开始日期字段,它可以让我使用WordPress的orderby。我只是在需要时按照自己的意愿格式化输出。

我似乎无法将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

部分问题可能是您使用$post-var。您调用全局$post-val,然后在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,该post由于第一个错误而被覆盖。假设您将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 );

这应该会让你更近一点。

使用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();
?>