前言
之后 steam.cash 导航站的网址一定是通过脚本自动抓取和添加的,因此必须要分析 WordPress 的表结构和 OneNav 操作对表的实际影响。
需要注意的是,本文仅仅做了对 OneNav 导航添加 分类 和 网址 相关的分析。自定义网址、评论和主题相关的操作均不涉及,我也推荐将这些极度个性化的操作只在页面端实施。
OneNav 一为导航主题版本为 V4.1810。
WordPress 与 OneNav 的表结构描述
一、WordPress
官方文档:zh-cn:数据库描述
WordPress 自身拥有 11 张表,它们支撑起了 WordPress 最基础的功能,包括文章编辑、发布、评论和用户操作等。

稍作解释:
wp_comments:保存对文章的评论的信息。
❌ 导航添加分类和网址不涉及。管理>评论>评论wp_commentmeta:保存评论的元数据(特征信息)。
❌ 导航添加分类和网址不涉及。管理>评论>评论wp_links:保存于网址相关的信息。
❌ 看起来似乎和导航主题的网址概念匹配,但实际没有关系。管理>网址>添加
管理>网址>编辑wp_options:保存设置的各项及其值。
❌ 导航添加分类和网址不涉及。管理>设置>常规
管理>设置>撰写
管理>设置>阅读
管理>设置>讨论
管理>设置>隐私
管理>设置>固定网址
管理>设置>杂项
管理>外观>小工具wp_postmeta:保存发布用的对象的元数据(特征信息),包含描述、网址、查看数和收藏数等。
✅ 导航中的一个网址实际上是 WordPress 中的一篇文章,因此导航添加分类和网址涉及该表。管理>文章>添加
管理>页面>添加wp_posts:保存各种发布用的对象的数据,包含标题、内容和状态等。而展示目录的时候,也会使用到该表。
✅ 导航添加分类和网址涉及该表。管理>文章>添加
管理>文章>编辑
管理>页面>添加
管理>页面>编辑
管理>媒体>添加
管理>媒体>媒体库wp_terms:保存文章的分类和 Tags。
✅ 导航添加分类和网址涉及该表。管理>文章>Tags
管理>文章>分类
管理>网址>网址分类
管理>文章>添加
管理>文章>编辑
管理>文章>添加
管理>文章>编辑wp_term_relationships:保存与与文章有关的分类。
✅ 导航添加分类和网址涉及该表。涉及操作与
wp_terms表相同。wp_term_taxonomy:保存分类和 Tags 的属性,比如描述和父子结构等。
✅ 导航添加分类和网址涉及该表。涉及操作与
wp_terms表相同。wp_usermeta:保存每个用户的元数据(特征信息)。
❌ 导航添加分类和网址不涉及。管理>用户wp_users:用户列表。
❌ 导航添加分类和网址不涉及。管理>用户
综上,我们只需要关注 wp_posts、wp_postmeta、wp_terms、wp_term_relationships 和 wp_term_taxonomy 即可。
二、OneNav
表结构原文件等可以到我整理的仓库获取:senjianlu/steamcash
OneNav 新增了 6 张表,来支撑导航需要的功能。

wp_io_custom_term:与 OneNav 主题中商城有关的表。
❌ 导航添加分类和网址不涉及。管理>商城数据wp_io_custom_url:与 OneNav 主题中商城有关的表。
❌ 导航添加分类和网址不涉及。管理>商城数据wp_io_pay_order:与 OneNav 主题中商城有关的表。
❌ 导航添加分类和网址不涉及。管理>商城数据wp_io_custom_messages:可能是与 OneNav 主题中商城有关的表。虽然可能也和其他内部消息推送功能相关,不过我在长久使用后它内部依然没有新增数据。
❌ 导航添加分类和网址不涉及。管理>商城数据wp_io_views:存储网址的点击、访问次数等。
✅ 导航添加分类和网址涉及该表。管理>网址wp_termmeta:存储分类的元数据(特征信息),包含 SEO 信息和其下网址的展示方式等。
✅ 导航添加分类和网址涉及该表。管理>网址>网址分类
综上,我们只需要关注 wp_io_views 和 wp_termmeta 即可。
OneNav 一为导航新建网址实际生成的表数据
OneNav 导航站的大致数据结构:
站点 - 目录 1(父) - 目录 a(子) - 网址百度 - 网址 Google - 目录 b(子) - 目录 2(父) ... ...
一、新建目录(父)
相关表:
wp_terms、wp_termmeta、wp_term_taxonomy和wp_term_relationships。
只方便理解,暂时不会将该功能写入脚本。
1、新建测试用的目录(父)

