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

ACF Repeater field returns string containing the count of repeater

当我使用 get_field('repeater_name') 时,它 return 是一个包含数字的字符串,它是中继器的计数,而它应该是 return 子字段数组,这个问题有之前曾多次报告过,但其中 none 对此提供了 stable 修复,唯一的方法是编辑 post 并点击更新按钮,它将重新生成转发器字段,但就我而言,我有 19k posts 并且不可能编辑每个 post.

have_rows('repeater_name')returns如预期的那样是假的,真实的字段数据(get_post_meta($post_id, "field_{$field_key}", true)returnsNULL

如果能重新生成转发器字段键并填充所有 post 的值,我将不胜感激。

此问题之前已在 here, here and here 中报告,none 已得到真正的修复。

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

wp_postmeta table

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

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

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

我认为如果有一种方法可以同步数据库中的字段键,那将解决问题

我为此做了一个解决方案,可能不是这个问题的确切解决方案,但它对我有用,首先我以某种方式将我的字段恢复到一个版本,大约 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
     }

}

我没有用嵌套中继器测试过它,但我想它可能不适用于嵌套中继器。