我正在使用高级自定义字段(ACF)从事件页面提取转发器信息,并在主页上显示事件的缩短列表。
我已经设置了一个转发器,允许用户输入事件发生的月份(允许它们放入多个月的事件),然后是子转发器,允许它们为给定的事件添加多个事件月。示例如下:
三月
四月
这是事件页面上的当前输出,它按预期工作。
在网站的主页上,我需要拉出最新的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>
如果我们捕获三个最新事件,主页上的所需输出会是什么样的:
答案 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;
}