WordPress 的菜单

wordpress 的 menu 是存放在哪个数据表下?

ChatGPT 说:

在 WordPress 中,菜单信息存储在以下几个数据库表中:

1. wp_terms

菜单本身是 WordPress 中的一个 分类法(taxonomy),称为 nav_menu。每个菜单都会作为一个 term 存储在 wp_terms 表中。这个表保存了菜单的基本信息,比如菜单名称。

  • term_id:菜单的唯一 ID
  • name:菜单名称
  • slug:菜单的别名,用于 URL
  • term_group:用于分组的字段,通常为空

2. wp_term_taxonomy

该表用来存储关于菜单的分类信息。每个菜单项(term)都有一个对应的 term_taxonomy_id,并且将 taxonomy 设置为 nav_menu,表示这是一个导航菜单。

  • term_taxonomy_id:菜单分类的唯一 ID
  • term_id:在 wp_terms 表中对应的菜单的 term_id
  • taxonomy:表示菜单的分类法类型,这里是 nav_menu
  • description:菜单的描述
  • parent:如果菜单是嵌套菜单(子菜单),这里保存父菜单的 ID
  • count:菜单项的数量(通常为 0)

3. wp_term_relationships

这个表将菜单项与其他内容进行关联。每个菜单项(term)会与一个页面、文章、分类等进行关联。该表通过 object_idterm_taxonomy_id 来建立这种关系。

  • object_id:关联的对象 ID(比如页面 ID、文章 ID 等)
  • term_taxonomy_id:与 wp_term_taxonomy 表中的 term_taxonomy_id 关联
  • term_order:菜单项的顺序

4. wp_posts

菜单项本身是存储在 wp_posts 表中的 post_typenav_menu_item 的文章类型。每个菜单项都是一个独立的 post,它将指向一个页面、文章、分类或自定义链接。

  • ID:菜单项的唯一 ID
  • post_title:菜单项的标题
  • post_content:菜单项的内容,通常是链接的 URL
  • post_typenav_menu_item,表示这是一个菜单项
  • post_parent:如果是子菜单项,它将指向父菜单项的 post ID
  • menu_order:菜单项在菜单中的排序

5. wp_postmeta

菜单项的额外信息(比如目标链接、CSS 类等)存储在 wp_postmeta 表中。每个菜单项都会有多个元数据(meta),如:

  • _menu_item_url:菜单项的 URL
  • _menu_item_target:是否在新窗口中打开链接
  • _menu_item_classes:菜单项的 CSS 类
  • _menu_item_object:菜单项指向的对象类型(如 pagecategory 等)
  • _menu_item_object_id:菜单项关联的对象 ID

总结

  • 菜单信息 存储在 wp_termswp_term_taxonomy 表中。
  • 菜单项 存储在 wp_posts 表中,post_typenav_menu_item
  • 菜单项的额外数据 存储在 wp_postmeta 表中。
  • 菜单与其他对象的关系 存储在 wp_term_relationships 表中。

这样,WordPress 通过这些表来管理和关联菜单及其菜单项。如果你需要修改或查询菜单数据,通常涉及这几个表的联动查询。

您说:

主导航菜单也是?

ChatGPT 说:

是的,主导航菜单(和其他任何菜单)也是通过 WordPress 的菜单系统来管理的,基本上遵循上面提到的存储结构。主导航菜单只是一个特定的菜单,它通常是你通过 外观 → 菜单 设置的默认菜单(或多个菜单之一)。所有菜单,无论是主导航菜单还是其他辅助菜单,都存储在相同的表中,以下是具体细节:

1. 菜单的基本存储位置

  • wp_terms:存储菜单的基本信息,包括菜单的名称。
  • wp_term_taxonomy:存储菜单作为 nav_menu 分类法的信息,确保 WordPress 知道这是一个菜单而不是其他类型的分类。
  • wp_term_relationships:将菜单项与对象(如页面、文章等)关联起来。这里存储了菜单项与实际内容(如页面 ID)的关系。
  • wp_posts:所有菜单项(nav_menu_item)都是一种特殊类型的文章(post_type = 'nav_menu_item'),存储每个菜单项的详细信息。

