4
0
forked from crowetic/commerce

Adds sitemap. (#982)

This commit is contained in:
Michael Novotny 2023-04-23 13:55:25 -05:00 committed by GitHub
parent ee900a48e8
commit a53ee3e3a0
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
6 changed files with 82 additions and 15 deletions

33
app/sitemap.ts Normal file
View File

@ -0,0 +1,33 @@
import { getCollections, getPages, getProducts } from 'lib/shopify';
import { MetadataRoute } from 'next';
const baseUrl = process.env.NEXT_PUBLIC_VERCEL_URL
? `https://${process.env.NEXT_PUBLIC_VERCEL_URL}`
: 'http://localhost:3000';
export default async function sitemap(): Promise<Promise<Promise<MetadataRoute.Sitemap>>> {
const routesMap = ['', '/search'].map((route) => ({
url: `${baseUrl}${route}`,
lastModified: new Date().toISOString()
}));
const collections = await getCollections();
const collectionsMap = collections.map((collection) => ({
url: `${baseUrl}${collection.path}`,
lastModified: collection.updatedAt
}));
const products = await getProducts({});
const productsMap = products.map((product) => ({
url: `${baseUrl}/product/${product.handle}`,
lastModified: product.updatedAt
}));
const pages = await getPages();
const pagesMap = pages.map((page) => ({
url: `${baseUrl}/${page.handle}`,
lastModified: page.updatedAt
}));
return [...routesMap, ...collectionsMap, ...productsMap, ...pagesMap];
}

View File

@ -55,6 +55,7 @@ const productFragment = /* GraphQL */ `
...seo ...seo
} }
tags tags
updatedAt
} }
${imageFragment} ${imageFragment}
${seoFragment} ${seoFragment}

View File

@ -13,7 +13,7 @@ import {
getCollectionsQuery getCollectionsQuery
} from './queries/collection'; } from './queries/collection';
import { getMenuQuery } from './queries/menu'; import { getMenuQuery } from './queries/menu';
import { getPageQuery } from './queries/page'; import { getPageQuery, getPagesQuery } from './queries/page';
import { import {
getProductQuery, getProductQuery,
getProductRecommendationsQuery, getProductRecommendationsQuery,
@ -36,6 +36,7 @@ import {
ShopifyCreateCartOperation, ShopifyCreateCartOperation,
ShopifyMenuOperation, ShopifyMenuOperation,
ShopifyPageOperation, ShopifyPageOperation,
ShopifyPagesOperation,
ShopifyProduct, ShopifyProduct,
ShopifyProductOperation, ShopifyProductOperation,
ShopifyProductRecommendationsOperation, ShopifyProductRecommendationsOperation,
@ -279,7 +280,8 @@ export async function getCollections(): Promise<Collection[]> {
title: 'All', title: 'All',
description: 'All products' description: 'All products'
}, },
path: '/search' path: '/search',
updatedAt: new Date().toISOString()
}, },
// Filter out the `hidden` collections. // Filter out the `hidden` collections.
// Collections that start with `hidden-*` need to be hidden on the search page. // Collections that start with `hidden-*` need to be hidden on the search page.
@ -316,6 +318,14 @@ export async function getPage(handle: string): Promise<Page> {
return res.body.data.pageByHandle; return res.body.data.pageByHandle;
} }
export async function getPages(): Promise<Page[]> {
const res = await shopifyFetch<ShopifyPagesOperation>({
query: getPagesQuery
});
return removeEdgesAndNodes(res.body.data.pages);
}
export async function getProduct(handle: string): Promise<Product | undefined> { export async function getProduct(handle: string): Promise<Product | undefined> {
const res = await shopifyFetch<ShopifyProductOperation>({ const res = await shopifyFetch<ShopifyProductOperation>({
query: getProductQuery, query: getProductQuery,

View File

@ -9,6 +9,7 @@ const collectionFragment = /* GraphQL */ `
seo { seo {
...seo ...seo
} }
updatedAt
} }
${seoFragment} ${seoFragment}
`; `;

View File

@ -1,21 +1,41 @@
import seoFragment from '../fragments/seo'; import seoFragment from '../fragments/seo';
export const getPageQuery = /* GraphQL */ ` const pageFragment = /* GraphQL */ `
query getPage($handle: String!) { fragment page on Page {
pageByHandle(handle: $handle) { ... on Page {
id id
... on Page { title
title handle
handle body
body bodySummary
bodySummary seo {
seo { ...seo
...seo
}
createdAt
updatedAt
} }
createdAt
updatedAt
} }
} }
${seoFragment} ${seoFragment}
`; `;
export const getPageQuery = /* GraphQL */ `
query getPage($handle: String!) {
pageByHandle(handle: $handle) {
...page
}
}
${pageFragment}
`;
export const getPagesQuery = /* GraphQL */ `
query getPages {
pages(first: 100) {
edges {
node {
...page
}
}
}
}
${pageFragment}
`;

View File

@ -105,6 +105,7 @@ export type ShopifyCollection = {
title: string; title: string;
description: string; description: string;
seo: SEO; seo: SEO;
updatedAt: string;
}; };
export type ShopifyProduct = { export type ShopifyProduct = {
@ -124,6 +125,7 @@ export type ShopifyProduct = {
images: Connection<Image>; images: Connection<Image>;
seo: SEO; seo: SEO;
tags: string[]; tags: string[];
updatedAt: string;
}; };
export type ShopifyCartOperation = { export type ShopifyCartOperation = {