2、带来的新的数据
-
wp_terms表term_id name slug term_group 7表数据判断用目录(父) table_data_check_for_path_parent 0 最重要就是
term_id,它是这个目录的唯一标识符。 -
wp_termmeta表meta_id term_id meta_key meta_value 22 7_term_order 99 23 7seo_title SEO 自定义标题 24 7seo_metakey SEO 自定义关键词一、关键词2 25 7seo_desc 自定义描述。 另起一行。 26 7card_mode default 27 7columns_type custom 28 7columns a:5:{s:2:“sm”;s:1:“3”;s:2:“md”;s:1:“4”;s:2:“lg”;s:1:“5”;s:2:“xl”;s:1:“6”;s:3:“xxl”;s:1:“7”;} meta_id应该是自增 ID。 -
wp_term_taxonomy表term_taxonomy_id term_id taxonomy description parent count 7 7favorites 表数据判断用目录(父)的描述。另起一行。Home of Emoji Meanings ? ???? 0 0 term_taxonomy_id官方标记了它为自增 ID:term_taxonomy_id bigint(20) unsigned NOT NULL auto_increment,,它的值与term_id并不总是相同,需要区分对待:term_taxonomy_id vs term_id。
而description在表数据中虽然显示有问题(可能是我 MySQL GUI 的问题),但是实际在 WordPress 中表示是好的,后续在脚本编写的时候也会克服这个问题。 -
wp_term_relationships表object_id term_taxonomy_id term_order 虽然单纯创建目录(父)不会新增数据,但这里还是提一下
object_id将是作为网址的 WordPress 文章的post_id,而term_taxonomy_id则是上面wp_term_taxonomy表的主键。
3、配置项与表字段的映射关系
| WordPress 页面配置项 | 对应表字段 | 备注 | 例子 |
|---|---|---|---|
| 名称 | wp_terms.name | ||
| 别名 | wp_terms.slug | ||
| 父级分类目录 | wp_term_taxonomy.parent | 没有父目录的时候为 0 | |
| 描述 | wp_term_taxonomy.description | ||
| 排序 | wp_termmeta 表中 meta_key 为 _term_order 的行 | ||
| 自定义标题 | wp_termmeta 表中 meta_key 为 seo_title 的行 | SEO设置(可留空) | |
| 设置关键词 | wp_termmeta 表中 meta_key 为 seo_metakey 的行 | SEO设置(可留空) | |
| 自定义描述 | wp_termmeta 表中 meta_key 为 seo_desc 的行 | SEO设置(可留空) | |
| 网址卡片样式 | wp_termmeta 表中 meta_key 为 card_mode 的行 | 自定义选项 | |
| 网址列数 | wp_termmeta 表中 meta_key 为 columns_type 的行、wp_termmeta 表中 meta_key 为 columns 的行 | 自定义选项 |
其他字段:
wp_terms.term_id:创建目录的时候自动生成。wp_terms.term_group:目录(父)没有再上级的目录,因此为0。wp_term_taxonomy.taxonomy:总为固定值favorites。wp_term_taxonomy.count:目录中的网址个数。
二、展示目录(父)
相关表:
wp_posts、wp_postmeta和wp_term_relationships。
只方便理解,暂时不会将该功能写入脚本。
1、展示测试用的目录(父)
添加至菜单,之后保存:



