Shopify 知识库 · 概念
导航菜单与链接列表:Menus、层级与主题呈现
说明 Shopify Content > Menus 里的菜单与菜单项、链接目标类型、层级深度上限,以及 Liquid 的 linklists、linklist、link 对象怎样把菜单交给主题,并给出把新页面加入菜单与验证页头页脚的步骤。
Shopify 的菜单(Menus)是商家在后台维护的链接列表:每个菜单有标题与 handle,由若干菜单项组成,菜单项可以嵌套。主题只负责把菜单输出到页头、页脚或抽屉里。本文解决「菜单在哪里改、能链到什么、能嵌几层、主题怎样读到」;它不规定菜单该怎样分类,也不写各主题的具体样式。Menus and links。
本库哪些内容依赖它
本文是 Shopify 菜单与链接列表的权威来源,其他文章只写各自页面语境下的用法:
- Navigation Menu 展现:下拉、Mega Menu、抽屉与面包屑的交互与无障碍要求,平台落点一节只摘要本文;
- 全局店面区域:Header 与 Footer 是菜单的承载区域;
- Dawn 页头与导航、Horizon 页头与导航:固定版本主题怎样读取菜单数据;
- 主题国际化与翻译与本地化:菜单标题与菜单项标题的翻译;
- URL 重定向:菜单项链到失效地址时的补救;
- 商品分类:最常见的菜单内容。
核心对象与概念
| 对象 | 含义 | 备注 |
|---|---|---|
菜单(menu / linklist) | 一个命名的链接列表 | 有 handle、title、links、levels;默认菜单是 Main menu,handle 为 main-menu |
菜单项(menu item / link) | 菜单里的一条链接 | 有名称与目标;名称可含特殊字符或 emoji |
| 链接目标类型 | Home page、Search、Collections、Products、Pages、Blogs、Blog posts、Policies、Customer accounts、External page、Email link | 来自帮助中心的类型表;Liquid 的 link.type 取值另列 |
| 嵌套 | 拖动菜单项到顶层项之下,形成下拉 | 顶层项之下最多两层嵌套 |
# 链接 | 顶层项不指向任何页面时填的值 | 官方给的做法;用于只作分组标题的项 |
link_list 设置 | 主题设置类型,让商家为区块选择菜单 | 在 shopify.dev 导航教程中出现 |
在哪里配置
- 帮助中心写明在 Shopify admin 的 Content > Menus 查看和修改菜单;菜单显示在主题的哪个位置,在 Theme settings 里选择(多数主题也可在页头分区里改默认主菜单)。
- shopify.dev 的导航教程写的是 Online Store > Navigation 里定义的菜单。两页的后台路径写法不同,并列记录;后台实际入口以当时界面为准。
- 添加菜单项:菜单页点 Add menu item,填名称,在 Search or paste a link 里选类型与具体目标,点 Add,再点 Save 或 Save menu。选具体集合时可以用标签过滤,只显示同时匹配所有标签的商品。
- 顺序:菜单项按列表顺序显示,拖动手柄调整;删除带下级的顶层项会连同下级一起删除。
- 编辑计数:每次添加、编辑、删除、移动都算一次变更,累计 200 次后限制继续操作,直到点 Save;官方建议经常保存。
- 编辑菜单项、下拉菜单。
与主题、Liquid 和 API 的连接
linklists:全局对象,包含店铺全部菜单,按 handle 取用,如linklists.main-menu.links或linklists['footer'].links。官方示例数据里出现了footer这个 handle,属示例,不等于每个店铺都有同名菜单。linklist:handle、levels(嵌套层数)、links(link数组)、title;页面明写最多 3 层。link:active(当前路径与链接相同或包含链接路径)、child_active、current(当前路径与链接 URL 相同,忽略 URL 参数)、child_current、handle、levels、links(子链接)、object、title、type、url,以及data_sharing_opt_out_icon。link.object可能是 article、blog、collection、metaobject、page、policy 或 product。link.type取值:article_link、blog_link、catalog_link、collection_link、collections_link、customer_account_page_link、frontpage_link、http_link(外部页面,或商品类型 / 供应商集合)、metaobject_link、page_link、policy_link、product_link、search_link。- 主题让商家选菜单:在区块里声明
link_list类型设置,再用section.settings.menu.links读取;导航教程写明链接最多嵌套三层,并提醒示例只演示遍历,不是完整导航功能。导航教程。 link.current与child_current把集合上下文中的商品 URL 与标准商品 URL 视为相同;within过滤器生成带集合上下文的商品 URL、需评估 SEO 影响,见 Navigation Menu 展现。- Admin API:
TranslatableResourceType枚举里有MENU(可翻译字段title)与LINK(可翻译字段title);本文未读到菜单读写的 Admin API 页面,未核验。
限制、数值与易错点
- 层级:
linklist页写最多 3 层;帮助中心写顶层项之下最多两层嵌套下拉,并提示更新主题以显示全部三层。多数主题支持最多两层嵌套下拉,具体主题要查文档或实测。Dawn 与 Horizon 的固定版本处理见上面两篇主题正文。 - 数量:帮助中心写每个菜单最多 10,000 项,店铺最多 1,000 个菜单;带下级的菜单项在下拉里另计一个菜单计入该限制。建议顶层项不超过 7 个(官方最佳实践,属建议)。
- 页脚与下拉:同一页里前文写「页脚菜单只能显示顶层项,下拉不能用在页脚」,后文又写「下拉也可以用在页脚菜单」。两处矛盾,本文不选边;页脚实际能否显示嵌套项以主题实现为准。页脚与页头菜单本质上是同一种对象,区别在于主题把哪个菜单输出到哪个区域。
- 顶层项行为:官方写多数主题把下拉标题实现成按钮而不是链接;要让顾客到达分类页,把「全部商品」等入口作为下拉里的第一项。移动端点顶层项发生跳转时,检查链接字段是否为
#。 - 手动粘贴 URL:官方警告,改菜单项 URL 或粘贴 URL 而不直接选择页面,可能断开菜单项与资源的关联而出现 404;外部页面需在下拉里选中目标后再添加,不能只粘贴后按 Enter 或保存。
- 删除资源:删除菜单里引用的集合、页面或商品,对应菜单项一并被删除,看起来像「菜单项无故消失」。
- 早期店铺:创建嵌套菜单时可能出现「Menu cannot contain nested menus」错误,官方说明这通常影响 2018 年前创建的店铺,需联系 Shopify Support。
- 同一目标多处出现:多个导航项指向同一页面(如首页)时,主题可能显示错误的子菜单。
把新页面加入菜单
- 在 Online Store > Pages 创建页面。Visibility 有 Visible(保存后默认可见)与 Hidden,可为 Hidden 页面设置发布日期;Future publishing 页写明页面可以定时发布,并提示先确认 General 设置里的时区。创建与编辑页面。
- 页面创建后,在菜单里选 Pages 类型并直接选该页面,不要粘贴 URL。
- 隐藏或未发布页面加入菜单后,顾客会看到什么,官方页面未读到明文,本文不下结论:必须在保存菜单后用未登录浏览器访问,分别记录页面处于 Hidden 与 Visible 时该菜单项的显示与点击结果。
- 页面改 handle 后旧地址是否需要重定向,见 URL 重定向。
验证一次
- 在 Content > Menus 记录菜单 handle 与嵌套结构,保存后刷新预览。
- 用未登录浏览器检查页头、页脚与移动端菜单,确认三层数据在目标主题里都可达。
- 依次点每个菜单项,记录最终地址,特别是
#分组标题、外部链接与账户页链接。 - 切换店面语言,检查菜单项标题是否已翻译(见翻译与本地化)。
- 删除测试页面前先核对哪些菜单引用它。
待继续完善
- 隐藏与未发布页面在菜单中的行为未核验;
- 页脚是否支持嵌套项的官方说法互相矛盾,需要在具体主题实测;
- 菜单是否随 Markets 变化,官方页未读到,需另查;
- 「Content > Menus」与「Online Store > Navigation」两处入口名称哪个是当前后台,需要在真实后台确认。