Skip to content

Latest commit

 

History

History
546 lines (375 loc) · 7.41 KB

File metadata and controls

546 lines (375 loc) · 7.41 KB

adv-03-data:Post / Post Meta / Term / Term Meta

一、本课目标

这一课不研究查询条件,而是研究 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 操作的是哪一类数据。


二、这一版 functions.php 新增了什么

adv-03-data/functions.php 在原来的 product / product_cat / post_copy 基础上新增:

Post Meta

文章和 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 的全部值。

Term Meta

product_catpost_copy 都增加:

myseo_keywords
myseo_desc

产品分类 product_cat 额外增加:

pcat_img

文章来源 post_copy 额外增加:

copy_img

图片字段只保存 WordPress 媒体附件 ID,不保存第三方字段插件特有的数据结构。


三、测试前先录入少量数据

不需要重新创建全部测试文章,只补充本课使用的 Meta 数据即可。

1. 找到媒体附件 ID

进入:

后台 → 媒体 → 媒体库

打开一张图片的编辑页面。

浏览器地址通常类似:

/wp-admin/post.php?post=123&action=edit

其中:

123

就是附件 ID。


2. 测试文章 01

编辑:

测试文章 01 - 综合测试

找到:

WP Lab:Post Meta 测试字段

建议填写:

SEO关键词:wordpress,post,meta
SEO描述:这是测试文章01的Post Meta描述
配图附件ID:填写一张图片的附件ID

如果媒体库中有两张图片,也可以填写:

42,51

实际 ID 以自己的 WordPress 数据库为准。


3. 文章来源:原创

进入:

文章 → 文章来源 → 原创

建议填写:

SEO关键词:原创,WordPress
SEO描述:这是原创文章来源的Term Meta描述
图片附件ID:填写图片附件ID

并确认“测试文章 01”已经关联:

原创

4. 产品测试 01

编辑:

产品测试 01

建议填写:

SEO关键词:product,wordpress
SEO描述:这是产品测试01的Post Meta描述
配图附件ID:填写图片附件ID

5. 产品分类:手机

进入:

产品 → 产品分类 → 手机

建议填写:

SEO关键词:手机,产品分类
SEO描述:这是手机分类的Term Meta描述
图片附件ID:填写图片附件ID

四、测试 1:普通文章 single.php

访问:

测试文章 01 - 综合测试

重点观察四部分。

A. Post

页面会读取:

get_the_ID()
the_title()
get_post_field()
get_post_type()
the_author()
get_the_date()
the_content()

先建立一个最重要的认识:

普通文章的核心数据属于 Post。


B. Post Meta

页面会分别测试:

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。


C. WordPress 内置 Taxonomy

页面会显示:

the_category()
the_tags()
get_the_taxonomies()

这里开始区分:

文章本身      → Post
文章分类/标签 → Term

D. 自定义 Taxonomy:post_copy

页面会使用:

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

五、测试 2:Product single-product.php

访问:

/products/product-test-01/

重点不是重复看页面,而是验证:

自定义文章类型 product 仍然属于 WordPress 的 Post 体系。

因此 Product 同样可以使用:

get_the_ID()
the_title()
the_content()
get_post_meta()

它和普通文章真正不同的是:

post_type = product

并且它关联的是:

product_cat

而不是普通文章的:

category

六、测试 3:Product Archive

访问:

/products/

页面使用:

get_queried_object()

此时查询对象应该是:

WP_Post_Type

重点观察:

name
label
has_archive

然后通过主 Loop 得到这个 Post Type 下的 Product。

这一步把上一课 Default Query 和本课 Data 联系起来。


七、测试 4:Product Category

访问:

/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 的核心数据都属于哪套数据体系?