这一课不研究查询条件,而是研究 WordPress 已经拿到一条内容以后,数据分别从哪里读取。
建议把数据分成四层理解:
Post
├─ 文章 post
├─ 页面 page
├─ 产品 product
└─ 媒体 attachment
Post Meta
└─ 一条 Post 的扩展字段
Term / Taxonomy
├─ category
├─ post_tag
├─ product_cat
└─ post_copy
Term Meta
└─ 一个 Term 的扩展字段
对应数据库概念可以先记成:
Post → wp_posts
Post Meta → wp_postmeta
Term → wp_terms
Taxonomy → wp_term_taxonomy
内容与 Term 关系 → wp_term_relationships
Term Meta → wp_termmeta
当前阶段不需要直接写 SQL,只需要知道 WordPress API 操作的是哪一类数据。
adv-03-data/functions.php 在原来的 product / product_cat / post_copy 基础上新增:
文章和 Product 都可以填写:
myseo_keywords
myseo_desc
myp_imgs
其中:
myseo_keywords:单值字符串myseo_desc:单值字符串myp_imgs:同一个 Meta Key 保存多条附件 ID
这样可以直接比较:
get_post_meta( $post_id, 'myseo_keywords', true );
get_post_meta( $post_id, 'myp_imgs', false );true 用于读取单个值;false 用于读取同一个 Key 的全部值。
product_cat 与 post_copy 都增加:
myseo_keywords
myseo_desc
产品分类 product_cat 额外增加:
pcat_img
文章来源 post_copy 额外增加:
copy_img
图片字段只保存 WordPress 媒体附件 ID,不保存第三方字段插件特有的数据结构。
不需要重新创建全部测试文章,只补充本课使用的 Meta 数据即可。
进入:
后台 → 媒体 → 媒体库
打开一张图片的编辑页面。
浏览器地址通常类似:
/wp-admin/post.php?post=123&action=edit
其中:
123
就是附件 ID。
编辑:
测试文章 01 - 综合测试
找到:
WP Lab:Post Meta 测试字段
建议填写:
SEO关键词:wordpress,post,meta
SEO描述:这是测试文章01的Post Meta描述
配图附件ID:填写一张图片的附件ID
如果媒体库中有两张图片,也可以填写:
42,51
实际 ID 以自己的 WordPress 数据库为准。
进入:
文章 → 文章来源 → 原创
建议填写:
SEO关键词:原创,WordPress
SEO描述:这是原创文章来源的Term Meta描述
图片附件ID:填写图片附件ID
并确认“测试文章 01”已经关联:
原创
编辑:
产品测试 01
建议填写:
SEO关键词:product,wordpress
SEO描述:这是产品测试01的Post Meta描述
配图附件ID:填写图片附件ID
进入:
产品 → 产品分类 → 手机
建议填写:
SEO关键词:手机,产品分类
SEO描述:这是手机分类的Term Meta描述
图片附件ID:填写图片附件ID
访问:
测试文章 01 - 综合测试
重点观察四部分。
页面会读取:
get_the_ID()
the_title()
get_post_field()
get_post_type()
the_author()
get_the_date()
the_content()先建立一个最重要的认识:
普通文章的核心数据属于 Post。
页面会分别测试:
get_post_meta( $post_id, 'myseo_keywords', true );
get_post_meta( $post_id, 'myseo_desc', true );以及:
get_post_meta( $post_id, 'myp_imgs', false );再比较:
get_post_meta( $post_id, 'myp_imgs', true );重点理解第三个参数:
true → 单值
false → 全部值组成的数组
myp_imgs 保存的是附件 ID,因此还可以继续:
wp_get_attachment_image( $image_id, 'thumbnail' );从附件 ID 得到图片 HTML。
页面会显示:
the_category()
the_tags()
get_the_taxonomies()这里开始区分:
文章本身 → Post
文章分类/标签 → Term
页面会使用:
get_the_terms()
get_term_link()
get_the_term_list()
the_terms()并直接观察一个 WP_Term 对象中的:
term_id
name
slug
taxonomy
description
count
然后继续读取:
get_term_meta()这一步就是从:
Term
进入:
Term Meta
访问:
/products/product-test-01/
重点不是重复看页面,而是验证:
自定义文章类型
product仍然属于 WordPress 的 Post 体系。
因此 Product 同样可以使用:
get_the_ID()
the_title()
the_content()
get_post_meta()它和普通文章真正不同的是:
post_type = product
并且它关联的是:
product_cat
而不是普通文章的:
category
访问:
/products/
页面使用:
get_queried_object()此时查询对象应该是:
WP_Post_Type
重点观察:
name
label
has_archive
然后通过主 Loop 得到这个 Post Type 下的 Product。
这一步把上一课 Default Query 和本课 Data 联系起来。
访问:
/product-category/phone/
此时:
get_queried_object()得到的是:
WP_Term
观察:
term_id
name
slug
taxonomy
description
count
再通过:
get_term_meta()读取:
myseo_keywords
myseo_desc
pcat_img
最后主 Loop 输出这个 Term 下的 Product。
普通文章 post ─┐
页面 page ├─→ Post ─→ Post Meta
产品 product │
媒体 attachment┘
Post
│
└─ relationship
│
↓
Term ─→ Term Meta
↑
│
Taxonomy 定义 Term 属于哪种分类体系
例如:
产品测试01
↓
Post Type = product
↓
Post Meta = myseo_keywords / myseo_desc / myp_imgs
↓
关联 product_cat
↓
Term = 手机
↓
Term Meta = myseo_keywords / myseo_desc / pcat_img
暂时不增加:
- ACF
- Carbon Fields
- CMB2
- 复杂媒体选择器
- 自定义数据库表
- REST 前端调用
本课只研究 WordPress Core 的:
Post
Post Meta
Taxonomy
Term
Term Meta
Attachment ID
先把这几层关系彻底弄清楚。
测试完成后,只要能够清楚解释以下问题,本课即可结项:
- Product 为什么仍然可以使用
get_post_meta()? -
get_post_meta(..., true)和false有什么区别? - Category / Tag / product_cat / post_copy 的共同点是什么?
- Taxonomy 和 Term 的区别是什么?
-
get_term_meta()的数据属于谁? - 图片附件 ID 为什么可以交给
wp_get_attachment_image()? - 普通文章和 Product 的核心数据都属于哪套数据体系?