Flexible Content + Tab field: collapsing a newly-added (unsaved) layout throws in _acf-field-tab.js and aborts field init (ACF PRO 6.8.3 / WP 7.0)
还没有人认领这个 Issue。
评估
- 难度
- 4/5
- 预计耗时
- 3-5 天
- 新手友好度
- 58/100
- Issue 类型
- 缺陷
- 描述清晰度
- 描述清楚
- 活跃度
- 冷清
- 技术栈
- javascript
- 领域
- frontend
调研方向
从 assets/src/js/_acf-field-tab.js 开始,重点查看 TabField.initialize() 以及 tab-fields manager 的 getTabs() 和 render() 路径,然后使用提供的最小 field-group JSON 重现问题。跟踪 Flexible Content 的折叠和重新渲染生命周期,以确定 tab wrapper 为什么会丢失其 group instance。完成的标准是:新添加的 layout 可以在没有任何 TypeError 的情况下折叠和展开,并且其中的 WYSIWYG 字段仍能初始化并正常工作。
由索引模型根据 Issue 内容生成。
描述
Describe the bug
On WordPress 7.0 + ACF PRO 6.8.3, collapsing a Flexible Content layout that was added in the current (unsaved) editing session throws two uncaught TypeErrors from the core tab-field JS (assets/src/js/_acf-field-tab.js). The first one aborts acf.getFields()'s init loop, so every field rendered after the tab group never initializes, in our case the WYSIWYG sub-fields inside the Flexible Content layouts. The layout can no longer be expanded and its editors are gone until the page is reloaded.
This only affects layouts added client-side in the current session. Collapsing layouts that were rendered server-side (after Save + reload) works perfectly. A field group needs at least one top-level Tab field plus a Flexible Content field to reproduce.
To Reproduce
- Create a field group with a
Tabfield ("Tab A"), a secondTabfield ("Tab B"), and aFlexible Contentfield with one layout containing a singlewysiwygsub-field (minimal JSON below). - Add a new post for the assigned post type.
- In the Flexible Content field, click Add Row and pick the layout.
- Click the new layout's handle to collapse it.
- Open the browser console.
Expected behavior
The layout collapses/expands and the fields inside it (including the WYSIWYG) keep working, exactly as they do for saved / server-rendered layouts.
Screenshots or Video
Both errors fire on the single collapse click:
Uncaught TypeError: Cannot read properties of undefined (reading 'addTab')
at TabField.initialize (acf-input.js)
at acf.newField -> acf.getField -> acf.getFields -> doAction()
Uncaught TypeError: Cannot read properties of undefined (reading 'get')
at render -> getTabs().map() (the tab-fields manager)
at doAction('append' | 'show' | 'refresh')
Code
Minimal repro field group:
{
"key": "group_repro_tab_fc",
"title": "Repro - tabs + flexible content",
"fields": [
{ "key": "field_repro_tab_a", "label": "Tab A", "name": "", "type": "tab", "placement": "top" },
{ "key": "field_repro_text_a", "label": "Text A", "name": "text_a", "type": "text" },
{ "key": "field_repro_tab_b", "label": "Tab B", "name": "", "type": "tab", "placement": "top" },
{ "key": "field_repro_fc", "label": "Blocks", "name": "blocks", "type": "flexible_content", "button_label": "Add Row",
"layouts": {
"layout_repro_text": {
"key": "layout_repro_text", "name": "text", "label": "Text", "display": "block",
"sub_fields": [
{ "key": "field_repro_body", "label": "Body", "name": "body", "type": "wysiwyg", "tabs": "all", "toolbar": "basic", "media_upload": 0 }
]
}
}
}
],
"location": [[{ "param": "post_type", "operator": "==", "value": "post" }]]
}
Version Information:
- WordPress 7.0
- PHP 8.4
- ACF PRO 6.8.3
- Chrome 148 (macOS). Reproduces with a stock theme; our theme JS does not touch ACF or TinyMCE.
Additional context - root cause (pinpointed to assets/src/js/_acf-field-tab.js)
After the collapse, a .acf-tab-wrap element stays in the DOM but loses its group instance: $wrap.data('acf') is now undefined. Two paths then dereference it.
TabField.initialize()runs again (collapse ->doAction->acf.getFields()->acf.newField->initialize). With a preceding wrap present it takes the "reuse" branch:
// L84-L91
if ( ! $tabs.length || settings.endpoint ) {
this.tabs = new Tabs( settings );
} else {
this.tabs = $tabs.data( 'acf' ); // L87 -> undefined (orphaned wrap)
}
this.tab = this.tabs.addTab( $tab, this ); // L91 -> throws: undefined.addTab
The throw is uncaught, so the enclosing getFields().map() loop aborts and no field after the tab group initializes. This is what kills the WYSIWYG editors.
- The tab-fields manager re-renders on
append/show/refreshand maps over every wrap in the document:
// L525-L534
getTabs: function () {
return acf.getInstances( this.findTabs() ); // L526 -> array containing undefined
},
render: function ( $el ) {
this.getTabs().map( function ( tabs ) {
if ( ! tabs.get( 'initialized' ) ) { // L531 -> throws: undefined.get
tabs.initializeTabs();
}
} );
},
Important: I tried defensively guarding both sites (try/catch around initialize, and filtering falsy values out of getInstances). That silences both console errors, but it does not restore the editors or the collapse/expand behaviour, the form state is already corrupted by then. So the underlying issue is that the PRO Flexible Content collapse / re-render leaves a .acf-tab-wrap without its data('acf') group (it should keep it bound, or re-bind on re-render). L87/L91 and L526/L531 are only where it surfaces; null-guarding them would mask the symptom, not fix it.
Possibly related: #986 (Flexible Content expand/collapse state).
Notes:
- The console line that often co-occurs,
Failed to load plugin url: .../wp-includes/js/tinymce/langs/<locale>.js, is unrelated and cosmetic: ACF already printstinymce.ScriptLoader.markDone(...)for that URL. The editor breakage is the tab crash above, not the TinyMCE language file. - Also reproduces with the post type's
editorsupport removed and a non-enadmin locale, but neither is required for the crash.
- 主要语言
- PHP
- 星标
- 947
- 派生
- 198
- PR 合并指标
- 30 天内没有已合并 PR
环境准备
这个项目没有提供开发容器、Dockerfile 或贡献指南,环境需要你自己搭建:先看它的 README,通用步骤见我们的新手贡献指南。
从这里开始
- 先读完整个 Issue,再读项目的贡献指南。
- 在 Issue 下留言说明你要接手 —— 这能避免两个人做同样的事。
- Fork 仓库,在一个分支上完成修改。
- 提交 Pull Request,并在描述里引用这个 Issue 编号。
AdvancedCustomFields/acf 的其他 Issue
-
PHP 8.5: "Using null as an array offset" deprecation in ACF_Data::is() when rendering a block with empty data (local-meta.php is_request)可能已有人在做 @faisalahammad 于 17 天前认领。 未关闭
难度 2/5 1-3 小时 新手友好度 68/100
AdvancedCustomFields/acf#1044 ·
-
is_preview was called incorrectly notice on every early get_field() since 6.8.10 (acf_revisions::acf_validate_post_id)可能已有人在做 @faisalahammad 于 17 天前认领。 未关闭
难度 2/5 1-3 小时 新手友好度 78/100
AdvancedCustomFields/acf#1041 · 1 条评论 ·
-
True / False ACF control bug on RTL layouts可能已有人在做 @elicohenator 于 39 天前认领。 未关闭
难度 2/5 1-3 小时 新手友好度 86/100
AdvancedCustomFields/acf#1038 ·
-
难度 2/5 1-3 小时 新手友好度 78/100
AdvancedCustomFields/acf#1034 · 3 条评论 ·
-
Bug: class-acf-field-icon_picker.php calls wp_get_attachment_image_url() with string Dashicon slug, causing fatal TypeError on PHP 8+可能已有人在做 @antwonw 于 51 天前认领。 未关闭
难度 2/5 1-3 小时 新手友好度 86/100
AdvancedCustomFields/acf#1032 · 1 条评论 ·
查看 AdvancedCustomFields/acf 的全部 Issue
相似的 Issue
-
难度 2/5 1-3 小时 新手友好度 78/100
维护者通常 1 天内回复
-
难度 2/5 1-3 小时 新手友好度 76/100
维护者通常 1 天内回复
-
难度 1/5 1 小时以内 新手友好度 84/100
wp-graphql/wp-graphql-woocommerce#1026 ·
-
bug
难度 2/5 1-3 小时 新手友好度 72/100
taskforcesh/bullmq#5038 ·
维护者通常 1 天内回复
-
ServiceMapMissingAnalyser reads @method in docblock prose as a tag and reports a phantom accessor未关闭agent-ready area:static-analysis bug p3
难度 2/5 1-3 小时 新手友好度 82/100
gacela-project/gacela#1050 ·
维护者通常 1 天内回复