【问题标题】:Advanced Custom Fields display last three sub-repeater rows高级自定义字段显示最后三个子重复行
【发布时间】:2017-03-30 01:03:53
【问题描述】:

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

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

三月

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

四月

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

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

在网站首页,我需要拉取3个最新(列表底部的事件为最新事件)事件并显示在首页。

我在主页上拉取和显示事件没有问题。我遇到的问题是当最后三个事件(子中继器)在几个月(父中继器)之间交叉时显示事件。

使用 php 循环在 if、while 语句中简单地限制事件输出只会限制当月输出的事件数。我目前在主页上使用的代码如下。

<?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 日活动

【问题讨论】:

  • 有什么理由不只使用带有日期输入字段的单个转发器?然后,您可以从中提取月份,以便与网站其他地方的代码很好地配合使用,这将使主页上最新条目的排序变得轻而易举。
  • @Leland - 感谢您的提问,因为这是我没有考虑过的。这是显示每个月内事件的页面的链接。 ardentsolutionsllc.com/events 如果我只使用一个中继器,我不知道如何将事件与每个月联系起来。主页显示了我试图缩短的事件列表(右下角),仅显示 3 个最新事件,这些事件通常出现在事件页面的每个月的底部。
  • 好的,我正在重新阅读您的帖子——您想要在主页上显示最近添加的 3 个活动吗?也就是说,您希望在主页上显示最近在 WordPress 管理员中创建的 3 个事件?或者您更愿意拥有到今天最快发生的 3 个事件?
  • @Leland 我想要显示在活动页面底部的三个最新活动(来自上面的链接)。通常,我会使用 Elliott 建议的方法support.advancedcustomfields.com/forums/topic/… 但它不起作用,因为某些事件可能需要在重复月份中拉入(有时例如:5 月发布的 2 个事件需要从 4 月到在主页上制作 3)。
  • 嘿,很抱歉所有问题 - 我有一些可以帮助的代码,但我只是想更好地了解您在寻找什么。您想要“三个最新的活动......在活动页面的底部”。换句话说,你想要未来最远的 3 个事件?对吗?

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


【解决方案1】:

您可能应该使用for 而不是while。并考虑以下算法:

1) 获取last row from event_month

2) 统计当月的事件数

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

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

4) 否则计算剩余事件的数量 (3-&lt;&lt;events in last month&gt;&gt;)

  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... 
    }
}

【讨论】:

  • 感谢您的回答。我尝试在站点中实现您的代码,但它破坏了页面,指出 $requiredEvents => $event 会产生语法错误'意外'=>' (T_DOUBLE_ARROW)'。我不太了解 PHP 来解决这个问题。我可以深入研究它,但认为您可以提供更多建议。
  • @GordonSmith 这是一个错字=&gt; 应该是as 参考编辑!而且你需要提高你的php技能!
  • 感谢您的编辑。我同意,并且每天都在继续改进。我会试一试并报告。
【解决方案2】:

这可能不是每个人都在寻找的答案,但这是我作为一种变通方法所做的,对我来说效果很好。

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

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

【讨论】:

    猜你喜欢
    • 2018-08-26
    • 1970-01-01
    • 2013-11-08
    • 2018-04-15
    • 2019-09-26
    • 1970-01-01
    • 2020-04-26
    • 2019-01-18
    • 2019-08-20
    相关资源
    最近更新 更多