mcpField
P
product-categorization

product-categorization

github.com/finsilabs数据与数据库6084 次安装5 天前更新
代码仓库

关于 product-categorization

面向电商目录建设的技能,指导按 Shopify、WooCommerce、BigCommerce 或自定义平台的原生方式建立分类层级。内容涵盖导航、SEO、批量归类及常见问题处理。

主要功能

  1. 01规划分类层级与标签
  2. 02配置平台原生分类模型
  3. 03优化分类页 SEO 与面包屑
  4. 04批量分配大型目录商品
  5. 05处理路径迁移与常见错误

适用场景

  1. 01为商品目录建立可导航的分类树
  2. 02将扁平商品清单迁移为分类结构
  3. 03修复面包屑路径或分类页 SEO
  4. 04为大型供应商目录批量归类

安装

复制下面的命令,在终端中运行。

$npx skills add https://github.com/finsilabs/awesome-ecommerce-skills --skill product-categorization

安装后在 Claude Code 中输入/product-categorization确认已加载。

包含的文件

除 SKILL.md 外,安装时一起下载的参考资料和脚本。

tile.json
evals/breadcrumb-query-and-category-move-trans/
criteria.json
task.md
evals/category-data-model-with-materialized-pa/
criteria.json
task.md
evals/seo-meta-tags-and-ai-auto-categorization/
criteria.json
task.md

详细介绍

产品分类

概述

结构完善的产品分类体系能让用户轻松找到产品,并通过分类页面提升 SEO。每个平台处理分类的方式各不相同:Shopify 使用产品系列和标签,WooCommerce 使用分层分类和标签,BigCommerce 使用分类及其子分类。了解平台原生的分类模型并正确配置,其效果远胜于构建自定义分类系统。

何时使用此技能

  • 构建需要可导航分类树的产品目录时(服装 > 女装 > 连衣裙)
  • 将扁平的产品列表迁移到结构化分类体系时
  • 缺少面包屑导航或生成的路径不正确时
  • 分类页面需要经过 SEO 优化的 URL 和元标签时
  • 导入需要自动分类的大型供应商目录时

核心说明

步骤 1:了解平台如何处理分类
平台分类模型URL 结构
Shopify产品系列(通过主题实现扁平或嵌套);标签用于额外筛选/collections/womens-dresses
WooCommerce分层分类(父级/子级)+ 标签/product-category/clothing/womens/dresses/
BigCommerce嵌套分类(深度不限)/clothing/womens/dresses/
自定义 / 无头式使用物化路径构建,以便高效查询面包屑/c/clothing/women/dresses

构建前先确定分类层级策略:

  • 2–3 层最适合大多数商店(例如:服装 → 女装 → 连衣裙)
  • 最多 4 层——更深的层级会让购物者困惑,也会削弱 SEO 效果
  • 扁平分类 + 标签适用于小型目录(产品少于 200 件)

步骤 2:平台专属设置

Shopify

Shopify 将产品系列作为主要分类机制。产品系列可以是手动创建的(人工整理),也可以是自动创建的(基于规则)。

创建产品系列层级:

  1. 前往 Admin → Products → Collections → Create collection
  2. 以“Women's Dresses”为例:
    • 创建父级产品系列:“Clothing”(手动创建,用于导航菜单)
    • 创建子级产品系列:“Women's Dresses”(自动创建,规则:标签包含 womens-dress)
  3. 设置产品系列的 SEO 字段:Title、Meta description 和 URL handle
  4. 添加产品系列图片和描述——这些内容有助于提升 SEO 和转化率

自动产品系列(基于规则——推荐):

  • 设置规则,例如:产品类型等于“Dress”且标签包含“womens”
  • 符合规则的产品会自动加入,无需手动整理
  • 最适合无法为每件产品手动指定分类的大型目录

手动产品系列:

  • 最适合精选商品(例如:“Summer Picks”“Staff Favorites”)
  • 在产品系列编辑页面手动添加产品

导航菜单层级:

  1. 前往 Online Store → Navigation
  2. 打开主菜单
  3. 将每个产品系列添加为菜单项;拖动子项到父项下方进行嵌套
  4. 这样便能在店面导航中创建可视化层级,尽管 Shopify 产品系列在技术上是扁平的

