一句话结论
WordPress 自定义字段本质就是 post meta:用 get_post_meta() / update_post_meta() 读写,用 register_meta() 注册带类型、可在 REST 中暴露的元数据,再用区块绑定(Block Bindings)把元数据安全地显示到区块主题前端——三步就能把「文章之外的结构化数据」用起来。
自定义字段到底是什么
你在文章编辑页「自定义字段」面板看到的每条记录,底层都是一张 wp_postmeta 表里的键值对,挂在某个文章 ID 下。它和「自定义文章类型(CPT)」是两套东西:CPT 是内容类型,meta 是挂在任意文章(含 CPT)上的附加结构化数据。
别一上来就写自定义字段。如果只是给文章加几个固定属性(如「副标题」「阅读时长」),先想清楚要不要注册成带类型的 meta——这样 REST 、区块绑定、编辑器都能直接吃到,不用每次手动拼 SQL 。
第一步:读写元数据
最常用两个函数,都按文章 ID + meta key 工作:
// 读:第三个参数 true 表示只取单个值(而非数组)
$subtitle = get_post_meta( get_the_ID(), 'sub_title', true );
// 写:存在则更新,不存在则新增
update_post_meta( get_the_ID(), 'sub_title', '一文讲清自定义字段' );
// 追加多个值(single=false 时)
add_post_meta( get_the_ID(), 'related_ids', 123 );
| 函数 | 作用 | 注意点 |
|---|---|---|
get_post_meta | 读取元数据 | 第 3 参 true 返回字符串,false/省略返回数组 |
update_post_meta | 更新/新增 | 按 key 幂等,重复调用只覆盖 |
add_post_meta | 追加 | 同一 key 可存多个值 |
delete_post_meta | 删除 | 可只删某个值 |
第二步:注册带类型的元数据
裸写 meta 能用,但注册之后才规范:类型校验、是否在 REST 暴露、是否单值都一目了然。
// 在 init 钩子里注册
register_post_meta( 'post', 'sub_title', array(
'type' => 'string',
'single' => true,
'sanitize_callback' => 'sanitize_text_field',
'auth_callback' => function() { return current_user_can( 'edit_posts' ); },
'show_in_rest' => true, // 暴露给 Gutenberg / REST,区块绑定才能用
) );
register_meta 与 register_post_meta 的区别
register_meta( $object_type, $meta_key, $args ) 是更通用的入口,$object_type 可以是 post、user、term、comment 等;register_post_meta( $post_type, $meta_key, $args ) 是面向文章的便捷封装,第一参直接传文章类型(如 'post' 或某个 CPT 的 slug)。两者底层一致。第三步:在区块主题前端显示(区块绑定)
区块主题没有 PHP 模板循环给你直接 echo,正确做法是用区块绑定(Block Bindings):让一个核心块(如段落)的内容绑定到某个 post-meta 源。注册时务必 show_in_rest=true,否则绑定源取不到。
<!-- wp:paragraph {"metadata":{"bindings":{"content":{"source":"core/post-meta","args":{"key":"sub_title"}}}} /-->
绑定后的副标题会显示在这里
<!-- /wp:paragraph -->
这样编辑者在文章里改自定义字段,前端段落自动同步,且不触碰父主题代码——和子主题改样式的思路一致。
读 WordPress 官方 Metadata API 文档常见问题(FAQ)
自定义字段和自定义文章类型(CPT)是一回事吗?
不是。 CPT 是内容类型(如「产品」「案例」),meta 是挂在任意文章上的附加键值数据。两者常配合使用:给产品 CPT 加 price 、 sku 这类 meta 。
为什么注册 meta 时要开 show_in_rest?
不开的话,Gutenberg 编辑器和区块绑定都读不到这个字段,前端用区块绑定显示会失败。 REST 暴露还方便你做无头/前端渲染。
区块主题里怎么显示自定义字段?
用区块绑定(Block Bindings):把段落等核心块的内容绑定到
core/post-meta 源并指定 key 。比在模板里硬写 PHP 更稳、不侵入父主题。get_post_meta 第三参数 true/false 差在哪?
true 返回单个值(字符串),false 或省略返回该 key 下所有值的数组(当你用 add_post_meta 存了多个值时用)。






评论 (0)