Group ACF Wordpress 内的中继器

问题描述 投票:0回答:5

我正在使用 Wordpress 的高级自定义字段并尝试在组内循环转发器。我得到的只是“注意:数组到字符串的转换......”

出了什么问题以及如何解决?

<?php if( have_rows('start_horlurar') ): while ( have_rows('start_horlurar') ) : the_row();  ?>

<?php $horlur = get_sub_field('horlur'); ?>

<?php if( have_rows( $horlur['arsmodeller_lankar']) ): while ( have_rows($horlur['arsmodeller_lankar']) ) : the_row();  ?>

<?php echo get_sub_field('lank'); ?>

<?php endwhile; endif; ?>

<?php endwhile; endif; ?>
php wordpress while-loop nested-loops advanced-custom-fields
5个回答
24
投票

我相信这个答案是正确的,但对于那些寻求通用实现的人来说似乎还不够清楚。

<?php

if( have_rows('your_group') ): while ( have_rows('your_group') ) : the_row(); 

    if( have_rows('your_repeater') ): while ( have_rows('your_repeater') ) : the_row();       

        echo get_sub_field('repeater_sub_field');

    endwhile; endif;

endwhile; endif;

?>

通常,对于组,您可以通过使用以下方式到达特定子字段:

<?php 

$group_var = get_field['your_group']; 

$group_sub_field_var = $group_var['group_sub_field']

?>

但是,似乎对于嵌套在组内的中继器,您无法使用此策略,并且被迫首先使用

have_rows()
循环遍历组,甚至到达中继器。

如果您查看 ACF 上的 group 文档,它会提到如何像中继器一样循环访问组。此外

have_rows()
文档 还提供了有关使用
have_rows()
嵌套循环的更多详细信息。


15
投票

我发现双环很乱而且不需要。 我意识到这已经很旧了,但我只是遇到了这个问题并且不想有两个循环。

对于我的组('group')和我的中继器('repeater'),带有子字段('subfield'),这就是我所做的。

     $group = get_field('group');
     $repeaters = $group['repeaters'];
     foreach($repeaters as $repeater) {
         echo $repeater["subfield"];
       }

超级简单,而且干净多了。如果需要,您可以添加“if”语句,而不是控制我的必填字段。

我发现这种方法对于快速和肮脏来说很重要。我几乎对所有事情都使用组,以便能够为后端的自定义字段创建更好的用户体验。我的大多数自定义字段都是分组并获取参数,我希望它的代码尽可能少且尽可能干净。

如果你们发现此方法有任何问题,尤其是在性能方面,请告诉我。


14
投票

在嵌套的 ACF 中继器中,您无需添加父中继器的引用 - 只需添加中继器名称即可。尝试这样。

<?php
if( have_rows('start_horlurar') ): while ( have_rows('start_horlurar') ) : the_row(); 
    echo get_sub_field('horlur');
    if( have_rows('arsmodeller_lankar') ): while ( have_rows('arsmodeller_lankar') ) : the_row(); 
        echo get_sub_field('lank');
    endwhile; endif;
endwhile; endif;
?>

更新代码: 您也需要像 ACF Repeater 一样循环 ACF Group 字段。尝试这样。

<?php
if( have_rows('start_horlurar') ): while ( have_rows('start_horlurar') ) : the_row(); 
    if( have_rows('horlur') ): while ( have_rows('horlur') ) : the_row();       
        if( have_rows('arsmodeller_lankar') ): while ( have_rows('arsmodeller_lankar') ) : the_row(); 
            echo get_sub_field('lank');
        endwhile; endif;
    endwhile; endif;
endwhile; endif;
?>

0
投票

我这样格式化,我觉得这样干净多了:

<?php if(have_rows('features_repeater')): while(have_rows('features_repeater')): the_row(); if(have_rows('features_group')): while(have_rows('features_group')): the_row(); ?>
    
    <h1><?php echo get_sub_field('title'); ?></h1>

<?php endwhile; endif; endwhile; endif; ?>

0
投票

此代码可以与一组中的一个或两个中继器配合使用

         <?php if (have_rows('your_group_name')): ?>
            <?php while (have_rows('your_group_name')): the_row();
                if (have_rows('your_repeater_name')): ?>
                <ul>
                    <?php while (have_rows('your_repeater_name')): the_row();
                        $your_repeater_item = get_sub_field('your_repeater_item');
                    ?>
                    <li><?php echo $your_repeater_item; ?></li>
                    <?php endwhile; ?>
                </ul>
                <?php endif; ?>
            <?php endwhile; ?>
          <?php endif; ?>

如果您在组字段中使用两个中继器,只需复制此代码两次并替换变量名称即可。我希望这段代码可以帮助别人。

© www.soinside.com 2019 - 2024. All rights reserved.