Php 显示自定义帖子类型中的帖子,并按开始时间自定义字段对其排序,按天分组

Php 显示自定义帖子类型中的帖子,并按开始时间自定义字段对其排序,按天分组,php,wordpress,sorting,advanced-custom-fields,Php,Wordpress,Sorting,Advanced Custom Fields,我有html模板,我必须从中创建自定义Wordpress主题-我使用的大多数是高级自定义字段,我需要以我在标题中解释的方式显示帖子(显示自定义帖子类型的帖子,并按开始时间自定义字段对其排序,按天分组)。这张图片展示了帖子的实际外观。 这里是我定义的字段 所以,如果我在周一有3个研讨会,它们将在周一下展示,并将按照最早的开始时间排序。对于研讨会演讲者,我正在使用关系字段,该字段允许我将一个或多个演讲者(也是自定义帖子类型)添加到研讨会自定义帖子类型(我还没有弄清楚,但我会) 我对排序有一些概念,

我有html模板,我必须从中创建自定义Wordpress主题-我使用的大多数是高级自定义字段,我需要以我在标题中解释的方式显示帖子(显示自定义帖子类型的帖子,并按开始时间自定义字段对其排序,按天分组)。这张图片展示了帖子的实际外观。

这里是我定义的字段

所以,如果我在周一有3个研讨会,它们将在周一下展示,并将按照最早的开始时间排序。对于研讨会演讲者,我正在使用关系字段,该字段允许我将一个或多个演讲者(也是自定义帖子类型)添加到研讨会自定义帖子类型(我还没有弄清楚,但我会)

我对排序有一些概念,比如
$arrayname[date][startingtime]=array(需要显示的所有数据)
,但我不知道如何在实际的查询中实现它,从而拉动研讨会(可能是foreach循环?)

所以基本上这就是我现在拥有的代码,以及我在陷入困境之前所取得的进展

<?php 

$args = array('post_type' => 'workshop');

$workshoptime = the_field('time');
$yeardate = the_field('workshop_date');

$sorting = array(
  array('time' => '$workshoptime'), 
  array('yearmonthdate' => '$yeardate'),
);

$loop = new WP_Query( $args );

//Display the contents
while ( $loop->have_posts() ) : $loop->the_post();

?>

            <!--Tabs Box-->
            <div class="tabs-box">

                <!--Tab / Current / Monday-->
                <div class="tab current" id="monday">

                    <div class="hour-box active-box">
                        <div class="hour">10:00 AM</div>
                        <div class="img-circle circle"><span></span></div>
                        <div class="toggle-btn active"><h3><?php the_title();?></h3></div>
                        <div class="content-box collapsed">
                            <div class="content"><p><?php the_content();?></p></div>
                            <br>
                            <div class="row professional clearfix">
                                <div class="col-md-6 col-sm-6 col-xs-12 info">
                                    <figure class="img-circle image"><img class="img-circle" src="images/resource/testi-thumb-1.jpg" alt=""></figure>
                                    <h5 class="prof-title"></h5>
                                    <h6 class="prof-occup">Speaker</h6>
                                </div>
                                <div class="col-md-6 col-sm-6 col-xs-12 text-right">

                                    <a href="#" class="theme-btn btn-style-one hvr-bounce-to-right dull">10:00 - 12:00</a>
                                    <a href="single-event.html" class="theme-btn btn-style-one hvr-bounce-to-right"><span class="fa fa-play"></span>DETAILS ABOUT THE EVENT</a>
                                </div>
                            </div>
                        </div>
                    </div>
                </div>
            </div>

上午10:00


演讲者
您可以使用
WP\u查询对项目进行排序

$args = array(
    'posts_per_page'   => -1,       
    'orderby'          => 'meta_value_datetime',
    'order'            => 'ASC',
    'meta_type'        => 'DATETIME',
    'meta_key'         => 'workshop_date',      
    'post_type'        => 'workshop',       
    'post_status'      => 'publish'     
);
现在您在循环中有了正确的顺序

分组方式可能如下所示:

// in loop
$timestamp = strtotime( $workshop_date );
$date = date( 'Y-m-d', $timestamp );

if ( $date == $current_date ) {
    // it is the same day
} else {
    // it is a new day
    $current_date = $date;
}

您必须在PHP脚本中进行分组(在文章中循环,您可以检测日期何时更改,并输出相应的节头/页脚)。为了做到这一点,你需要让你的文章先按日期再按时间排序,这可以通过常规的WP_查询来实现,但是你需要使用meta_查询功能,因为它的文档不是非常清晰

下面是一个简单的例子:

<?php

$args = [
    'post_type' => 'workshop',
    'meta_query' => [
        'workshop_date' => [
            'key' => 'workshop_date', 
            'compare' => 'EXISTS'
        ],
        'workshop_time' => [
            'key' => 'workshop_time', 
            'compare' => 'EXISTS'
        ]
    ], 
    'orderby' => [
        'workshop_date' => 'ASC',
        'workshop_time' => 'ASC'
    ]
];
$loop = new WP_Query($args);


function print_workshop() {
?>
    <section class="workshop">
        <?php the_title() ?> at <?php the_field('workshop_time') ?>
    </section>
<?php
}

function print_day_header() {
?>
<article>
    <header><?php the_field('workshop_date') ?></header>
<?php
}

function print_day_footer() {
?>
</article>
<?php
}

$curday = false;
if ($loop->have_posts()) : while ($loop->have_posts()) : $loop->the_post();

if($curday !== get_field('workshop_date')) {
    // start a new day
    if($curday) {
        print_day_footer();
    }
    print_day_header();
    $curday = get_field('workshop_date');
}
// content
print_workshop();

endwhile; 

// close the last one
print_day_footer();

else : ?>

<article id="post-not-found" class="hentry cf">
    Text for no workshop found
</article>

<?php endif; ?>

在
找不到研讨会的文本
这将生成以下HTML:

<article>
    <header>06/10/2016</header>
    <section class="workshop">
        Workshop on the 6th at 11:00    </section>
</article>
<article>
    <header>13/10/2016</header>
    <section class="workshop">
        Workshop before the others on the 13th at 08:00    </section>
    <section class="workshop">
        Workshop 1 at 10:00    </section>
    <section class="workshop">
        Workshop 2, same day at 12:00    </section>
</article>
<article>
    <header>14/10/2016</header>
    <section class="workshop">
        Workshop 3, next day at 10:00    </section>
</article>
<article>
    <header>01/11/2016</header>
    <section class="workshop">
        A workshop in November at 09:00    </section>
</article>

06/10/2016
六号工作坊11:00
13/10/2016
13日08:00在其他车间之前
10:00第1车间
车间2,当天12:00
14/10/2016
第三车间,第二天10:00
01/11/2016
11月09:00的研讨会
最后一件事-如果您的时间以文本形式存储在数据库中,请以规范化的方式存储(即“13:00”,而不是“1 pm”),否则它将无法正确排序。你可以用ACF来做。ACF已经为date字段处理了这个问题,所以您不必担心这个问题,只需担心时间

希望这有帮助

也许(但我不知道)最好使用datetime。