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
}
}
我没有用嵌套中继器测试过它,但我想它可能不适用于嵌套中继器。
当我使用 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
}
}
我没有用嵌套中继器测试过它,但我想它可能不适用于嵌套中继器。