diff --git a/website/app.js b/website/app.js index 0ff482f1..e8192e1d 100644 --- a/website/app.js +++ b/website/app.js @@ -67,6 +67,7 @@ function createAposConfig() { }, // Enable local SEO module with GTM integration '@apostrophecms/seo': {}, + '@apostrophecms/sitemap': {}, '@apostrophecms/global': {}, // Make getEnv function available to templates '@apostrophecms/template': { @@ -79,6 +80,7 @@ function createAposConfig() { // Add global data module 'global-data': {}, + 'robots': {}, // Shared constants module '@apostrophecms/shared-constants': {}, diff --git a/website/modules/@apostrophecms/sitemap/index.js b/website/modules/@apostrophecms/sitemap/index.js new file mode 100644 index 00000000..b3eaa530 --- /dev/null +++ b/website/modules/@apostrophecms/sitemap/index.js @@ -0,0 +1,5 @@ +module.exports = { + options: { + cacheLifetime: 60 * 60, + }, +}; diff --git a/website/modules/case-studies-page/index.js b/website/modules/case-studies-page/index.js index 1758a6ae..350d344d 100644 --- a/website/modules/case-studies-page/index.js +++ b/website/modules/case-studies-page/index.js @@ -165,6 +165,36 @@ const runSetupIndexData = async function (self, req) { } }; +const buildIndexSeoData = function (req) { + const query = req.query || {}; + const hasFilterParams = + Boolean(query.search) || + Boolean(query.industry) || + Boolean(query.stack) || + Boolean(query.caseStudyType) || + Boolean(query.partner); + const pageNumber = Number(query.page || 1); + const hasPaginationParam = Number.isFinite(pageNumber) && pageNumber > 1; + const shouldNoindex = hasFilterParams || hasPaginationParam; + let pageUrl = '/cases'; + if (req.data && req.data.page && req.data.page.slug) { + pageUrl = req.data.page.slug; + } + let robots = 'index,follow'; + if (shouldNoindex) { + robots = 'noindex,follow'; + } + return { + canonicalUrl: pageUrl, + robots, + }; +}; + +const runSetupIndexSeoData = function (req) { + req.data ||= {}; + req.data.caseListingSeo = buildIndexSeoData(req); +}; + const runSetupShowData = async function (self, req) { try { const navigation = await NavigationService.getNavigationDataForPage( @@ -219,6 +249,7 @@ module.exports = { await self.resolveSearchRelationships(req); await self.applyEnhancedSearchResults(req); await self.setupIndexData(req); + self.setupIndexSeoData(req); }; const superBeforeShow = self.beforeShow; @@ -244,6 +275,9 @@ module.exports = { setupIndexData(req) { return runSetupIndexData(self, req); }, + setupIndexSeoData(req) { + return runSetupIndexSeoData(req); + }, setupShowData(req) { return runSetupShowData(self, req); }, diff --git a/website/modules/case-studies-page/services/UrlService.js b/website/modules/case-studies-page/services/UrlService.js index f18963a9..f4b15c96 100644 --- a/website/modules/case-studies-page/services/UrlService.js +++ b/website/modules/case-studies-page/services/UrlService.js @@ -153,6 +153,7 @@ class UrlService { reqCopy.data.backUrl = UrlService.buildCaseStudyUrl('/cases', queryParams); reqCopy.data.query = queryParams; + reqCopy.data.hasQueryParams = Object.keys(req.query || {}).length > 0; } } diff --git a/website/modules/case-studies-page/views/index.html b/website/modules/case-studies-page/views/index.html index 9680b986..663a9098 100644 --- a/website/modules/case-studies-page/views/index.html +++ b/website/modules/case-studies-page/views/index.html @@ -1,6 +1,11 @@ {# modules/case-studies-page/views/index.html #} {% extends "layout.html" %} {% import '@apostrophecms/pager:macros.html' as pager with context %} +{% block extraHead %} + {{ super() }} + + +{% endblock %} {% block main %}
+ +{% endblock %} +{% block main %}