2. 主导航菜单和其他菜单的区别

  • 主导航菜单 本质上是一个普通的菜单,只是 WordPress 中的菜单系统默认提供一个位置叫做 “主菜单” 或 “主导航菜单”。
  • 你可以通过 外观 → 菜单 来设置主菜单,或者其他菜单的位置,如页脚菜单、社交媒体菜单等。每个菜单都由 wp_termswp_term_taxonomy 表来管理,主导航菜单 也存储在这些表中,唯一的区别是它通常是默认分配的菜单位置。

3. 菜单位置(theme location)

在主题中,主导航菜单的位置通常会有一个指定的 菜单位置,比如 primaryheader_menu,这是在主题的 functions.php 文件中注册的。通过这个位置,主题能够识别用户选择的菜单并显示在指定的位置。

例如,在 functions.php 文件中,主题会像这样注册菜单位置:

function my_theme_register_menus() {
    register_nav_menus(array(
        'primary' => '主导航菜单',
        'footer'  => '页脚菜单'
    ));
}
add_action('after_setup_theme', 'my_theme_register_menus');

当你在 外观 → 菜单 中设置菜单时,你可以选择将其分配到这些注册的位置,比如主导航菜单的位置(primary)或页脚菜单位置(footer)。

4. 菜单项的关联

菜单项本身存储在 wp_posts 表中,post_typenav_menu_item。每个菜单项都与一个页面、文章、分类或自定义链接关联。你可以查看这些菜单项的详细信息,包括它们的 ID、关联的页面或自定义链接等。

SELECT * FROM wp_posts WHERE post_type = 'nav_menu_item';

在这个查询中,你将看到所有的菜单项,相关的 URL、目标(比如 _menu_item_target),以及 CSS 类等。

5. 如何查询主导航菜单

如果你需要在数据库中查找主导航菜单,特别是想通过 SQL 查询获取它,可以通过以下步骤:

  1. 查找主菜单的 term_id
    查找存储主导航菜单的 term_id。通常它会存储在 wp_terms 表中:
SELECT term_id FROM wp_terms WHERE name = '主导航菜单名称';
  1. 查询 wp_term_taxonomy
    通过菜单的 term_id 查找该菜单对应的 taxonomy 类型是 nav_menu
SELECT term_taxonomy_id FROM wp_term_taxonomy WHERE term_id = [term_id] AND taxonomy = 'nav_menu';
  1. 查找菜单项
    使用 term_taxonomy_id 获取菜单项:
SELECT * FROM wp_term_relationships WHERE term_taxonomy_id = [term_taxonomy_id];
  1. 查询菜单项详细信息
    根据 object_id 获取菜单项的详细信息(如页面、文章 ID):
SELECT * FROM wp_posts WHERE ID = [object_id];

总结

  • 主导航菜单primary)是通过 WordPress 菜单系统管理的,和其他菜单在数据库结构上没有区别。它也存储在 wp_termswp_term_taxonomywp_term_relationshipswp_postswp_postmeta 表中。
  • 菜单位置(如 primary)是主题中注册的,用于指定菜单应该显示的位置。
  • 你可以通过 SQL 查询来检索主导航菜单和菜单项的详细信息。

如果你在开发中需要处理主导航菜单,通常你会用 wp_nav_menu() 函数来显示它,而不需要直接操作数据库。

您说:

菜单的层次关系是怎么实现的

ChatGPT 说:

在 WordPress 中,菜单的层次关系是通过 父子菜单项 的机制来实现的。当你在 外观 → 菜单 中创建菜单时,你可以轻松地通过拖放菜单项来设置它们的层次结构(即子菜单)。这一层次关系在数据库中通过以下方式实现:

1. 父子菜单项的关联

每个菜单项(nav_menu_item)实际上是一个独立的文章(post_type = 'nav_menu_item'),并且每个菜单项有一个 父菜单项post_parent)字段。这个字段用来表示该菜单项是否是其他菜单项的子菜单项。如果该菜单项没有父菜单项(即它是顶级菜单项),则 post_parent 字段的值为 0

主要字段:

  • ID:菜单项的唯一 ID。
  • post_parent:表示该菜单项的父级菜单项的 ID。如果是顶级菜单项,则值为 0
  • menu_order:表示菜单项在同一层级中的排序顺序。

