ACF 自定义字段
把 WordPress 从写文章的工具变成内容模型
企业站真正的难点不是排版,是「产品参数怎么录、案例怎么按行业归类、参数表怎么统一输出」。ACF 解决的就是这件事:在后台给内容加上结构化字段,在前台用函数取出来渲染。它不改变页面长什么样,只改变数据怎么存。这页讲清字段组、字段类型、模板函数、性能代价与卸载残留。
字段组与位置规则
先想清楚数据长什么样
ACF 的核心单位是「字段组」——一组字段的集合,再加上一条「位置规则」,决定它在哪些编辑界面出现。
字段组
容器,决定字段的排列、分组、说明文字与必填规则。一个产品详情页可以有「基础参数」「技术规格」「资料下载」三个字段组,各自维护。
位置规则
可以按文章类型、页面模板、分类法、用户角色、甚至某个具体页面来匹配。规则写宽了会到处冒字段,写窄了新页面又漏掉。
存哪
字段值存进文章元数据表,字段组配置存进文章表。所以「配置」和「数据」是两套东西,删配置不等于删数据。
实操上有一条经验:字段组按「业务模块」拆,不按页面拆。十个产品页如果共用同一套字段组,改一次全部生效;如果每个页面单独建组,改参数名就要改十次。做主题定制时把字段组定义导出成 JSON 放进主题目录,换环境时自动同步,能省掉大量手工重建。
字段类型怎么选
选错类型的代价很高
字段类型不只是界面差异,它决定了数据怎么存、能不能查询、以后能不能换。
常用类型
- 文本、文本域、数值:型号、功率、材质这类短参数
- 图像、文件、画廊:产品主图、图纸下载、案例图集
- 所见即所得:长描述,注意它存的是带标签的 HTML
- 日期、颜色、真/假:认证有效期、色卡、是否推荐
- 关系、文章对象、分类法:关联案例、选所属行业
结构性类型(付费版)
- 重复器:一组字段按行重复,做参数表最合适
- 灵活内容:按布局切换,做落地页模块化内容
- 群组:把若干字段打包,减少顶层字段数量
- 克隆:复用已有字段组,但会重复存一份数据
两个常见误用:把参数表塞进一个文本域,后面想按功率筛选就做不了;把图片存成网址文本,缩略图与替代文本全部丢失。参数类内容一律用重复器拆成「参数名 + 参数值」两列,既能统一渲染,也能做筛选。产品属性与变体的对应关系可以看可变商品与属性。
模板里怎么取
六个函数覆盖九成场景
ACF 只负责存,输出要靠主题模板写。下面这些函数要写进模板文件,调用时注意转义。
取单值与整组
- get_field(‘model_no’) 返回字段值,需自行输出
- the_field(‘model_no’) 直接打印,不转义
- get_fields() 一次取回当前文章全部字段,适合字段多的页
- get_field(‘company’, ‘option’) 取选项页的值
- get_field(‘banner’, ‘term_12’) 取分类项的值
- get_field(‘avatar’, ‘user_1’) 取用户字段的值
循环与选项页
- have_rows(‘specs’) 与 the_row() 配合遍历重复器
- get_sub_field(‘name’) 取当前行的子字段
- the_sub_field(‘value’) 直接打印子字段
- acf_add_options_page() 在主题初始化时注册选项页
- get_field_object(‘model_no’) 取字段配置与选项列表
一段最小可用的重复器写法:if ( have_rows(‘specs’) ) : while ( have_rows(‘specs’) ) : the_row(); 取 get_sub_field(‘name’) 与 get_sub_field(‘value’) 输出到表格行;endwhile; endif; 图片字段返回的是数组,包含地址、宽度、高度与各尺寸别名,直接取 url 即可;如果只需要附件 ID,给 get_field 传第二个参数 false。
安全上别偷懒:所有输出过一遍 esc_html 或 esc_url,所见即所得字段用 wp_kses_post 过滤。后台编辑者可信,不代表数据可信——导入的旧内容里可能带脚本。模板文件写在哪里、怎么组织,见WordPress 主题定制开发。
性能代价与数据陷阱
重复器是把双刃剑
性能上会发生什么
- 每个字段都是元数据表的一行,重复器一百行五列就是五百行
- 按字段值排序或筛选会产生较慢的元数据查询
- 关系字段存的是序列化的 ID 列表,没法直接反向查询
- 装对象缓存后,重复查询的开销可以明显下降
数据上的四个坑
- 改字段名等于换了一把钥匙,旧数据还在但读不到
- 删字段组只删配置,字段值仍留在元数据表里
- 克隆字段组会重复存一份,后期改结构两边不同步
- 灵活内容换布局后,旧布局的数据留在库里但不显示
所以有一条铁律:字段命名上线就冻结。真要改,做法是新建字段、写一段脚本把旧值搬过去、前台切换、确认无误后再清旧数据。元数据表膨胀之后,清理要连带处理孤立记录,思路见数据库优化与冗余清理。
和构建器、多语言、商城的配合
以及卸载后还剩什么
页面构建器多数支持读取 ACF 字段做动态内容,比如把产品型号绑到标题、把画廊绑到轮播。注意一点:构建器读的是字段值,字段被删就变成空白占位,不会报错,排查时容易误判成构建器故障。
多语言站要单独处理字段翻译策略:型号、尺寸这类不翻译,描述、卖点要按语言各存一份。多语言插件里需要给每个字段设置翻译偏好,漏设的结果是英文站显示中文参数。商城场景把 ACF 用在产品附加信息上比直接改模板更稳,但不要用它替代商品属性——属性才能参与筛选与变体。
适用规模
- 产品参数、案例、证书、团队、门店这类结构化内容
- 需要让运营自己在后台加内容、不改代码的站
- 内容模型稳定、字段命名一次定好的项目
- 纯展示、字段不超过五个的站,用不上它
卸载残留
- 字段组配置以自定义文章类型存在文章表里
- 字段值全部留在元数据表,前台函数调用会返回空
- 本地 JSON 文件留在主题目录,重装后会自动导入
- 选项页数据存在选项表,需手工清理
这点很关键:卸载再重装,只要字段名一致,旧数据会自动「复活」。所以迁移或换主题时,先把字段组 JSON 一起带走,比备份整库更轻。二次开发中把它当数据层用,边界见WordPress 二次开发。
免费版与付费版
差在结构,不差在基础字段
| 能力 | 免费版 | 付费版 | 典型用途 |
|---|---|---|---|
| 基础字段 | 提供 | 提供 | 型号、描述、图片、日期 |
| 重复器 | 不提供 | 提供 | 参数表、规格清单、时间轴 |
| 灵活内容 | 不提供 | 提供 | 模块化落地页、可编排区块 |
| 选项页 | 不提供 | 提供 | 全站电话、地址、社交链接 |
| 区块注册 | 不提供 | 提供 | 给编辑者提供预设区块 |
| 价格 | 免费 | 约 49 到 249 美元/年 | 按站点数与功能档位,以官方报价为准 |
判断标准:只需要几个文本和图片字段,免费版够用;要做参数表、要做可编排的落地页模块、要把全站联系方式集中管理,付费版的三个结构型能力就是刚需。这也是自研字段方案往往最后又回到它的原因——重复器和灵活内容自己写一遍,成本远高于授权费。
常见问题
五个高频疑问
字段名就是数据在元数据表里的键。改名之后,模板按新名字去查,自然查不到旧值。数据没丢,只是钥匙换了。把名字改回去立刻恢复;确实要改名,就新建字段并写脚本迁移旧值。
用 have_rows 判断并开启循环,the_row 逐行推进,行内用 get_sub_field 或 the_sub_field 取值。注意外层判断和内层循环都要写,只写一半会导致空数据时输出空表格。循环结束后记得闭合。
不冲突,是并行的两套编辑方式。常见问题是构建器的动态标签指向了已删除的字段,页面显示空白但不报错。排查时先看字段是否还存在、字段组的位置规则是否还匹配当前页面模板。
字段值仍在元数据表里,删插件不会清。重装后只要重新建出同名字段组,旧数据会自动显示。反过来说,这也是个隐患:想彻底清干净,得手工删元数据记录,否则库里会留一堆孤立数据。
可以,用重复器存「参数名 + 参数值」,前台统一渲染成表格,多个产品用同一套字段组就能横向对比。但要注意:如果还要按参数筛选商品列表,应该用商品属性而不是自定义字段,元数据查询在大数据量下会明显变慢。
内容模型定好了,后面才好维护
信科网络在山东淄博做 WordPress 建站与外贸出海 11 年,服务过 3000 多家出口企业。字段组怎么拆、字段名怎么定、模板怎么取,这些前期十分钟的决定,往往决定后期三年的维护成本。