用于额外筛选的标签:

  • 添加产品标签,例如 color-red、size-M、material-cotton
  • 使用分面筛选应用(Boost Commerce、Searchpie),将标签转换为产品系列页面上可筛选的属性

面包屑: 大多数 Shopify 主题会自动包含面包屑。如果没有:

  • 前往 Online Store → Themes → Customize
  • 在主题设置中搜索“breadcrumb”——许多主题都提供开关
  • 对于 Dawn/Debut:面包屑因主题而异,可能需要修改 Liquid 代码

WooCommerce

WooCommerce 具有层级式产品分类,这是最接近传统分类树的方式。

创建分类层级:

  1. 前往 Products → Categories → Add New Category
  2. 创建顶级分类:“Clothing”
  3. 创建子分类:“Women's”——选择“Clothing”作为父分类
  4. 创建孙级分类:“Dresses”——选择“Women's”作为父分类

WooCommerce 会自动生成适合 SEO 的 URL:

  • Clothing:/product-category/clothing/
  • Women's:/product-category/clothing/womens/
  • Dresses:/product-category/clothing/womens/dresses/

将产品分配到分类:

  1. 打开产品,然后前往侧边栏中的 Product Categories 小组件
  2. 勾选所有适用的分类(产品可以属于多个分类)
  3. 勾选 Primary category,以便在面包屑导航中显示(需要 Yoast SEO)

分类页面 SEO:

  1. 编辑分类:Products → Categories → [Category] → Edit
  2. 设置 Description(分类网格上方会显示独特的文本,对 SEO 很重要)
  3. 上传 Thumbnail 图片
  4. 使用 Yoast SEO 时:滚动到分类编辑页面上的 Yoast 区域,为每个分类设置 SEO title 和 Meta description

面包屑导航:

  • 安装 Yoast SEO(免费),它会自动添加面包屑导航
  • 或者在 WooCommerce → Settings → Advanced → Breadcrumbs 中启用面包屑导航
  • 配置面包屑分隔符和首页标签

BigCommerce

BigCommerce 采用嵌套分类系统,层级深度不受限制。

创建分类:

  1. 前往 Products → Product Categories → Add
  2. 输入分类名称、描述和 URL(BigCommerce 允许自定义 URL)
  3. 选择 Parent category 将其设为嵌套分类
  4. 上传分类图片
  5. 为每个分类设置 SEO Title 和 Meta description

将产品分配到分类:

  1. 编辑产品
  2. 在 Categories 下,勾选所有适用的分类
  3. BigCommerce 支持将产品分配到多个分类

分类排序方式:

  • 为每个分类设置排序方式:手动、价格升序/降序、最新商品、畅销商品
  • 在分类编辑页面的 Sort Products By 中进行配置

面包屑导航: BigCommerce 主题默认包含面包屑导航,并会自动遵循嵌套分类路径。如有需要,可在主题的 Stencil 文件中自定义面包屑模板。


自定义 / Headless

对于无头店面,请使用物化路径模型,以便高效查询面包屑导航:

// Category model with materialized path
interface Category {
  id: string;
  name: string;
  slug: string;
  parentId: string | null;
  path: string;       // e.g., "clothing/women/dresses" — ancestor slugs joined by /
  pathIds: string[];  // IDs for fast joins: ['cat_root', 'cat_clothing', 'cat_women', 'cat_dresses']
  depth: number;
  position: number;   // Sort order among siblings
  published: boolean;
  seoTitle?: string;
  seoDescription?: string;
}

// Get breadcrumbs in one query using materialized path
export async function getCategoryWithBreadcrumb(slug: string) {
  const category = await db.categories.findUnique({ where: { slug } });
  if (!category) return null;

  // Fetch all ancestors in one query using pathIds
  const ancestors = await db.categories.findMany({
    where: { id: { in: category.pathIds.slice(0, -1) } },
    orderBy: { depth: 'asc' },
  });

  return {
    ...category,
    breadcrumbs: [
      ...ancestors.map(a => ({ name: a.name, url: `/c/${a.path}` })),
      { name: category.name, url: `/c/${category.path}` },
    ],
  };
}

