Skip to content

Commit 536df2e

Browse files
committed
feat: add explicit Makeswift SEO metadata support
1 parent 5a33677 commit 536df2e

File tree

24 files changed

+197
-35
lines changed

24 files changed

+197
-35
lines changed

.changeset/wild-bears-open.md

Lines changed: 82 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,82 @@
1+
---
2+
"@bigcommerce/catalyst-makeswift": patch
3+
---
4+
5+
Add explicit Makeswift SEO metadata support to public-facing pages. When configured in Makeswift, the SEO title and description will take priority over the default values from BigCommerce or static translations.
6+
7+
The following pages now support Makeswift SEO metadata:
8+
9+
- Home page (`/`)
10+
- Catch-all page (`/[...rest]`)
11+
- Product page (`/product/[slug]`)
12+
- Brand page (`/brand/[slug]`)
13+
- Category page (`/category/[slug]`)
14+
- Blog list page (`/blog`)
15+
- Blog post page (`/blog/[blogId]`)
16+
- Search page (`/search`)
17+
- Cart page (`/cart`)
18+
- Compare page (`/compare`)
19+
- Gift certificates page (`/gift-certificates`)
20+
- Gift certificates balance page (`/gift-certificates/balance`)
21+
- Contact webpage (`/webpages/[id]/contact`)
22+
- Normal webpage (`/webpages/[id]/normal`)
23+
24+
## Migration steps
25+
26+
### Step 1: Add `getPageMetadata` function
27+
28+
Add the `getPageMetadata` function to `core/lib/makeswift/client.ts`:
29+
30+
```diff
31+
+ export async function getPageMetadata({ path, locale }: { path: string; locale: string }) {
32+
+ const snapshot = await getPageSnapshot({ path, locale });
33+
+
34+
+ if (snapshot == null) {
35+
+ return null;
36+
+ }
37+
+
38+
+ const { meta } = snapshot.document;
39+
+
40+
+ return {
41+
+ ...(meta.title && { title: meta.title }),
42+
+ ...(meta.description && { description: meta.description }),
43+
+ };
44+
+ }
45+
```
46+
47+
Export the function from `core/lib/makeswift/index.ts`:
48+
49+
```diff
50+
export { Page } from './page';
51+
- export { client } from './client';
52+
+ export { client, getPageMetadata } from './client';
53+
```
54+
55+
### Step 2: Update page metadata
56+
57+
Each page's `generateMetadata` function has been updated to fetch Makeswift metadata and use it as the primary source, falling back to existing values. Here's an example using the cart page:
58+
59+
Update `core/app/[locale]/(default)/cart/page.tsx`:
60+
61+
```diff
62+
import { getPreferredCurrencyCode } from '~/lib/currency';
63+
+ import { getPageMetadata } from '~/lib/makeswift';
64+
import { Slot } from '~/lib/makeswift/slot';
65+
```
66+
67+
```diff
68+
export async function generateMetadata({ params }: Props): Promise<Metadata> {
69+
const { locale } = await params;
70+
71+
const t = await getTranslations({ locale, namespace: 'Cart' });
72+
+ const makeswiftMetadata = await getPageMetadata({ path: '/cart', locale });
73+
74+
return {
75+
- title: t('title'),
76+
+ title: makeswiftMetadata?.title || t('title'),
77+
+ description: makeswiftMetadata?.description || undefined,
78+
};
79+
}
80+
```
81+
82+
Apply the same pattern to the other pages listed above, using the appropriate path for each page (e.g., `/blog`, `/search`, `/compare`, etc.).

