contentful-sitemap v1.0.20
đź—ş contentful-sitemap
Dynamically generate an array of valid sitemap routes to enable building a live sitemap based on Contentful content via the Contentful API.
Install
Via npm
npm install contentful-sitemapVia Yarn
yarn add contentful-sitemapHow to use
contentful-sitemap requires a Contentful client in order to fetch entries from
your Contenful space in order to build your dynamic sitemap entries. So, make sure
you have contentful as a dependency in your project.
Install contentful
npm i -S contentfulCreate Contentful client
const contentful = require('contentful');
const { ContentfulSitemap } = require('contentful-sitemap');
const client = contentful.createClient({
accessToken: '[ACCESS_TOKEN]',
space: '[SPACE_ID]',
});Next comes setting up the ContentfulSitemap instance that will be used by your
/sitemap.xml route to generate and return the sitemap. ContentfulSitemap requires
a client instance, so make sure you pass one into the constructor.
Create ContentfulSitemap instance
const sitemapGenerator = new ContentfulSitemap(client, [routes], {options});Parameters
client- Contentful client that will be used for fetching locales and entries from Contentful.routes- Array of route definitions to use to generate sitemap.options- Options that you can use to customize how sitemaps are generated.
Routes
contentful-sitemap generates a route array that is compatible with the
sitemap package for generating your
sitemap.xml file, so all route options supported by that package are
also supported within the routes array you pass in. You can pass in both
static and dynamic Contentful routes within the array. Below are the few
specifics that directly relate to how contentful-sitemap will process
your routes entries.
| Name | Default | Description |
|---|---|---|
url | null | Use this property if the path you are providing does not require any segments to be swapped out dynamically. |
id | null | Contentful entry id to fetch for the specific path. Only used if the dynamicLastmod option is set to true. |
pattern | null | path-to-regexp pattern to use for generating dynamic listings based on Contentful content or setting locale specific paths. |
priority | 1 | Default priority to set for each url. Set to 1 as a default so it can be excluded in your routes definitions. |
params | null | Object used to specify the mapping of pattern parameter to Contentful response data. |
query | null | Query used by the Contentful client for fetching entries. All contentful getEntries query options are supported. |
Default Options
The following options can be used to customize the way your sitemap is generated.
The one option that you’ll definitely want to set, if not defined in your routes
is the origin option, which is prefixed before the urls and patterns defined
in your routes.
| Name | Default | Description |
|---|---|---|
locales | [] | Array of locales to include for all route instances, if not using dynamicLocales. |
dynamicLocales | false | Whether or not to fetch the list of enabled locales from Contentful. |
dynamicLastmod | false | Automatically use the lastmodParam value of each entry to set the lastmod value. |
lastmodParam | sys.updatedAt | Contentful model field to use when populating lastmodISO in route(s). |
localeParam | locale | The param to set within your pattern to replace with a locale. |
defaultLocale | null | The default locale that will be used in the main loc value for a url. |
Methods
addRoute(route)- Method to use for adding additional urls after the initialContentfulSitemapinstance has been created.buildRoutes()- The magic✨ Call this method when you want to generate your Contentful routes to be passed tositemap.toXML((xml, err) => {})- DEPRECATED - This was the previous method that this class used to build and return the fullsitemap.xmlstring, but due to changes made to thesitemappackage it seemed like it would be easier to support the current—and future—versions of that package by simplifying this package to do one thing well, while offering more flexibility with how you would like to usesitemapto generate your sitemap(s).
Example
const express = require('express');
const contentful = require('contentful');
const { SitemapStream, streamToPromise } = require('sitemap');
const { createGzip } = require('zlib');
const { ContentfulSitemap } = require('contentful-sitemap');
const app = express();
const client = contentful.createClient({
accessToken: '[ACCESS_TOKEN]',
space: '[SPACE_ID]',
});
const sitemapGenerator = new ContentfulSitemap(client, [
{
pattern: '/',
id: '[HOME_PAGE_ID]',
},
{
pattern: '/about',
id: '[ABOUT_PAGE_ID]',
priority: 0.7,
},
{
pattern: '/news',
id: '[NEWS_PAGE_ID]',
},
{
pattern: '/news/:slug',
priority: 0.5,
query: {
content_type: '[CONTENTFUL_MODEL_TYPE (e.g. `newsArticlePage`)]',
select: 'fields.slug',
},
params: {
slug: 'fields.slug',
},
},
{
url: '/terms',
priority: 0.3,
},
{
url: '/privacy',
priority: 0.3,
}
]);
let sitemap;
app.get('/sitemap.xml', (req, res) => {
res.header('Content-Type', 'application/xml');
res.header('Content-Encoding', 'gzip');
if (sitemap) {
return res.send(sitemap);
}
try {
const smStream = new SitemapStream({ hostname: 'https://example.com/' });
const pipeline = smStream.pipe(createGzip());
return sitemapGenerator.buildRoutes()
.then(routes => {
// pipe your entries or directly write them.
routes.forEach(route => smStream.write(route));
smStream.end()
// cache the response
streamToPromise(pipeline).then(sm => sitemap = sm)
// stream write the response
pipeline.pipe(res).on('error', (e) => {throw e})
})
.catch(error => {
console.error(error);
res.status(500).end();
});
} catch (e) {
console.error(e)
res.status(500).end()
}
});
...License
MIT © Ryan Hefner
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
7 years ago
7 years ago
7 years ago
7 years ago
7 years ago
7 years ago