enable-shopify-menus

bởi vercel

Thay thế các menu điều hướng và chân trang được mã cứng bằng các menu do Shopify cung cấp.

npx skills add https://github.com/vercel/shop --skill enable-shopify-menus

Enable Shopify Menus

By default, the storefront's nav and footer render hardcoded fallback items: an inline const items: MenuItem[] = [...] in Nav (components/nav/index.tsx) and an empty const items: MenuItem[] = [] in Footer (components/footer/index.tsx). The components themselves (QuickLinks, MobileMenu, Footer's FooterMenu) already consume MenuItem[] in Shopify shape and render up to three levels of nesting. This skill swaps that inline default to a live Shopify menu fetched by handle, keeping the inline items as the fallback if the menu is missing or empty.

Before you start

Ask the user two questions in order:

1. Which menus do you want to fetch from Shopify?

  • Nav menu — replaces the hardcoded items used by the desktop quick links and mobile sheet.
  • Footer menu — replaces the hardcoded footer columns.
  • Both

2. What are the Shopify menu handles?

Ask for each selected menu. Defaults: main-menu for nav, footer for footer.

Wait for the user to answer before proceeding.


Part A: Enable Shopify nav menu

Skip this section if the user did not select the nav menu.

Edit components/nav/index.tsx. Change the signature to export async function Nav() (preserving any existing props in a customized storefront), add the getMenu import, and swap the data source:

import { getMenu } from "@/lib/menu/server";

Inside Nav, keep the existing inline default and swap the data source so the Shopify menu takes precedence:

const defaultItems: MenuItem[] = [
  { id: "default-nav-shop", title: "Shop", url: "/collections/all", type: "HTTP", items: [] },
];
const menu = await getMenu({ handle: "NAV_HANDLE" });
const items = menu?.items ?? defaultItems;

Replace "NAV_HANDLE" with the handle the user provided. QuickLinks and MobileMenu already accept MenuItem[], so no other component changes are needed. Keep the inline default as the fallback.


Part B: Enable Shopify footer menu

Skip this section if the user did not select the footer menu.

Edit components/footer/index.tsx. Make the component async, add the getMenu import, and swap the data source:

import { getMenu } from "@/lib/menu/server";

Change the signature to async and replace const items: MenuItem[] = []; with:

const menu = await getMenu({ handle: "FOOTER_HANDLE" });
const items = menu?.items ?? [];

Replace "FOOTER_HANDLE" with the handle the user provided. FooterMenu already accepts MenuItem[]. The footer's default is empty (no columns), so falling back to [] simply hides the section when the Shopify menu is missing or empty.

Inspect the Footer callsite and getMenu operation instead of assuming a locale prop exists. The default uses explicit shopConfig.localization commerce settings and inline component copy; no getLocale() helper is needed. In an already localized or Markets-enabled store, preserve and pass its validated commerce context through menu operations and cache inputs. Keep existing cache directives and Suspense boundaries; do not change rendering policy just to enable a menu.


Guardrails

  • New fallback labels belong alongside the consuming domain component; preserve catalogs and translated fallbacks in an already localized installation. Shopify menu translations and storefront fallback copy are separate.
  • getMenu() in lib/menu/server.ts already handles caching ("use cache: remote", cacheTag("menus")) around the uncached fetchMenu() operation in lib/shopify/operations/menu/server.ts, which handles URL transformation. Do not duplicate that logic.
  • Always preserve the inline fallback so a missing or empty Shopify menu doesn't leave the user with a blank nav or footer.
  • External links (URLs starting with http) are handled by the existing MenuLink helpers in each component — no change needed.

Thêm skills từ vercel

vercel
vercel
API REST Vercel được mô phỏng để phát triển và kiểm thử cục bộ. Sử dụng khi người dùng cần tương tác với các điểm cuối API Vercel tại chỗ, kiểm thử tích hợp Vercel,…
cron-jobs
vercel
Cấu hình và các phương pháp tốt nhất cho Vercel Cron Jobs. Sử dụng khi thêm, chỉnh sửa hoặc gỡ lỗi các tác vụ đã lên lịch trong vercel.json.
codegen
vercel
Các tiện ích tạo mã cho json-render. Sử dụng khi tạo mã từ đặc tả giao diện người dùng, xây dựng trình xuất mã tùy chỉnh, duyệt qua các đặc tả hoặc tuần tự hóa các thuộc tính cho…
next-best-practice
vercel
Các phương pháp hay nhất của Next.js - quy ước tệp, ranh giới RSC, mẫu dữ liệu, API bất đồng bộ, siêu dữ liệu, xử lý lỗi, trình xử lý tuyến đường, tối ưu hóa hình ảnh/phông chữ,…
benchmark-sandbox
vercel
Chạy các kịch bản đánh giá vercel-plugin trong Vercel Sandboxes thay vì các bảng WezTerm cục bộ. Cung cấp các microVM tạm thời với Claude Code và plugin được cài đặt sẵn,…
write-guide
vercel
Tạo một hướng dẫn kỹ thuật dạy một trường hợp sử dụng thực tế thông qua các ví dụ tiến dần. Các khái niệm chỉ được giới thiệu khi người đọc cần đến chúng.
benchmark-testing
vercel
Tạo và khởi chạy các dự án kiểm thử benchmark để thực thi việc tiêm kỹ năng vercel-plugin qua các kịch bản thực tế. Thiết lập các thư mục độc lập, cài đặt…
ai-gateway
vercel
Hướng