core/app/[locale]/(default)/(faceted)/brand/[slug]/page-data.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ const BrandPageQuery = graphql(`
99
site {
1010
brand(entityId: $entityId) {
1111
name
12+
path
1213
seo {
1314
pageTitle
1415
metaDescription

core/app/[locale]/(default)/(faceted)/brand/[slug]/page.tsx

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@ import { facetsTransformer } from '~/data-transformers/facets-transformer';
1313
import { pageInfoTransformer } from '~/data-transformers/page-info-transformer';
1414
import { productCardTransformer } from '~/data-transformers/product-card-transformer';
1515
import { getPreferredCurrencyCode } from '~/lib/currency';
16+
import { getPageMetadata } from '~/lib/makeswift';
1617

1718
import { MAX_COMPARE_LIMIT } from '../../../compare/page-data';
1819
import { getCompareProducts as getCompareProductsData } from '../../fetch-compare-products';
@@ -67,7 +68,7 @@ interface Props {
6768
}
6869

6970
export async function generateMetadata(props: Props): Promise<Metadata> {
70-
const { slug } = await props.params;
71+
const { slug, locale } = await props.params;
7172
const customerAccessToken = await getSessionCustomerAccessToken();
7273

7374
const brandId = Number(slug);
@@ -78,11 +79,13 @@ export async function generateMetadata(props: Props): Promise<Metadata> {
7879
return notFound();
7980
}
8081

82+
const makeswiftMetadata = await getPageMetadata({ path: brand.path, locale });
83+
8184
const { pageTitle, metaDescription, metaKeywords } = brand.seo;
8285

8386
return {
84-
title: pageTitle || brand.name,
85-
description: metaDescription,
87+
title: makeswiftMetadata?.title || pageTitle || brand.name,
88+
description: makeswiftMetadata?.description || metaDescription,
8689
keywords: metaKeywords ? metaKeywords.split(',') : null,
8790
};
8891
}

core/app/[locale]/(default)/(faceted)/category/[slug]/page-data.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ const CategoryPageQuery = graphql(
1212
category(entityId: $entityId) {
1313
entityId
1414
name
15+
path
1516
...BreadcrumbsFragment
1617
seo {
1718
pageTitle

core/app/[locale]/(default)/(faceted)/category/[slug]/page.tsx

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@ import { facetsTransformer } from '~/data-transformers/facets-transformer';
1414
import { pageInfoTransformer } from '~/data-transformers/page-info-transformer';
1515
import { productCardTransformer } from '~/data-transformers/product-card-transformer';
1616
import { getPreferredCurrencyCode } from '~/lib/currency';
17+
import { getPageMetadata } from '~/lib/makeswift';
1718
import { Slot } from '~/lib/makeswift/slot';
1819

1920
import { MAX_COMPARE_LIMIT } from '../../../compare/page-data';
@@ -70,7 +71,7 @@ interface Props {
7071
}
7172

7273
export async function generateMetadata(props: Props): Promise<Metadata> {
73-
const { slug } = await props.params;
74+
const { slug, locale } = await props.params;
7475
const customerAccessToken = await getSessionCustomerAccessToken();
7576

7677
const categoryId = Number(slug);
@@ -81,11 +82,13 @@ export async function generateMetadata(props: Props): Promise<Metadata> {
8182
return notFound();
8283
}
8384

85+
const makeswiftMetadata = await getPageMetadata({ path: category.path, locale });
86+
8487
const { pageTitle, metaDescription, metaKeywords } = category.seo;
8588

8689
return {
87-
title: pageTitle || category.name,
88-
description: metaDescription,
90+
title: makeswiftMetadata?.title || pageTitle || category.name,
91+
description: makeswiftMetadata?.description || metaDescription,
8992
keywords: metaKeywords ? metaKeywords.split(',') : null,
9093
};
9194
}

core/app/[locale]/(default)/(faceted)/search/page.tsx

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ import { facetsTransformer } from '~/data-transformers/facets-transformer';
1212
import { pageInfoTransformer } from '~/data-transformers/page-info-transformer';
1313
import { productCardTransformer } from '~/data-transformers/product-card-transformer';
1414
import { getPreferredCurrencyCode } from '~/lib/currency';
15+
import { getPageMetadata } from '~/lib/makeswift';
1516

1617
import { MAX_COMPARE_LIMIT } from '../../compare/page-data';
1718
import { getCompareProducts as getCompareProductsData } from '../fetch-compare-products';
@@ -63,9 +64,11 @@ export async function generateMetadata({ params }: Props): Promise<Metadata> {
6364
const { locale } = await params;
6465

6566
const t = await getTranslations({ locale, namespace: 'Faceted.Search' });
67+
const makeswiftMetadata = await getPageMetadata({ path: '/search', locale });
6668

6769
return {
68-
title: t('title'),
70+
title: makeswiftMetadata?.title || t('title'),
71+
description: makeswiftMetadata?.description || undefined,
6972
};
7073
}
7174

core/app/[locale]/(default)/[...rest]/page.tsx

Lines changed: 15 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,25 @@
1+
import { Metadata } from 'next';
2+
13
import { defaultLocale, locales } from '~/i18n/locales';
2-
import { client, Page } from '~/lib/makeswift';
4+
import { client, getPageMetadata, Page } from '~/lib/makeswift';
35

46
interface PageParams {
57
locale: string;
68
rest: string[];
79
}
810

11+
export async function generateMetadata({
12+
params,
13+
}: {
14+
params: Promise<PageParams>;
15+
}): Promise<Metadata> {
16+
const { rest, locale } = await params;
17+
const path = `/${rest.join('/')}`;
18+
const metadata = await getPageMetadata({ path, locale });
19+
20+
return metadata ?? {};
21+
}
22+
923
export async function generateStaticParams(): Promise<PageParams[]> {
1024
const pages = await client.getPages().toArray();
1125

core/app/[locale]/(default)/blog/[blogId]/page-data.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@ const BlogPageQuery = graphql(`
1515
author
1616
htmlBody
1717
name
18+
path
1819
publishedDate {
1920
utc
2021
}

core/app/[locale]/(default)/blog/[blogId]/page.tsx

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ import { cache } from 'react';
55

66
import { BlogPostContent, BlogPostContentBlogPost } from '@/vibes/soul/sections/blog-post-content';
77
import { Breadcrumb } from '@/vibes/soul/sections/breadcrumbs';
8+
import { getPageMetadata } from '~/lib/makeswift';
89

910
import { getBlogPageData } from './page-data';
1011

@@ -18,7 +19,7 @@ interface Props {
1819
}
1920

2021
export async function generateMetadata({ params }: Props): Promise<Metadata> {
21-
const { blogId } = await params;
22+
const { blogId, locale } = await params;
2223

2324
const variables = cachedBlogPageDataVariables(blogId);
2425

@@ -29,11 +30,12 @@ export async function generateMetadata({ params }: Props): Promise<Metadata> {
2930
return {};
3031
}
3132

33+
const makeswiftMetadata = await getPageMetadata({ path: blogPost.path, locale });
3234
const { pageTitle, metaDescription, metaKeywords } = blogPost.seo;
3335

3436
return {
35-
title: pageTitle || blogPost.name,
36-
description: metaDescription,
37+
title: makeswiftMetadata?.title || pageTitle || blogPost.name,
38+
description: makeswiftMetadata?.description || metaDescription,
3739
keywords: metaKeywords ? metaKeywords.split(',') : null,
3840
};
3941
}

core/app/[locale]/(default)/blog/page.tsx

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ import { createSearchParamsCache, parseAsInteger, parseAsString } from 'nuqs/ser
77
import { Streamable } from '@/vibes/soul/lib/streamable';
88
import { FeaturedBlogPostList } from '@/vibes/soul/sections/featured-blog-post-list';
99
import { defaultPageInfo, pageInfoTransformer } from '~/data-transformers/page-info-transformer';
10+
import { getPageMetadata } from '~/lib/makeswift';
1011

1112
import { getBlog, getBlogPosts } from './page-data';
1213

@@ -29,13 +30,15 @@ export async function generateMetadata({ params }: Props): Promise<Metadata> {
2930

3031
const t = await getTranslations({ locale, namespace: 'Blog' });
3132
const blog = await getBlog();
33+
const makeswiftMetadata = await getPageMetadata({ path: '/blog', locale });
3234

3335
return {
34-
title: blog?.name ?? t('title'),
36+
title: makeswiftMetadata?.title || blog?.name || t('title'),
3537
description:
36-
blog?.description && blog.description.length > 150
38+
makeswiftMetadata?.description ||
39+
(blog?.description && blog.description.length > 150
3740
? `${blog.description.substring(0, 150)}...`
38-
: blog?.description,
41+
: blog?.description),
3942
};
4043
}
4144

0 commit comments

Comments
 (0)