为什么我们要注册 post_type,而不是直接插入 wp_posts 表就行?
✅ 简短回答:
插入不注册可以“存进数据库”,但WordPress 的整个系统无法识别和正常使用它。注册
post_type是为了让 WordPress 正确加载、显示、管理该内容类型。
🔍 详细解释:
✅ 1. WordPress 的核心是“Post Type”
post,page,attachment,product,shop_order等,全部都是post_type- 这些类型通过
register_post_type()注册,让 WordPress 知道怎么处理它:
| 功能 | 需要注册 |
|---|---|
| 后台菜单 | ✅ 是 |
| 编辑器支持(标题、缩略图、分类法等) | ✅ 是 |
| 查询接口(WP_Query) | ✅ 是 |
| REST API | ✅ 是 |
| URL 重写 | ✅ 是 |
| 归档页面、单页页面 | ✅ 是 |
使用 get_post_type()、get_post_type_object() 等函数 | ✅ 是 |
| 自动的权限控制 | ✅ 是 |
| 关联自定义分类法(taxonomy) | ✅ 是 |
❌ 2. 如果你不注册,直接插入会怎么样?
你可以手动这样插入:
php复制编辑wp_insert_post([
'post_title' => 'Test',
'post_type' => 'stock_product',
'post_status' => 'publish'
]);
虽然插入成功,但会有问题:
| 问题 | 解释 |
|---|---|
| 后台不显示 | 因为后台没有菜单挂载这个类型 |
| 访问单页/归档报错 | 因为没有注册 rewrite 规则 |
| 查询不到 | 有些查询不会自动包含未注册的 post_type |
| 权限不生效 | WordPress 没有加载它的 capability 设置 |
| 分类法绑定无效 | 有些功能无法自动关联 taxonomy |
| REST 接口无响应 | WordPress 不知道要暴露这个类型 |
✅ 总结
| 场景 | 建议 |
|---|---|
| 只是当个数据表用,不打算用 WordPress 的功能管理 | 可以不注册,但意义不大 |
| 想让这个类型在后台管理、前台显示、支持查询、分类等功能 | 必须注册 post_type |
🛠 如果你只是想要一个“存商品数据的结构”,并不使用 WordPress UI,可以:
- 用
post_type=stock_product注册,但public => false,不显示在前台; - 或者直接建一张自定义表(更推荐)。