2. 存储菜单层次结构

菜单层次结构主要是通过以下两个表来存储的:

  • wp_posts:存储每个菜单项,post_type = 'nav_menu_item'。每个菜单项都有一个 post_parent 字段,指向它的父菜单项的 ID(如果有)。

例如,一个子菜单项可能会有一个 post_parent 值,指向父菜单项的 ID。顶级菜单项的 post_parent0

  • wp_postmeta:存储菜单项的额外信息,如链接的 URL、目标窗口、CSS 类等。这些信息有助于管理和渲染菜单项。

3. 数据库中如何表示层次关系

假设我们有以下菜单层次结构:

markdown复制编辑首页
  ├── 产品
      ├── 产品 1
      └── 产品 2
  ├── 关于我们
  └── 联系我们

在数据库中,菜单项会像这样存储:

wp_posts 表(示例)

ID post_type post_parent menu_order post_title
1 nav_menu_item 0 1 首页
2 nav_menu_item 0 2 产品
3 nav_menu_item 2 1 产品 1
4 nav_menu_item 2 2 产品 2
5 nav_menu_item 0 3 关于我们
6 nav_menu_item 0 4 联系我们

说明:

  • ID 列是菜单项的唯一 ID。
  • post_parent 列表示该菜单项的父菜单项的 ID。例如,产品(ID = 2)是顶级菜单项,它的 post_parent 是 0,而 产品 1(ID = 3)和 产品 2(ID = 4)是 产品(ID = 2)的子菜单项,所以它们的 post_parent 都是 2。
  • menu_order 列表示菜单项的排序顺序,在同一层级中,menu_order 数字越小,菜单项显示得越靠前。

4. 如何渲染菜单的层次结构

WordPress 使用 wp_nav_menu() 函数来渲染菜单,wp_nav_menu() 会自动处理层次结构,生成适当的嵌套 <ul><li> 标签。层次关系通常表现为嵌套的 ul 元素,子菜单项会被包含在父菜单项的 ul 中。

示例:

假设你在模板中使用 wp_nav_menu() 函数来显示主菜单:

<?php
wp_nav_menu(array(
    'theme_location' => 'primary', // 指定菜单位置
    'menu_class' => 'main-menu',    // 为菜单添加 CSS 类
    'container' => false           // 不添加容器 div
));
?>

输出的 HTML 可能会像这样:

html复制编辑<ul class="main-menu">
    <li><a href="/home">首页</a></li>
    <li><a href="/products">产品</a>
        <ul>
            <li><a href="/products/product1">产品 1</a></li>
            <li><a href="/products/product2">产品 2</a></li>
        </ul>
    </li>
    <li><a href="/about">关于我们</a></li>
    <li><a href="/contact">联系我们</a></li>
</ul>
  • 首页关于我们联系我们 是顶级菜单项。
  • 产品 是顶级菜单项,它有一个子菜单 产品 1产品 2,这两项被嵌套在一个 ul 元素中。

5. 自定义菜单的层次结构

在创建和管理自定义菜单时,WordPress 后台提供了一个拖放界面,允许你轻松设置父子菜单项。在 外观 → 菜单 页面,你只需要将菜单项拖放到其他菜单项下方,就能轻松创建子菜单(层次结构)。

总结

  • 父子菜单项 的关系是通过 wp_posts 表中的 post_parent 字段来表示的。子菜单项的 post_parent 值指向父菜单项的 ID,顶级菜单项的 post_parent0
  • 菜单的层次结构 在数据库中存储为多个 nav_menu_item,并通过 menu_orderpost_parent 字段来确定排序和层级关系。
  • WordPress 自动渲染层次结构wp_nav_menu() 函数会根据菜单项的层次关系自动生成嵌套的 ulli 标签,显示正确的菜单层次结构。

这样,菜单的层次关系通过父子关系和排序字段来实现,且 WordPress 会在渲染时自动处理这些关系并生成嵌套的 HTML。

暂无评论

发送评论 编辑评论


				
|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
颜文字
Emoji
小恐龙
花!
上一篇
下一篇