当我使用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 |
我认为,如果有一种方法可以同步数据库中的字段键,则可以解决此问题
答案 0 :(得分:2)
我为此提出了一个解决方案,可能不是这个问题的确切解决方案,但是它为我解决了问题,首先,我以某种方式将我的字段恢复为一个版本,该版本大约有60%的字段运行良好,其余的我写了这种向后兼容性:
No matching constructor for initialization of 'std::__1::pair<const std::__1::basic_string<char>, web::server::ControllerResponse
因此,每当我想呼叫中继器时,我都只需这样做:
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;
}
我尚未使用嵌套中继器对其进行测试,但我想它可能不适用于嵌套中继器。