高级自定义字段显示最后三个子转发器行

时间:2017-03-30 01:03:54

标签: php wordpress nested-loops advanced-custom-fields

我正在使用高级自定义字段(ACF)从事件页面提取转发器信息,并在主页上显示事件的缩短列表。

我已经设置了一个转发器,允许用户输入事件发生的月份(允许它们放入多个月的事件),然后是子转发器,允许它们为给定的事件添加多个事件月。示例如下:

三月

  • 3月9日活动
  • 3月12日活动
  • 3月28日活动

四月

  • 4月1日活动
  • 4月28日活动

这是事件页面上的当前输出,它按预期工作。

在网站的主页上,我需要拉出最新的3个(列表底部的事件是最新的事件)事件并将其显示在主页上。

我在主页上拉动和显示事件时没有问题。我遇到的问题是显示最后三个事件(子转发器)在月份之间交叉的事件(父转发器)。

在if,while语句中使用php循环简单地限制事件输出仅限制该月输出的事件数。我目前在主页上使用的代码位于下方。

<?php if( have_rows('event_month', 1263)): ?>
<ul>
    <?php while ( have_rows('event_month', 1263) ) : the_row(); ?>
        <?php if( have_rows('event', 1263)):;   ?>
            <?php while ( have_rows('event', 1263) ) : the_row(); ?>
                <li>
                    <h3>
                        <a href="<?php echo esc_url( home_url( '/' ) ); ?>events/"><?php $summary = get_sub_field('event_title');
                            echo substr($summary, 0, 34),'...'; ?></a>
                            <span><?php the_sub_field('event_day_of_week');?>, <?php the_sub_field('event_sub_month');?> <?php the_sub_field('event_day');?></span>
                    </h3>
                </li>
            <?php endwhile; ?>
        <?php else: ?>
            <p>Show dates to be announced soon.</p><?php the_sub_field('event_title'); ?>
        <?php endif; ?>
    <?php endwhile; ?>
</ul>

如果我们捕获三个最新事件,主页上的所需输出会是什么样的:

  • 3月28日活动
  • 4月1日活动
  • 4月28日活动

2 个答案:

答案 0 :(得分:1)

您可能应该使用for代替while。并考虑以下算法:

  

1)获取last row from event_month

     

2)计算当月的事件数量

     

3)如果事件数量大于或等于3。

     

3.1)获取最后3个事件并显示它们

     

4)否则计算剩余事件的数量(3-<<events in last month>>

     

4.1)现在获得倒数第二行并重复步骤2,3,4

因此,使用上述逻辑,您的代码应该类似于:

<?php 

function getEvents($rows, $noOfEvents){
    $resultArray = array();
    if($rows && count($rows > 0)) {
        $events = $rows[count($rows)-1]['event'];
        $events = is_array($events) ? $events : array();
        $eventCount = count($events);
        if($eventCount < $noOfEvents){
            $noOfOtherEvents = $noOfEvents-$eventCount;
            array_pop($rows);
            $iterate = getEvents($rows,$noOfOtherEvents);
            $resultArray = array_merge($events,$iterate);     
        }
        else{
            $resultArray =  array_slice($rows, 0-$eventCount, $eventCount);
        }
        return $resultArray;
}

$rows = get_field('event_month', 1263);
if($rows) {
    $requiredEvents = getEvents($rows,3);        //3 or how many ever last you want
    foreach($requiredEvents as $event){
        var_dump($event); //this should have all you need like $event['event_title'],$event['event_day'],ect... 
    }
}

答案 1 :(得分:0)

这可能不是每个人都在寻找这个问题的答案,但这就是我作为解决方案所做的工作,对我来说效果很好。

我最终解决了php之外的问题,使用css选择最后三个列表项。这是我用过的,工作得很好。

.connect-list-wrapper ul li
{
    display: none;
}
.connect-list-wrapper ul li:nth-last-child(-n+3) 
{
    display: block;
}