【问题标题】:ACF Repeater field returns string containing the count of repeaterACF 中继器字段返回包含中继器计数的字符串
【发布时间】: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

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

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

编辑: 我发现了问题,问题在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 |

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

【问题讨论】:

    标签: php wordpress advanced-custom-fields repeater acfpro


    【解决方案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
         }
    
    }
    

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

    【讨论】:

      猜你喜欢
      • 2015-02-17
      • 2019-03-30
      • 2017-01-01
      • 2014-09-22
      • 2018-07-17
      • 2018-04-11
      • 1970-01-01
      • 2015-03-30
      • 2017-01-24
      相关资源
      最近更新 更多