// Update materialized paths when a category is moved
export async function moveCategory(categoryId: string, newParentId: string | null) {
  const category = await db.categories.findUnique({ where: { id: categoryId } });
  const newParent = newParentId ? await db.categories.findUnique({ where: { id: newParentId } }) : null;

  const newPath = newParent ? `${newParent.path}/${category.slug}` : category.slug;
  const newPathIds = newParent ? [...newParent.pathIds, categoryId] : [categoryId];

  // Update this category and all descendants in a transaction
  const descendants = await db.categories.findMany({ where: { path: { startsWith: category.path + '/' } } });

  await db.$transaction([
    db.categories.update({
      where: { id: categoryId },
      data: { parentId: newParentId, path: newPath, pathIds: newPathIds, depth: newPath.split('/').length },
    }),
    ...descendants.map(desc => db.categories.update({
      where: { id: desc.id },
      data: {
        path: desc.path.replace(category.path, newPath),
        pathIds: [...newPathIds, ...desc.pathIds.slice(category.pathIds.length)],
        depth: desc.path.replace(category.path, newPath).split('/').length,
      },
    })),
  ]);
}

步骤 3:优化分类页面的 SEO

无论使用哪个平台,每个分类页面都需要:

  1. 独特描述:撰写 100–200 字的原创文本,介绍此分类中的商品。“选购女士连衣裙”还不够——请描述款式、材质和适用场合。
  2. 分类图片:与该分类相关的主图或横幅图片
  3. SEO 标题:格式为 [Category Name] | [Store Name](例如,“Women's Dresses | YourStore”)
  4. Meta description:用 150–160 个字符突出商品选择的独特之处
  5. 规范 URL:分类的简洁 URL,不含筛选参数(例如,/clothing/womens/dresses,而非 /clothing/womens/dresses?color=red)

筛选页面的规范 URL:

  • Shopify:主题会自动处理集合页面的规范 URL
  • WooCommerce + Yoast SEO:Yoast 会自动设置规范 URL
  • BigCommerce:在分类设置中设置规范 URL
第 4 步:为大型商品目录批量分配分类

对于有数百或数千种商品需要分类的目录:

Shopify:

  • 在管理后台 → 商品中,使用复选框选择多个商品
  • 点击 批量操作 → 添加到系列,即可一次性为所有商品分配分类
  • 对于自动系列,商品符合规则时会自动分配

WooCommerce:

  • 使用 WP All Import,通过 CSV 批量分配分类
  • 或在 WooCommerce 管理后台使用商品批量编辑功能

借助 AI 辅助分类(适用于任何平台):

  • 导出商品目录,包含商品标题和描述
  • 使用 AI 工具根据商品内容推荐分类
  • 使用 Matrixify(Shopify)或 WP All Import(WooCommerce)批量导入建议的分类
  • 发布前务必检查 AI 建议是否准确

最佳实践

  • 在 Shopify 上使用自动(基于规则的)系列作为主要分类体系——新增商品时这些系列会自动更新;手动系列则用于精选的编辑推荐
  • 为每个分类页面撰写独特的描述——没有描述的页面内容单薄,很少能获得较高排名;即使是 100 个字的原创文本,也能显著影响 SEO
  • 大多数商店的分类层级不要超过 3 级——第 4 级很少能带来 SEO 优势,反而会让导航更复杂
  • 使用标签表示跨分类属性(颜色、材质、场合),而不是用分类表示——标签可以支持分面筛选,而无需扩展分类树
  • 移动分类时,在事务中更新路径——部分更新的分类树会导致面包屑导航失效;务必以原子方式更新分类及其所有子分类

常见问题

问题解决方案
面包屑导航显示了错误的分类在 WooCommerce 上安装 Yoast SEO,并为每个商品设置主分类;如果没有主分类,面包屑导航可能会显示任意已分配的分类
Shopify 系列页面没有独特内容在管理后台 → 系列 → [系列] → 描述中添加系列描述;许多商家会将此项留空,错失 SEO 机会
分类 URL 与筛选后的 URL 存在重复内容为所有筛选变体设置指向干净分类 URL 的规范标签;禁止抓取第 2 页之后的分页页面
商品被分配到过多分类每个商品应有一个主分类,并可选配次要分类;分类过多会削弱相关信号,并使导航变得混乱
重命名分类导致现有链接失效重命名时,为旧 URL 到新 URL 设置 URL 重定向;所有平台都支持在设置中配置重定向

相关技能

  • @product-data-modeling
  • @product-content-enrichment
  • @catalog-import-export

评论

支持 Markdown