使用ACF Repeater显示数据库中的所有自定义元字段值

时间:2019-12-15 作者:Paweł Skaba

我正在从事一个个人项目,其中包括多个自定义字段(通过ACF创建)。其中一些是中继器类型。

我想显示这些中继器子字段值的3个阵列/块。为了更好地理解,我有一个repeater字段:open\\u workshops,该字段包括子字段:日期、位置、合作伙伴关系。

我只想显示存储在DB中的那些子字段中的所有值。类似于:

开放式研讨会:

日期:2017年1月、2017年2月。。。2019年12月等

地点:纽约、华沙。。。

合作伙伴:安永、谷歌。。

我注意到了什么问题-首先,由于字段类型(中继器),很难在DB中找到这些值。因为它不是一个单独的字段,但ACF复制了它们的名称,所以我不需要寻找单独的字段:open\\u workshops\\u date,而是需要找到:open\\u workshops\\u 0\\u date、open\\u workshops\\u 1\\u date等。

我的初始代码是:

  if( have_rows(\'open_workshops\') ):
        while ( have_rows(\'open_workshops\') ) : the_row();
            $sub_value_1 = get_sub_field(\'date\');
        $sub_value_2 = get_sub_field(\'location\');
        $sub_value_3 = get_sub_field(\'partnerships\');


          echo \'$sub_value_1\';
echo \'$sub_value_2\';
echo \'$sub_value_3\';

        endwhile;
    else :
        // no rows found
    endif;
我也尝试过这篇帖子的建议:Retrieving all data from repeater fields

但它什么也没显示出来。

3 个回复
最合适的回答,由SO网友:RiddleMeThis 整理而成

我认为ACF没有一个内置的功能来做你想做的事情。您可以使用get_field 从任何帖子中检索值,但如果希望从当前帖子以外的其他帖子中获取值,则需要帖子ID。

因此,我们可以使用WP_Query 并传递自定义字段的元键。

这里有一个例子。

$args = array(
    \'post_type\' => \'page\', // Add your post type here
    \'meta_key\' => \'test_repeater\' // Add your repeater name here
);

$the_query = new WP_Query($args);

if ($the_query->have_posts()):
    while ($the_query->have_posts()) : $the_query->the_post();
            if(have_rows(\'test_repeater\')): // Add your repeater here
                while (have_rows(\'test_repeater\')) : the_row(); // Add your repeater here
                    // display your sub fields
                    the_sub_field(\'sub_field_one\');
                    the_sub_field(\'sub_field_two\');
                endwhile;
            else :
                // no rows found
            endif;
    endwhile;
endif;
我将上述代码添加到一个页面模板中,它将吐出test_repeater 对于任何page 已填写这些自定义字段的。

已测试并正常工作。

SO网友:Bhupen

你有没有试过通过邮政id?请参见以下内容:

if( have_rows(\'parent_field\', $post_id) ):
while ( have_rows(\'parent_field\', $post_id) ) : the_row();
    $sub_value = get_sub_field(\'sub_field\');
    // Do something...
endwhile;
else :
    // no rows found
endif;

SO网友:Guru Bhajan Singh

ACF的Repeater字段遵循一个简单的方法,这组代码将帮助您。

if( get_field(\'open_workshops\', get_the_ID()) ):

$counter = 0;
while( the_repeater_field(\'open_workshops\', get_the_ID())):

//this sets up the counter starting at 0
echo get_field(\'open_workshops_\'.$counter.\'_date\', get_the_ID());
echo get_field(\'open_workshops_\'.$counter.\'_location\', get_the_ID());
echo get_field(\'open_workshops_\'.$counter.\'_partnerships\', get_the_ID());

$counter++; // add one per row
endwhile;
endif;