Skip to content

Commit cacf523

Browse files
authored
fix(templates): encoding and decoding slugs in website template (#14216)
Fixes an issue where if your slugs are using special characters such as Thai "" then it won't correctly encode or decode the slugs from params Fixes #14177
1 parent 623a1b8 commit cacf523

File tree

3 files changed

+19
-9
lines changed

3 files changed

+19
-9
lines changed

templates/website/src/app/(frontend)/[slug]/page.tsx

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -46,12 +46,13 @@ type Args = {
4646
export default async function Page({ params: paramsPromise }: Args) {
4747
const { isEnabled: draft } = await draftMode()
4848
const { slug = 'home' } = await paramsPromise
49-
const url = '/' + slug
50-
49+
// Decode to support slugs with special characters
50+
const decodedSlug = decodeURIComponent(slug)
51+
const url = '/' + decodedSlug
5152
let page: RequiredDataFromCollectionSlug<'pages'> | null
5253

5354
page = await queryPageBySlug({
54-
slug,
55+
slug: decodedSlug,
5556
})
5657

5758
// Remove this code once your website is seeded
@@ -81,8 +82,10 @@ export default async function Page({ params: paramsPromise }: Args) {
8182

8283
export async function generateMetadata({ params: paramsPromise }: Args): Promise<Metadata> {
8384
const { slug = 'home' } = await paramsPromise
85+
// Decode to support slugs with special characters
86+
const decodedSlug = decodeURIComponent(slug)
8487
const page = await queryPageBySlug({
85-
slug,
88+
slug: decodedSlug,
8689
})
8790

8891
return generateMeta({ doc: page })

templates/website/src/app/(frontend)/posts/[slug]/page.tsx

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -44,8 +44,10 @@ type Args = {
4444
export default async function Post({ params: paramsPromise }: Args) {
4545
const { isEnabled: draft } = await draftMode()
4646
const { slug = '' } = await paramsPromise
47-
const url = '/posts/' + slug
48-
const post = await queryPostBySlug({ slug })
47+
// Decode to support slugs with special characters
48+
const decodedSlug = decodeURIComponent(slug)
49+
const url = '/posts/' + decodedSlug
50+
const post = await queryPostBySlug({ slug: decodedSlug })
4951

5052
if (!post) return <PayloadRedirects url={url} />
5153

@@ -77,7 +79,9 @@ export default async function Post({ params: paramsPromise }: Args) {
7779

7880
export async function generateMetadata({ params: paramsPromise }: Args): Promise<Metadata> {
7981
const { slug = '' } = await paramsPromise
80-
const post = await queryPostBySlug({ slug })
82+
// Decode to support slugs with special characters
83+
const decodedSlug = decodeURIComponent(slug)
84+
const post = await queryPostBySlug({ slug: decodedSlug })
8185

8286
return generateMeta({ doc: post })
8387
}

templates/website/src/utilities/generatePreviewPath.ts

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -17,10 +17,13 @@ export const generatePreviewPath = ({ collection, slug }: Props) => {
1717
return null
1818
}
1919

20+
// Encode to support slugs with special characters
21+
const encodedSlug = encodeURIComponent(slug)
22+
2023
const encodedParams = new URLSearchParams({
21-
slug,
24+
slug: encodedSlug,
2225
collection,
23-
path: `${collectionPrefixMap[collection]}/${slug}`,
26+
path: `${collectionPrefixMap[collection]}/${encodedSlug}`,
2427
previewSecret: process.env.PREVIEW_SECRET || '',
2528
})
2629

0 commit comments

Comments
 (0)