forked from crowetic/commerce
Adds sitemap. (#982)
This commit is contained in:
parent
ee900a48e8
commit
a53ee3e3a0
33
app/sitemap.ts
Normal file
33
app/sitemap.ts
Normal 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];
|
||||||
|
}
|
@ -55,6 +55,7 @@ const productFragment = /* GraphQL */ `
|
|||||||
...seo
|
...seo
|
||||||
}
|
}
|
||||||
tags
|
tags
|
||||||
|
updatedAt
|
||||||
}
|
}
|
||||||
${imageFragment}
|
${imageFragment}
|
||||||
${seoFragment}
|
${seoFragment}
|
||||||
|
@ -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,
|
||||||
|
@ -9,6 +9,7 @@ const collectionFragment = /* GraphQL */ `
|
|||||||
seo {
|
seo {
|
||||||
...seo
|
...seo
|
||||||
}
|
}
|
||||||
|
updatedAt
|
||||||
}
|
}
|
||||||
${seoFragment}
|
${seoFragment}
|
||||||
`;
|
`;
|
||||||
|
@ -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}
|
||||||
|
`;
|
||||||
|
@ -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 = {
|
||||||
|
Loading…
x
Reference in New Issue
Block a user