2、带来的新的数据
-
wp_posts表ID post_author post_date post_date_gmt post_content post_title post_excerpt post_status comment_status ping_status post_password post_name to_ping pinged post_modified post_modified_gmt post_content_filtered post_parent guid menu_order post_type post_mime_type comment_count 271 2024-10-12 14:21:54 2024-10-12 06:21:54 表数据判断用目录(父)的描述。 另起一行。 Home of Emoji Meanings ? ???? publish closed closed 27 2024-10-12 14:21:54 2024-10-12 06:21:54 0 https://steam.cash/?p=27 4 nav_menu_item 0 虽然乍一看都能明白数据来源,但是基本都是从其他表中检索而来,同时还伴有
menu_order这种需要检索对应数据进行重新排序生成的值。 因此可以预见的是展示目录功能使用 Python3 来实现会比较复杂,顺位最后。 -
wp_postmeta表meta_id post_id meta_key meta_value 192 27 _menu_item_type taxonomy 193 27 _menu_item_menu_item_parent 0 194 27 _menu_item_object_id 7 195 27 _menu_item_object favorites 196 27 _menu_item_target 197 27 _menu_item_classes a:1:{i:0;s:0:"""";} 198 27 _menu_item_xfn 199 27 _menu_item_url 204 27 menu_ico iconfont icon-category 205 27 open 206 27 purview 0 -
wp_term_relationships表object_id term_taxonomy_id term_order 274 0 这里的
object_id是上一张wp_posts表的 ID,而term_taxonomy_id则大概率为4。
原因是与表中的这条数据有关:term_taxonomy_id term_id taxonomy description parent count 44 nav_menu 0 0 OneNav 用其管理所有需要展示的分类,而一般你需要新建一个目录(它的
term_taxonomy_id将自增为3),再进行展示操作,OneNav 自动新建数据,自增为4。
三、新建目录(子)
相关表:
wp_terms、wp_termmeta、wp_term_taxonomy和wp_term_relationships。
数据与目录(父)基本一致。
只方便理解,暂时不会将该功能写入脚本。
1、新建测试用的目录(子)


2、带来的新的数据
-
wp_terms表term_id name slug term_group 8表数据判断用目录(子) table_data_check_for_path_child 0 -
wp_termmeta表meta_id term_id meta_key meta_value 29 8_term_order 50 30 8seo_title 子的自定义标题 31 8seo_metakey 子的自定义关键词一、关键词2 32 8seo_desc 子的自定义描述。 另起一行。 33 8card_mode min 34 8columns_type custom 35 8columns a:5:{s:2:“sm”;s:2:“10”;s:2:“md”;s:1:“9”;s:2:“lg”;s:1:“8”;s:2:“xl”;s:1:“7”;s:3:“xxl”;s:1:“6”;} -
wp_term_taxonomy表term_taxonomy_id term_id taxonomy description parent count 8 8favorites 表数据判断用目录(子)的描述。 另起一行。 Home of Emoji Meanings ? ???? 70 这里指定了父目录,因此
parent为7。 -
wp_term_relationships表object_id term_taxonomy_id term_order
四、展示目录(子)
相关表:
wp_posts、wp_postmeta和wp_term_relationships。
只方便理解,暂时不会将该功能写入脚本。
1、展示测试用的目录(子)



2、带来的新的数据
-
wp_posts表ID post_author post_date post_date_gmt post_content post_title post_excerpt post_status comment_status ping_status post_password post_name to_ping pinged post_modified post_modified_gmt post_content_filtered post_parent guid menu_order post_type post_mime_type comment_count 281 2024-10-12 14:52:49 2024-10-12 06:52:49 表数据判断用目录(子)的描述。 另起一行。 Home of Emoji Meanings ? ???? publish closed closed 28 2024-10-12 14:52:49 2024-10-12 06:52:49 7 https://steam.cash/?p=28 5 nav_menu_item 0 这里指定了父目录,因此
post_parent为7。 -
wp_postmeta表meta_id post_id meta_key meta_value 207 28 _menu_item_type taxonomy 208 28 _menu_item_menu_item_parent 27 209 28 _menu_item_object_id 8 210 28 _menu_item_object favorites 211 28 _menu_item_target 212 28 _menu_item_classes a:1:{i:0;s:0:"""";} 213 28 _menu_item_xfn 214 28 _menu_item_url 216 28 menu_ico iconfont icon-category 217 28 open 218 28 purview 0 -
wp_term_relationships表object_id term_taxonomy_id term_order 284 0
五、新建网址
相关表:
wp_posts和wp_postmeta。
1、新建测试用的网址(在子目录中)


2、带来的新的数据
-
wp_posts表ID post_author post_date post_date_gmt post_content post_title post_excerpt post_status comment_status ping_status post_password post_name to_ping pinged post_modified post_modified_gmt post_content_filtered post_parent guid menu_order post_type post_mime_type comment_count 29 1 2024-10-12 15:04:43 0000-00-00 00:00:00 自动草稿 auto-draft open closed 2024-10-12 15:04:43 0000-00-00 00:00:00 0 https://steam.cash/sites/29.html 0 sites 0 30 1 2024-10-12 15:11:54 2024-10-12 07:11:54 正文信息。另起一行。<a href=""https://steam.cash/sample-page"">示例页面 测试用的新网址(子目录中) publish open closed %e6%b5%8b%e8%af%95%e7%94%a8%e7%9a%84%e6%96%b0%e7%bd%91%e5%9d%80%ef%bc%88%e5%ad%90%e7%9b%ae%e5%bd%95%e4%b8%ad%ef%bc%89 2024-10-12 15:11:54 2024-10-12 07:11:54 0 https://steam.cash/sites/30.html 0 sites 0 -
wp_postmeta表meta_id post_id meta_key meta_value 224 30 views 0 225 30 _down_count 0 226 30 _like_count 0 227 30 _star_count 0 228 30 _user_purview_level all 229 30 _edit_last 1 230 30 _edit_lock 1728717031:1 231 30 _seo_title 232 30 _seo_metakey 233 30 _seo_desc 234 30 sidebar_layout default 235 30 _sites_type sites 236 30 _goto 0 237 30 _wechat_id 238 30 _is_min_app 239 30 _sites_link https://google.com 240 30 _spare_sites_link a:1:{i:0;a:3:{s:10:""spare_name"";s:4:""Bing"";s:9:""spare_url"";s:16:""https://bing.com"";s:10:""spare_note"";s:30:""这是 Bing 的跳转链接。"";}} 241 30 _sites_sescribe 这是 Google 的跳转链接。另起一行。 242 30 _sites_language zh,en 243 30 _sites_country 中国 244 30 _sites_order 0 245 30 _thumbnail https://image.senjianlu.com/blog/icon.png 246 30 _sites_preview https://image.senjianlu.com/blog/2024-10-10/onenav.png 247 30 _wechat_qr 248 30 _down_version 249 30 _down_size 250 30 _down_url_list 251 30 _dec_password 252 30 _app_platform 253 30 _down_preview 254 30 _down_formal 255 30 _screenshot 256 30 buy_option a:7:{s:8:""buy_type"";s:4:""view"";s:5:""limit"";s:3:""all"";s:8:""pay_type"";s:5:""money"";s:10:""price_type"";s:6:""single"";s:9:""pay_title"";s:0:"""";s:9:""pay_price"";s:1:""0"";s:5:""price"";s:1:""0"";} -
wp_term_taxonomy表term_taxonomy_id term_id taxonomy description parent count 8 8 favorites 表数据判断用目录(子)的描述。 另起一行。 Home of Emoji Meanings ? ???? 7 1更新了子目录的
count,将其加一从0变成了1。父目录的不会跟着变化。 -
wp_term_relationships表object_id term_taxonomy_id term_order 308 0 term_taxonomy_id是子目录的term_taxonomy_id为8。
3、配置项与表字段的映射关系
| WordPress 页面配置项 | 对应表字段 | 备注 | 例子 |
|---|---|---|---|
| 网址分类 | wp_term_relationships 表中 object_id 为对应 post_id 的行 | ||
| 标题 | wp_posts.post_title | ||
| 正文 | wp_posts.post_content | ||
| 链接 | wp_postmeta 表中 meta_key 为 _sites_link 的行 | ||
| 备用链接地址(其他站点) | wp_postmeta 表中 meta_key 为 _spare_sites_link 的行 | ||
| 一句话描述(简介) | wp_postmeta 表中 meta_key 为 _sites_sescribe 的行 | ||
| 站点语言 | wp_postmeta 表中 meta_key 为 _sites_language 的行 | ||
| 站点所在国家或地区 | wp_postmeta 表中 meta_key 为 _sites_country 的行 | ||
| 排序 | wp_postmeta 表中 meta_key 为 _sites_order 的行 | 拖动排序的情况下无法更改,一直为 0 | |
| LOGO,标志 | wp_postmeta 表中 meta_key 为 _thumbnail 的行 | ||
| 网站预览截图 | wp_postmeta 表中 meta_key 为 _sites_preview 的行 | ||
| 公众号二维码 | wp_postmeta 表中 meta_key 为 _wechat_qr 的行 |
其他字段:
wp_posts.id:自增。wp_posts.post_name:Url 编码后的标题。wp_posts.uid:"https://steam.cash/sites/{}.html".format(id)形式的值。wp_postmeta表中meta_key为_edit_lock的行:前面的值是秒级的时间戳,"{}:1".format(str(int(time.time())))形式的值。