ACF 中继器字段返回包含中继器计数的字符串

Posted

技术标签:

【中文标题】ACF 中继器字段返回包含中继器计数的字符串【英文标题】:ACF Repeater field returns string containing the count of repeater 【发布时间】:2020-06-14 22:20:41 【问题描述】:

当我使用get_field('repeater_name') 时,它返回一个字符串,其中包含一个数字,该数字是中继器的计数,而它应该返回子字段数组,这个问题之前已经多次报告过,但没有一个提供稳定的修复对此,唯一的方法是编辑帖子并点击更新按钮,它将重新生成转发器字段,但在我的情况下,我有 19k 个帖子,不可能编辑每个帖子。

have_rows('repeater_name') 也按预期返回 false 和真实字段数据(get_post_meta($post_id, "field_$field_key", true) 返回NULL

如果能提供任何帮助或任何自动脚本来重新生成转发器字段键并填充所有帖子的值,我将不胜感激。

此问题之前在 here、here 和 here 中报告过,但没有一个真正的修复。

编辑: 我发现了问题,问题在wp_postmeta表中,存储了错误的字段键:

wp_postmeta table

| meta_key                | meta_value    | 
| -------------           |:-------------:|
| _repeater_name          | field_XXXXXXX |
| _repeater_0_subfield    | field_ABCDEFG |
| _repeater_0_subfield2   | field_HIJKLMN |

wp_posts 表中的相同字段键应该匹配,但它们不匹配(可能由于数据迁移或其他原因):

| post_excerpt   | post_name     | post_type | 
| ---------------| ------------- |-----------|
| repeater_name  | field_YYYYYYY | acf-field |
| subfield       | field_BBBBBBB | acf-field |
| subfield2      | field_CCCCCCC | acf-field |

我认为如果有办法在数据库中同步字段键,那将解决问题

【问题讨论】:

【参考方案1】:

我为此做了一个解决方案,可能不是这个问题的确切解决方案,但它对我来说很有效,首先我以某种方式将我的字段恢复到大约 60% 的字段运行良好的版本,其余的我写这种向后兼容性:

function dw_build_repeater($name, $keys = [], $post = null) 
    $post = get_post($post);

    $repeater = get_field($name, $post->ID);

    if (! $repeater || is_array($repeater) || ! is_numeric($repeater)) 
        return;

    

    $arr = [];

    for ($i = 0; $i < (int) $repeater; $i++) 

        foreach ($keys as $key) 
            $arr[$i][$key] = get_post_meta($post->ID, $name . "_" . $i . "_$key");
        
    

    update_field($name, $arr, $post->ID);

    return $arr;

所以每当我想呼叫中继器时,我只需这样做:

if (have_rows('repeater_name') || dw_build_repeater('repeater_name', ['subfield1', 'subfield2', 'subfield3']) 
     while (have_rows('repeater_name')) 
          the_row();
          // And the rest
     


我没有使用嵌套中继器对其进行测试,但我想它可能不适用于嵌套中继器。

【讨论】:

以上是关于ACF 中继器字段返回包含中继器计数的字符串的主要内容,如果未能解决你的问题,请参考以下文章

Wordpress ACF 中继器子字段

WordPress ACF:为自定义帖子类型添加默认行到管理部分的中继器字段类型

ACF 中继器子字段 Shuffle(wordpress 高级自定义字段)

ACF 中继器字段:对链接使用函数

表中的 ACF 中继器字段 - 在 PHP 模板中

如果第一个 ACF 中继器字段为空,则打印内容