CINXE.COM
On-Demand ISR Support for Next.js/Faust.js on WP engine’s headless WordPress Platform - Builders
<!DOCTYPE html> <html lang="en-US"> <head> <meta charset="UTF-8" /> <meta name="viewport" content="width=device-width, initial-scale=1" /> <meta name='robots' content='index, follow, max-image-preview:large, max-snippet:-1, max-video-preview:-1' /> <!-- This site is optimized with the Yoast SEO plugin v24.5 - https://yoast.com/wordpress/plugins/seo/ --> <meta name="description" content="On-Demand ISR is now supported in your headless WordPress setup with Next.js and Faust.js on WP engine. Learn how to ensure your content is fresh and revalidated on-demand with our in-depth guide on how to set it all up." /> <link rel="canonical" href="https://wpengine.com/builders/on-demand-isr-support-for-next-js-faust-js-on-wp-engines-headless-wordpress-platform/" /> <meta property="og:locale" content="en_US" /> <meta property="og:type" content="article" /> <meta property="og:title" content="On-Demand ISR with Next.js & Faust.js on WP Engine’s Headless WordPress Platform" /> <meta property="og:description" content="On-Demand ISR is now supported in your headless WordPress setup with Next.js and Faust.js on WP engine. Learn how to ensure your content is fresh and revalidated on-demand with our in-depth guide on how to set it all up." /> <meta property="og:url" content="https://wpengine.com/builders/on-demand-isr-support-for-next-js-faust-js-on-wp-engines-headless-wordpress-platform/" /> <meta property="og:site_name" content="Builders" /> <meta property="article:published_time" content="2024-08-12T13:19:12+00:00" /> <meta property="article:modified_time" content="2024-08-27T13:25:53+00:00" /> <meta property="og:image" content="https://wpengine.com/builders/wp-content/uploads/2024/08/WPE-Builders-YouTube-ScreenshotNavy-1920x1080@2x-2.png" /> <meta property="og:image:width" content="3796" /> <meta property="og:image:height" content="2136" /> <meta property="og:image:type" content="image/png" /> <meta name="author" content="Francis Agulto" /> <meta name="twitter:card" content="summary_large_image" /> <meta name="twitter:creator" content="@wpebuilders" /> <meta name="twitter:site" content="@wpebuilders" /> <meta name="twitter:label1" content="Written by" /> <meta name="twitter:data1" content="Francis Agulto" /> <meta name="twitter:label2" content="Est. reading time" /> <meta name="twitter:data2" content="10 minutes" /> <script type="application/ld+json" class="yoast-schema-graph">{"@context":"https://schema.org","@graph":[{"@type":"Article","@id":"https://wpengine.com/builders/on-demand-isr-support-for-next-js-faust-js-on-wp-engines-headless-wordpress-platform/#article","isPartOf":{"@id":"https://wpengine.com/builders/on-demand-isr-support-for-next-js-faust-js-on-wp-engines-headless-wordpress-platform/"},"author":{"name":"Francis Agulto","@id":"https://wpengine.com/builders/#/schema/person/bcdcb4ac0b215c34b6b30e440a24dc54"},"headline":"On-Demand ISR Support for Next.js/Faust.js on WP engine’s headless WordPress Platform","datePublished":"2024-08-12T13:19:12+00:00","dateModified":"2024-08-27T13:25:53+00:00","mainEntityOfPage":{"@id":"https://wpengine.com/builders/on-demand-isr-support-for-next-js-faust-js-on-wp-engines-headless-wordpress-platform/"},"wordCount":1992,"commentCount":0,"publisher":{"@id":"https://wpengine.com/builders/#organization"},"image":{"@id":"https://wpengine.com/builders/on-demand-isr-support-for-next-js-faust-js-on-wp-engines-headless-wordpress-platform/#primaryimage"},"thumbnailUrl":"https://wpengine.com/builders/wp-content/uploads/2024/08/ODISR.gif","articleSection":["Headless"],"inLanguage":"en-US","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https://wpengine.com/builders/on-demand-isr-support-for-next-js-faust-js-on-wp-engines-headless-wordpress-platform/#respond"]}]},{"@type":"WebPage","@id":"https://wpengine.com/builders/on-demand-isr-support-for-next-js-faust-js-on-wp-engines-headless-wordpress-platform/","url":"https://wpengine.com/builders/on-demand-isr-support-for-next-js-faust-js-on-wp-engines-headless-wordpress-platform/","name":"On-Demand ISR Support for Next.js/Faust.js on WP engine’s headless WordPress Platform - Builders","isPartOf":{"@id":"https://wpengine.com/builders/#website"},"primaryImageOfPage":{"@id":"https://wpengine.com/builders/on-demand-isr-support-for-next-js-faust-js-on-wp-engines-headless-wordpress-platform/#primaryimage"},"image":{"@id":"https://wpengine.com/builders/on-demand-isr-support-for-next-js-faust-js-on-wp-engines-headless-wordpress-platform/#primaryimage"},"thumbnailUrl":"https://wpengine.com/builders/wp-content/uploads/2024/08/ODISR.gif","datePublished":"2024-08-12T13:19:12+00:00","dateModified":"2024-08-27T13:25:53+00:00","description":"On-Demand ISR is now supported in your headless WordPress setup with Next.js and Faust.js on WP engine. Learn how to ensure your content is fresh and revalidated on-demand with our in-depth guide on how to set it all up.","breadcrumb":{"@id":"https://wpengine.com/builders/on-demand-isr-support-for-next-js-faust-js-on-wp-engines-headless-wordpress-platform/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https://wpengine.com/builders/on-demand-isr-support-for-next-js-faust-js-on-wp-engines-headless-wordpress-platform/"]}]},{"@type":"ImageObject","inLanguage":"en-US","@id":"https://wpengine.com/builders/on-demand-isr-support-for-next-js-faust-js-on-wp-engines-headless-wordpress-platform/#primaryimage","url":"https://wpengine.com/builders/wp-content/uploads/2024/08/ODISR.gif","contentUrl":"https://wpengine.com/builders/wp-content/uploads/2024/08/ODISR.gif","width":1920,"height":1080},{"@type":"BreadcrumbList","@id":"https://wpengine.com/builders/on-demand-isr-support-for-next-js-faust-js-on-wp-engines-headless-wordpress-platform/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https://wpengine.com/builders/"},{"@type":"ListItem","position":2,"name":"On-Demand ISR Support for Next.js/Faust.js on WP engine’s headless WordPress Platform"}]},{"@type":"WebSite","@id":"https://wpengine.com/builders/#website","url":"https://wpengine.com/builders/","name":"Builders","description":"Reimagining the way we build with WordPress.","publisher":{"@id":"https://wpengine.com/builders/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https://wpengine.com/builders/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-US"},{"@type":"Organization","@id":"https://wpengine.com/builders/#organization","name":"WP Engine","url":"https://wpengine.com/builders/","logo":{"@type":"ImageObject","inLanguage":"en-US","@id":"https://wpengine.com/builders/#/schema/logo/image/","url":"https://wpengine.com/builders/wp-content/uploads/2024/05/WP-Engine-Horizontal@2x.png","contentUrl":"https://wpengine.com/builders/wp-content/uploads/2024/05/WP-Engine-Horizontal@2x.png","width":348,"height":68,"caption":"WP Engine"},"image":{"@id":"https://wpengine.com/builders/#/schema/logo/image/"},"sameAs":["https://x.com/wpebuilders","https://www.youtube.com/channel/UCh1WuL54XFb9ZI6m6goFv1g"]},{"@type":"Person","@id":"https://wpengine.com/builders/#/schema/person/bcdcb4ac0b215c34b6b30e440a24dc54","name":"Francis Agulto","image":{"@type":"ImageObject","inLanguage":"en-US","@id":"https://wpengine.com/builders/#/schema/person/image/","url":"https://secure.gravatar.com/avatar/c24a68b84c9ad2b53c633d14917d8298?s=96&d=mm&r=g","contentUrl":"https://secure.gravatar.com/avatar/c24a68b84c9ad2b53c633d14917d8298?s=96&d=mm&r=g","caption":"Francis Agulto"},"description":"Fran Agulto is a Developer Advocate at WP Engine. He is a lover of all things headless WordPress, Rock Climbing, and overall being stoked for people that love what they do and share that stoke with others! Follow me on Twitter for cool stoked headless WP!","url":"https://wpengine.com/builders/author/francis-agultowpengine-com/"}]}</script> <!-- / Yoast SEO plugin. --> <title>On-Demand ISR Support for Next.js/Faust.js on WP engine’s headless WordPress Platform - Builders</title> <link rel='dns-prefetch' href='//wpengine.com' /> <link rel="alternate" type="application/rss+xml" title="Builders » Feed" href="https://wpengine.com/builders/feed/" /> <link rel="alternate" type="application/rss+xml" title="Builders » Comments Feed" href="https://wpengine.com/builders/comments/feed/" /> <link rel="alternate" type="text/calendar" title="Builders » iCal Feed" href="https://wpengine.com/builders/events/?ical=1" /> <link rel="alternate" type="application/rss+xml" title="Builders » On-Demand ISR Support for Next.js/Faust.js on WP engine’s headless WordPress Platform Comments Feed" href="https://wpengine.com/builders/on-demand-isr-support-for-next-js-faust-js-on-wp-engines-headless-wordpress-platform/feed/" /> <style id='wpe-site-search-style-inline-css'> body{--wpe-z-site-search-overlay:var(--z-site-search-overlay,98);--wpe-z-site-search-toggle:var(--z-site-search-toggle,99);--wpe-site-search-icon-color:var(--wp--preset--color--mirage,var(--wp--preset--color--foreground));--wpe-site-search-overlay-background-color:var(--wp--preset--color--base,var(--wp--preset--color--background))}.wpe-site-search-header>.wp-block-group>.wp-block-group{position:relative}.wpe-site-search{display:flex}.wpe-site-search__toggle{-webkit-appearance:none;-moz-appearance:none;appearance:none;background-color:transparent;border:none;color:var(--wpe-site-search-icon-color);cursor:pointer;padding:4px}.wpe-site-search__toggle[aria-expanded=true]{z-index:var(--wpe-z-site-search-toggle)}.wpe-site-search__toggle[aria-expanded=false] .wpe-site-search__icon-close,.wpe-site-search__toggle[aria-expanded=true] .wpe-site-search__icon-open{display:none}.wpe-site-search__toggle[aria-expanded=false] .wpe-site-search__icon-open,.wpe-site-search__toggle[aria-expanded=true] .wpe-site-search__icon-close{display:block}.wpe-site-search-overlay{background-color:var(--wpe-site-search-overlay-background-color);bottom:0;height:100%;left:0;position:absolute;right:0;top:0;transform-origin:right top;transition:opacity .15s ease-in-out;z-index:var(--wpe-z-site-search-overlay)}.wpe-site-search-overlay[aria-hidden=false]{opacity:1;visibility:visible}.wpe-site-search-overlay[aria-hidden=true]{opacity:0;visibility:hidden}.wpe-site-search__icon{pointer-events:none}.wpe-site-search-form{align-items:center;display:flex;height:100%;width:calc(100% - 46px)}.wpe-site-search-label{flex:1}input[type=submit].wpe-site-search-form-submit{padding-bottom:19px;padding-top:19px}.wpe-site-search-overlay[aria-hidden=true] .wpe-site-search-form-submit{display:none}.wpe-site-search-overlay[aria-hidden=false] .wpe-site-search-form-submit{display:block}@media screen and (max-width:460px){input[type=submit].wpe-site-search-form-submit{padding-left:16px;padding-right:16px}.wpe-site-search-form{width:calc(100% - 36px)}} </style> <style id='outermost-icon-block-style-inline-css'> .wp-block-outermost-icon-block{display:flex;line-height:0}.wp-block-outermost-icon-block.has-border-color{border:none}.wp-block-outermost-icon-block .has-icon-color svg,.wp-block-outermost-icon-block.has-icon-color svg{color:currentColor}.wp-block-outermost-icon-block .has-icon-color:not(.has-no-icon-fill-color) svg,.wp-block-outermost-icon-block.has-icon-color:not(.has-no-icon-fill-color) svg{fill:currentColor}.wp-block-outermost-icon-block .icon-container{box-sizing:border-box}.wp-block-outermost-icon-block a,.wp-block-outermost-icon-block svg{height:100%;transition:transform .1s ease-in-out;width:100%}.wp-block-outermost-icon-block a:hover{transform:scale(1.1)}.wp-block-outermost-icon-block svg{transform:rotate(var(--outermost--icon-block--transform-rotate,0deg)) scaleX(var(--outermost--icon-block--transform-scale-x,1)) scaleY(var(--outermost--icon-block--transform-scale-y,1))}.wp-block-outermost-icon-block .rotate-90,.wp-block-outermost-icon-block.rotate-90{--outermost--icon-block--transform-rotate:90deg}.wp-block-outermost-icon-block .rotate-180,.wp-block-outermost-icon-block.rotate-180{--outermost--icon-block--transform-rotate:180deg}.wp-block-outermost-icon-block .rotate-270,.wp-block-outermost-icon-block.rotate-270{--outermost--icon-block--transform-rotate:270deg}.wp-block-outermost-icon-block .flip-horizontal,.wp-block-outermost-icon-block.flip-horizontal{--outermost--icon-block--transform-scale-x:-1}.wp-block-outermost-icon-block .flip-vertical,.wp-block-outermost-icon-block.flip-vertical{--outermost--icon-block--transform-scale-y:-1}.wp-block-outermost-icon-block .flip-vertical.flip-horizontal,.wp-block-outermost-icon-block.flip-vertical.flip-horizontal{--outermost--icon-block--transform-scale-x:-1;--outermost--icon-block--transform-scale-y:-1} </style> <style id='global-styles-inline-css'> :root{--wp--preset--aspect-ratio--square: 1;--wp--preset--aspect-ratio--4-3: 4/3;--wp--preset--aspect-ratio--3-4: 3/4;--wp--preset--aspect-ratio--3-2: 3/2;--wp--preset--aspect-ratio--2-3: 2/3;--wp--preset--aspect-ratio--16-9: 16/9;--wp--preset--aspect-ratio--9-16: 9/16;--wp--preset--color--black: #000000;--wp--preset--color--cyan-bluish-gray: #abb8c3;--wp--preset--color--white: #ffffff;--wp--preset--color--pale-pink: #f78da7;--wp--preset--color--vivid-red: #cf2e2e;--wp--preset--color--luminous-vivid-orange: #ff6900;--wp--preset--color--luminous-vivid-amber: #fcb900;--wp--preset--color--light-green-cyan: #7bdcb5;--wp--preset--color--vivid-green-cyan: #00d084;--wp--preset--color--pale-cyan-blue: #8ed1fc;--wp--preset--color--vivid-cyan-blue: #0693e3;--wp--preset--color--vivid-purple: #9b51e0;--wp--preset--color--base: #fff;--wp--preset--color--tiffany: #0ecad4;--wp--preset--color--mirage: #002838;--wp--preset--color--sunset: #ff6c29;--wp--preset--color--royal: #7e5cef;--wp--preset--color--lapis: #007eea;--wp--preset--color--heliotrope: #7a1ba6;--wp--preset--color--polar: #f4f7fa;--wp--preset--color--seafoam: #50E3C2;--wp--preset--color--curry: #FFCB52;--wp--preset--color--ash: #98A2A7;--wp--preset--color--dollabillz: #43AB3C;--wp--preset--gradient--vivid-cyan-blue-to-vivid-purple: linear-gradient(135deg,rgba(6,147,227,1) 0%,rgb(155,81,224) 100%);--wp--preset--gradient--light-green-cyan-to-vivid-green-cyan: linear-gradient(135deg,rgb(122,220,180) 0%,rgb(0,208,130) 100%);--wp--preset--gradient--luminous-vivid-amber-to-luminous-vivid-orange: linear-gradient(135deg,rgba(252,185,0,1) 0%,rgba(255,105,0,1) 100%);--wp--preset--gradient--luminous-vivid-orange-to-vivid-red: linear-gradient(135deg,rgba(255,105,0,1) 0%,rgb(207,46,46) 100%);--wp--preset--gradient--very-light-gray-to-cyan-bluish-gray: linear-gradient(135deg,rgb(238,238,238) 0%,rgb(169,184,195) 100%);--wp--preset--gradient--cool-to-warm-spectrum: linear-gradient(135deg,rgb(74,234,220) 0%,rgb(151,120,209) 20%,rgb(207,42,186) 40%,rgb(238,44,130) 60%,rgb(251,105,98) 80%,rgb(254,248,76) 100%);--wp--preset--gradient--blush-light-purple: linear-gradient(135deg,rgb(255,206,236) 0%,rgb(152,150,240) 100%);--wp--preset--gradient--blush-bordeaux: linear-gradient(135deg,rgb(254,205,165) 0%,rgb(254,45,45) 50%,rgb(107,0,62) 100%);--wp--preset--gradient--luminous-dusk: linear-gradient(135deg,rgb(255,203,112) 0%,rgb(199,81,192) 50%,rgb(65,88,208) 100%);--wp--preset--gradient--pale-ocean: linear-gradient(135deg,rgb(255,245,203) 0%,rgb(182,227,212) 50%,rgb(51,167,181) 100%);--wp--preset--gradient--electric-grass: linear-gradient(135deg,rgb(202,248,128) 0%,rgb(113,206,126) 100%);--wp--preset--gradient--midnight: linear-gradient(135deg,rgb(2,3,129) 0%,rgb(40,116,252) 100%);--wp--preset--gradient--tiffany-royal: linear-gradient(135deg,var(--wp--preset--color--tiffany) 10%,var(--wp--preset--color--royal) 100%);--wp--preset--gradient--lapis-heliotrope: linear-gradient(141deg,var(--wp--preset--color--lapis),var(--wp--preset--color--heliotrope));--wp--preset--gradient--custom-cta: linear-gradient(315deg,rgb(122,69,229) 20%,rgb(14,202,212) 100%);--wp--preset--font-size--small: 16px;--wp--preset--font-size--medium: 18px;--wp--preset--font-size--large: 24px;--wp--preset--font-size--x-large: 30px;--wp--preset--font-size--tiny: 14px;--wp--preset--font-size--medium-large: 20px;--wp--preset--font-size--max-36: clamp(24px, 3vw, 36px);--wp--preset--font-size--max-48: clamp(30px, 4vw, 48px);--wp--preset--font-size--max-60: clamp(36px, 5vw, 60px);--wp--preset--font-size--max-72: clamp(48px, 6vw, 72px);--wp--preset--font-family--primary: "Open Sans", sans-serif;--wp--preset--font-family--monospace: monospace;--wp--preset--font-family--inter: Inter, sans-serif;--wp--preset--spacing--20: 0.44rem;--wp--preset--spacing--30: clamp(1.5rem, 5vw, 2rem);--wp--preset--spacing--40: clamp(1.8rem, 1.8rem + ((1vw - 0.48rem) * 2.885), 3rem);--wp--preset--spacing--50: clamp(2.5rem, 8vw, 4.5rem);--wp--preset--spacing--60: clamp(3.75rem, 10vw, 7rem);--wp--preset--spacing--70: clamp(5rem, 5.25rem + ((1vw - 0.48rem) * 9.096), 8rem);--wp--preset--spacing--80: clamp(7rem, 14vw, 11rem);--wp--preset--shadow--natural: 6px 6px 9px rgba(0, 0, 0, 0.2);--wp--preset--shadow--deep: 12px 12px 50px rgba(0, 0, 0, 0.4);--wp--preset--shadow--sharp: 6px 6px 0px rgba(0, 0, 0, 0.2);--wp--preset--shadow--outlined: 6px 6px 0px -3px rgba(255, 255, 255, 1), 6px 6px rgba(0, 0, 0, 1);--wp--preset--shadow--crisp: 6px 6px 0px rgba(0, 0, 0, 1);--wp--custom--font-weight--regular: 400;--wp--custom--font-weight--bold: 700;--wp--custom--font-weight--extra-bold: 800;--wp--custom--line-height--one: 1;--wp--custom--line-height--heading: 1.1;--wp--custom--line-height--medium: 1.5;--wp--custom--line-height--body: 1.75;--wp--custom--spacing--outer: clamp(1.5rem, 0.835rem + 2.128vw, 2.75rem);}:root { --wp--style--global--content-size: 640px;--wp--style--global--wide-size: 1200px; }:where(body) { margin: 0; }.wp-site-blocks { padding-top: var(--wp--style--root--padding-top); padding-bottom: var(--wp--style--root--padding-bottom); }.has-global-padding { padding-right: var(--wp--style--root--padding-right); padding-left: var(--wp--style--root--padding-left); }.has-global-padding > .alignfull { margin-right: calc(var(--wp--style--root--padding-right) * -1); margin-left: calc(var(--wp--style--root--padding-left) * -1); }.has-global-padding :where(:not(.alignfull.is-layout-flow) > .has-global-padding:not(.wp-block-block, .alignfull)) { padding-right: 0; padding-left: 0; }.has-global-padding :where(:not(.alignfull.is-layout-flow) > .has-global-padding:not(.wp-block-block, .alignfull)) > .alignfull { margin-left: 0; margin-right: 0; }.wp-site-blocks > .alignleft { float: left; margin-right: 2em; }.wp-site-blocks > .alignright { float: right; margin-left: 2em; }.wp-site-blocks > .aligncenter { justify-content: center; margin-left: auto; margin-right: auto; }:where(.wp-site-blocks) > * { margin-block-start: 1.5rem; margin-block-end: 0; }:where(.wp-site-blocks) > :first-child { margin-block-start: 0; }:where(.wp-site-blocks) > :last-child { margin-block-end: 0; }:root { --wp--style--block-gap: 1.5rem; }.is-layout-flow > :first-child{margin-block-start: 0;}.is-layout-flow > :last-child{margin-block-end: 0;}.is-layout-flow > *{margin-block-start: 1.5rem;margin-block-end: 0;}.is-layout-constrained > :first-child{margin-block-start: 0;}.is-layout-constrained > :last-child{margin-block-end: 0;}.is-layout-constrained > *{margin-block-start: 1.5rem;margin-block-end: 0;}.is-layout-flex {gap: 1.5rem;}.is-layout-grid {gap: 1.5rem;}.is-layout-flow > .alignleft{float: left;margin-inline-start: 0;margin-inline-end: 2em;}.is-layout-flow > .alignright{float: right;margin-inline-start: 2em;margin-inline-end: 0;}.is-layout-flow > .aligncenter{margin-left: auto !important;margin-right: auto !important;}.is-layout-constrained > .alignleft{float: left;margin-inline-start: 0;margin-inline-end: 2em;}.is-layout-constrained > .alignright{float: right;margin-inline-start: 2em;margin-inline-end: 0;}.is-layout-constrained > .aligncenter{margin-left: auto !important;margin-right: auto !important;}.is-layout-constrained > :where(:not(.alignleft):not(.alignright):not(.alignfull)){max-width: var(--wp--style--global--content-size);margin-left: auto !important;margin-right: auto !important;}.is-layout-constrained > .alignwide{max-width: var(--wp--style--global--wide-size);}body .is-layout-flex{display: flex;}.is-layout-flex{flex-wrap: wrap;align-items: center;}.is-layout-flex > :is(*, div){margin: 0;}body .is-layout-grid{display: grid;}.is-layout-grid > :is(*, div){margin: 0;}:root :where(body){background-color: var(--wp--preset--color--base);color: var(--wp--preset--color--mirage);font-family: var(--wp--preset--font-family--inter);font-size: var(--wp--preset--font-size--medium);font-weight: var(--wp--custom--font-weight--regular);line-height: var(--wp--custom--line-height--body);--wp--style--root--padding-top: 0px;--wp--style--root--padding-right: var(--wp--preset--spacing--30);--wp--style--root--padding-bottom: 0px;--wp--style--root--padding-left: var(--wp--preset--spacing--30);}a:where(:not(.wp-element-button)){color: var(--wp--preset--color--heliotrope);text-decoration: underline;}h1{font-size: var(--wp--preset--font-size--max-36);font-style: normal;font-weight: 600;line-height: 1.1;}h2{font-size: var(--wp--preset--font-size--large);}h3{font-size: var(--wp--preset--font-size--medium-large);}h4{font-size: var(--wp--preset--font-size--medium);}:root :where(.wp-element-button, .wp-block-button__link){background-color: #32373c;border-width: 0;color: #fff;font-family: inherit;font-size: inherit;line-height: inherit;padding: calc(0.667em + 2px) calc(1.333em + 2px);text-decoration: none;}.has-black-color{color: var(--wp--preset--color--black) !important;}.has-cyan-bluish-gray-color{color: var(--wp--preset--color--cyan-bluish-gray) !important;}.has-white-color{color: var(--wp--preset--color--white) !important;}.has-pale-pink-color{color: var(--wp--preset--color--pale-pink) !important;}.has-vivid-red-color{color: var(--wp--preset--color--vivid-red) !important;}.has-luminous-vivid-orange-color{color: var(--wp--preset--color--luminous-vivid-orange) !important;}.has-luminous-vivid-amber-color{color: var(--wp--preset--color--luminous-vivid-amber) !important;}.has-light-green-cyan-color{color: var(--wp--preset--color--light-green-cyan) !important;}.has-vivid-green-cyan-color{color: var(--wp--preset--color--vivid-green-cyan) !important;}.has-pale-cyan-blue-color{color: var(--wp--preset--color--pale-cyan-blue) !important;}.has-vivid-cyan-blue-color{color: var(--wp--preset--color--vivid-cyan-blue) !important;}.has-vivid-purple-color{color: var(--wp--preset--color--vivid-purple) !important;}.has-base-color{color: var(--wp--preset--color--base) !important;}.has-tiffany-color{color: var(--wp--preset--color--tiffany) !important;}.has-mirage-color{color: var(--wp--preset--color--mirage) !important;}.has-sunset-color{color: var(--wp--preset--color--sunset) !important;}.has-royal-color{color: var(--wp--preset--color--royal) !important;}.has-lapis-color{color: var(--wp--preset--color--lapis) !important;}.has-heliotrope-color{color: var(--wp--preset--color--heliotrope) !important;}.has-polar-color{color: var(--wp--preset--color--polar) !important;}.has-seafoam-color{color: var(--wp--preset--color--seafoam) !important;}.has-curry-color{color: var(--wp--preset--color--curry) !important;}.has-ash-color{color: var(--wp--preset--color--ash) !important;}.has-dollabillz-color{color: var(--wp--preset--color--dollabillz) !important;}.has-black-background-color{background-color: var(--wp--preset--color--black) !important;}.has-cyan-bluish-gray-background-color{background-color: var(--wp--preset--color--cyan-bluish-gray) !important;}.has-white-background-color{background-color: var(--wp--preset--color--white) !important;}.has-pale-pink-background-color{background-color: var(--wp--preset--color--pale-pink) !important;}.has-vivid-red-background-color{background-color: var(--wp--preset--color--vivid-red) !important;}.has-luminous-vivid-orange-background-color{background-color: var(--wp--preset--color--luminous-vivid-orange) !important;}.has-luminous-vivid-amber-background-color{background-color: var(--wp--preset--color--luminous-vivid-amber) !important;}.has-light-green-cyan-background-color{background-color: var(--wp--preset--color--light-green-cyan) !important;}.has-vivid-green-cyan-background-color{background-color: var(--wp--preset--color--vivid-green-cyan) !important;}.has-pale-cyan-blue-background-color{background-color: var(--wp--preset--color--pale-cyan-blue) !important;}.has-vivid-cyan-blue-background-color{background-color: var(--wp--preset--color--vivid-cyan-blue) !important;}.has-vivid-purple-background-color{background-color: var(--wp--preset--color--vivid-purple) !important;}.has-base-background-color{background-color: var(--wp--preset--color--base) !important;}.has-tiffany-background-color{background-color: var(--wp--preset--color--tiffany) !important;}.has-mirage-background-color{background-color: var(--wp--preset--color--mirage) !important;}.has-sunset-background-color{background-color: var(--wp--preset--color--sunset) !important;}.has-royal-background-color{background-color: var(--wp--preset--color--royal) !important;}.has-lapis-background-color{background-color: var(--wp--preset--color--lapis) !important;}.has-heliotrope-background-color{background-color: var(--wp--preset--color--heliotrope) !important;}.has-polar-background-color{background-color: var(--wp--preset--color--polar) !important;}.has-seafoam-background-color{background-color: var(--wp--preset--color--seafoam) !important;}.has-curry-background-color{background-color: var(--wp--preset--color--curry) !important;}.has-ash-background-color{background-color: var(--wp--preset--color--ash) !important;}.has-dollabillz-background-color{background-color: var(--wp--preset--color--dollabillz) !important;}.has-black-border-color{border-color: var(--wp--preset--color--black) !important;}.has-cyan-bluish-gray-border-color{border-color: var(--wp--preset--color--cyan-bluish-gray) !important;}.has-white-border-color{border-color: var(--wp--preset--color--white) !important;}.has-pale-pink-border-color{border-color: var(--wp--preset--color--pale-pink) !important;}.has-vivid-red-border-color{border-color: var(--wp--preset--color--vivid-red) !important;}.has-luminous-vivid-orange-border-color{border-color: var(--wp--preset--color--luminous-vivid-orange) !important;}.has-luminous-vivid-amber-border-color{border-color: var(--wp--preset--color--luminous-vivid-amber) !important;}.has-light-green-cyan-border-color{border-color: var(--wp--preset--color--light-green-cyan) !important;}.has-vivid-green-cyan-border-color{border-color: var(--wp--preset--color--vivid-green-cyan) !important;}.has-pale-cyan-blue-border-color{border-color: var(--wp--preset--color--pale-cyan-blue) !important;}.has-vivid-cyan-blue-border-color{border-color: var(--wp--preset--color--vivid-cyan-blue) !important;}.has-vivid-purple-border-color{border-color: var(--wp--preset--color--vivid-purple) !important;}.has-base-border-color{border-color: var(--wp--preset--color--base) !important;}.has-tiffany-border-color{border-color: var(--wp--preset--color--tiffany) !important;}.has-mirage-border-color{border-color: var(--wp--preset--color--mirage) !important;}.has-sunset-border-color{border-color: var(--wp--preset--color--sunset) !important;}.has-royal-border-color{border-color: var(--wp--preset--color--royal) !important;}.has-lapis-border-color{border-color: var(--wp--preset--color--lapis) !important;}.has-heliotrope-border-color{border-color: var(--wp--preset--color--heliotrope) !important;}.has-polar-border-color{border-color: var(--wp--preset--color--polar) !important;}.has-seafoam-border-color{border-color: var(--wp--preset--color--seafoam) !important;}.has-curry-border-color{border-color: var(--wp--preset--color--curry) !important;}.has-ash-border-color{border-color: var(--wp--preset--color--ash) !important;}.has-dollabillz-border-color{border-color: var(--wp--preset--color--dollabillz) !important;}.has-vivid-cyan-blue-to-vivid-purple-gradient-background{background: var(--wp--preset--gradient--vivid-cyan-blue-to-vivid-purple) !important;}.has-light-green-cyan-to-vivid-green-cyan-gradient-background{background: var(--wp--preset--gradient--light-green-cyan-to-vivid-green-cyan) !important;}.has-luminous-vivid-amber-to-luminous-vivid-orange-gradient-background{background: var(--wp--preset--gradient--luminous-vivid-amber-to-luminous-vivid-orange) !important;}.has-luminous-vivid-orange-to-vivid-red-gradient-background{background: var(--wp--preset--gradient--luminous-vivid-orange-to-vivid-red) !important;}.has-very-light-gray-to-cyan-bluish-gray-gradient-background{background: var(--wp--preset--gradient--very-light-gray-to-cyan-bluish-gray) !important;}.has-cool-to-warm-spectrum-gradient-background{background: var(--wp--preset--gradient--cool-to-warm-spectrum) !important;}.has-blush-light-purple-gradient-background{background: var(--wp--preset--gradient--blush-light-purple) !important;}.has-blush-bordeaux-gradient-background{background: var(--wp--preset--gradient--blush-bordeaux) !important;}.has-luminous-dusk-gradient-background{background: var(--wp--preset--gradient--luminous-dusk) !important;}.has-pale-ocean-gradient-background{background: var(--wp--preset--gradient--pale-ocean) !important;}.has-electric-grass-gradient-background{background: var(--wp--preset--gradient--electric-grass) !important;}.has-midnight-gradient-background{background: var(--wp--preset--gradient--midnight) !important;}.has-tiffany-royal-gradient-background{background: var(--wp--preset--gradient--tiffany-royal) !important;}.has-lapis-heliotrope-gradient-background{background: var(--wp--preset--gradient--lapis-heliotrope) !important;}.has-custom-cta-gradient-background{background: var(--wp--preset--gradient--custom-cta) !important;}.has-small-font-size{font-size: var(--wp--preset--font-size--small) !important;}.has-medium-font-size{font-size: var(--wp--preset--font-size--medium) !important;}.has-large-font-size{font-size: var(--wp--preset--font-size--large) !important;}.has-x-large-font-size{font-size: var(--wp--preset--font-size--x-large) !important;}.has-tiny-font-size{font-size: var(--wp--preset--font-size--tiny) !important;}.has-medium-large-font-size{font-size: var(--wp--preset--font-size--medium-large) !important;}.has-max-36-font-size{font-size: var(--wp--preset--font-size--max-36) !important;}.has-max-48-font-size{font-size: var(--wp--preset--font-size--max-48) !important;}.has-max-60-font-size{font-size: var(--wp--preset--font-size--max-60) !important;}.has-max-72-font-size{font-size: var(--wp--preset--font-size--max-72) !important;}.has-primary-font-family{font-family: var(--wp--preset--font-family--primary) !important;}.has-monospace-font-family{font-family: var(--wp--preset--font-family--monospace) !important;}.has-inter-font-family{font-family: var(--wp--preset--font-family--inter) !important;} :root :where(.wp-block-button .wp-block-button__link){background-color: var(--wp--preset--color--mirage);border-radius: 9999px;border-top-color: #002838;border-top-width: 2px;border-top-style: solid;border-right-color: #002838;border-right-width: 2px;border-right-style: solid;border-bottom-color: #002838;border-bottom-width: 2px;border-bottom-style: solid;border-left-color: #002838;border-left-width: 2px;border-left-style: solid;color: var(--wp--preset--color--base);font-size: var(--wp--preset--font-size--tiny);font-weight: var(--wp--custom--font-weight--bold);line-height: var(--wp--custom--line-height--one);padding-top: 20px;padding-right: 40px;padding-bottom: 20px;padding-left: 40px;text-transform: none;} :root :where(.wp-block-columns){margin-bottom: 0px;} :root :where(.wp-block-pullquote){font-size: 1.5em;line-height: 1.6;} :root :where(.wp-block-avatar){line-height: 1;} :root :where(.wp-block-code){background-color: var(--wp--preset--color--black);border-radius: 0;color: var(--wp--preset--color--base);font-family: var(--wp--preset--font-family--monospace);font-size: var(--wp--preset--font-size--small);padding-top: 25px;padding-right: 30px;padding-bottom: 25px;padding-left: 30px;} :root :where(.wp-block-heading){font-weight: var(--wp--custom--font-weight--bold);line-height: var(--wp--custom--line-height--heading);margin-top: 40px;margin-bottom: 20px;} :root :where(.wp-block-image){margin-top: 30px;margin-right: 0;margin-bottom: 30px;margin-left: 0;} :root :where(.wp-block-navigation){font-size: var(--wp--preset--font-size--tiny);font-weight: var(--wp--custom--font-weight--bold);} :root :where(p){margin-top: 0px;margin-bottom: 30px;} :root :where(.wp-block-post-title){font-size: var(--wp--preset--font-size--max-36);font-weight: var(--wp--custom--font-weight--extra-bold);} :root :where(.wp-block-quote){border-color: var(--wp--preset--color--mirage);border-width: 1px !important;border-style: solid !important;line-height: var(--wp--custom--line-height--medium);margin-bottom: 35px;padding-top: 30px;padding-right: 40px !important;padding-bottom: 30px;padding-left: 40px !important;} :root :where(.wp-block-spacer){margin-top: 0 !important;} :root :where(.wp-block-separator){color: var(--wp--preset--color--mirage);font-size: var(--wp--preset--font-size--large);} :root :where(.wp-block-site-title){font-size: var(--wp--preset--font-size--large);font-weight: var(--wp--custom--font-weight--bold);line-height: var(--wp--custom--line-height--one);} :root :where(.wp-block-template-part){margin-top: 0px;} /* Headless Roadmap dashed line border */ .wp-block-group.is-style-boxshadow.roadmap-box { --headless-roadmap-dash-height: 10vh; margin-bottom: var(--headless-roadmap-dash-height) !important; position: relative; } .wp-block-group.is-style-boxshadow.roadmap-box::after { border-left: 1px dashed var(--wp--preset--color--ash); content: ""; display: block; height: var(--headless-roadmap-dash-height); left: 50%; opacity: 0.5; position: absolute; top: 100%; z-index: 0; } @media screen and (max-width: 440px) { .roadmap-box .wp-block-outermost-icon-block + p { font-size: 14px !important; } .roadmap-box .wp-block-group.is-content-justification-center.is-nowrap.is-layout-flex { column-gap: 0.5rem; } } .wp-block-social-links .wp-block-social-link { padding: 3px; } /*Community Event Type Highlighting*/ article.tribe-events-calendar-month__calendar-event.tribe_events_cat-community h3{ background-color: #007eea; } .tribe-events .tribe_events_cat-community .tribe-events-calendar-month__calendar-event-title-link, .tribe-events .tribe_events_cat-community .tribe-events-calendar-month__calendar-event-title-link:hover{ color: #ffffff; } .tribe-events-category-community a{ color: #ffffff !important; } .tribe-events-category-community a:hover{ text-decoration: underline !important; } </style> <link rel='stylesheet' id='wp-block-library-css' href='https://wpengine.com/builders/wp-includes/css/dist/block-library/style.min.css?ver=6.6.1' media='all' /> <style id='block-style-variation-styles-inline-css'> :root :where(.wp-block-button.is-style-outline--0f53ff4c9709aaca3c7e77b444130fbb .wp-block-button__link){background: transparent none;border-color: currentColor;border-width: 2px;border-style: solid;color: currentColor;padding-top: 0.667em;padding-right: 1.33em;padding-bottom: 0.667em;padding-left: 1.33em;} </style> <style id='wp-block-library-theme-inline-css'> .wp-block-audio :where(figcaption){color:#555;font-size:13px;text-align:center}.is-dark-theme .wp-block-audio :where(figcaption){color:#ffffffa6}.wp-block-audio{margin:0 0 1em}.wp-block-code{border:1px solid #ccc;border-radius:4px;font-family:Menlo,Consolas,monaco,monospace;padding:.8em 1em}.wp-block-embed :where(figcaption){color:#555;font-size:13px;text-align:center}.is-dark-theme .wp-block-embed :where(figcaption){color:#ffffffa6}.wp-block-embed{margin:0 0 1em}.blocks-gallery-caption{color:#555;font-size:13px;text-align:center}.is-dark-theme .blocks-gallery-caption{color:#ffffffa6}:root :where(.wp-block-image figcaption){color:#555;font-size:13px;text-align:center}.is-dark-theme :root :where(.wp-block-image figcaption){color:#ffffffa6}.wp-block-image{margin:0 0 1em}.wp-block-pullquote{border-bottom:4px solid;border-top:4px solid;color:currentColor;margin-bottom:1.75em}.wp-block-pullquote cite,.wp-block-pullquote footer,.wp-block-pullquote__citation{color:currentColor;font-size:.8125em;font-style:normal;text-transform:uppercase}.wp-block-quote{border-left:.25em solid;margin:0 0 1.75em;padding-left:1em}.wp-block-quote cite,.wp-block-quote footer{color:currentColor;font-size:.8125em;font-style:normal;position:relative}.wp-block-quote.has-text-align-right{border-left:none;border-right:.25em solid;padding-left:0;padding-right:1em}.wp-block-quote.has-text-align-center{border:none;padding-left:0}.wp-block-quote.is-large,.wp-block-quote.is-style-large,.wp-block-quote.is-style-plain{border:none}.wp-block-search .wp-block-search__label{font-weight:700}.wp-block-search__button{border:1px solid #ccc;padding:.375em .625em}:where(.wp-block-group.has-background){padding:1.25em 2.375em}.wp-block-separator.has-css-opacity{opacity:.4}.wp-block-separator{border:none;border-bottom:2px solid;margin-left:auto;margin-right:auto}.wp-block-separator.has-alpha-channel-opacity{opacity:1}.wp-block-separator:not(.is-style-wide):not(.is-style-dots){width:100px}.wp-block-separator.has-background:not(.is-style-dots){border-bottom:none;height:1px}.wp-block-separator.has-background:not(.is-style-wide):not(.is-style-dots){height:2px}.wp-block-table{margin:0 0 1em}.wp-block-table td,.wp-block-table th{word-break:normal}.wp-block-table :where(figcaption){color:#555;font-size:13px;text-align:center}.is-dark-theme .wp-block-table :where(figcaption){color:#ffffffa6}.wp-block-video :where(figcaption){color:#555;font-size:13px;text-align:center}.is-dark-theme .wp-block-video :where(figcaption){color:#ffffffa6}.wp-block-video{margin:0 0 1em}:root :where(.wp-block-template-part.has-background){margin-bottom:0;margin-top:0;padding:1.25em 2.375em} </style> <style id='core-block-supports-inline-css'> .wp-container-core-social-links-is-layout-1{gap:0.5em 10px;}.wp-container-core-navigation-is-layout-1{justify-content:flex-start;}.wp-container-core-group-is-layout-1{flex-wrap:nowrap;gap:10px;justify-content:flex-end;}.wp-container-core-group-is-layout-2{justify-content:space-between;}.wp-container-core-group-is-layout-3 > :where(:not(.alignleft):not(.alignright):not(.alignfull)){max-width:1200px;margin-left:auto !important;margin-right:auto !important;}.wp-container-core-group-is-layout-3 > .alignwide{max-width:1200px;}.wp-container-core-group-is-layout-3 .alignfull{max-width:none;}.wp-container-core-group-is-layout-4{flex-wrap:nowrap;gap:10px;justify-content:center;}.wp-container-core-group-is-layout-5 > :where(:not(.alignleft):not(.alignright):not(.alignfull)){max-width:800px;margin-left:auto !important;margin-right:auto !important;}.wp-container-core-group-is-layout-5 > .alignwide{max-width:800px;}.wp-container-core-group-is-layout-5 .alignfull{max-width:none;}.wp-container-core-group-is-layout-5 > .alignfull{margin-right:calc(var(--wp--preset--spacing--30) * -1);margin-left:calc(var(--wp--preset--spacing--30) * -1);}.wp-container-core-group-is-layout-6 > *{margin-block-start:0;margin-block-end:0;}.wp-container-core-group-is-layout-6 > * + *{margin-block-start:10px;margin-block-end:0;}.wp-elements-60580c77f35127ab4c58efd3ae854863 a:where(:not(.wp-element-button)){color:var(--wp--preset--color--base);}.wp-container-content-1{flex-grow:1;}.wp-container-core-buttons-is-layout-1{flex-wrap:nowrap;gap:0;justify-content:flex-end;}.wp-container-core-group-is-layout-7{gap:14px;justify-content:flex-start;}.wp-container-core-group-is-layout-8 > .alignfull{margin-right:calc(var(--wp--preset--spacing--30) * -1);margin-left:calc(var(--wp--preset--spacing--30) * -1);}.wp-elements-4ec246525e7debe1f58ed930f4055f64 a:where(:not(.wp-element-button)){color:var(--wp--preset--color--lapis);}.wp-elements-4ec246525e7debe1f58ed930f4055f64 a:where(:not(.wp-element-button)):hover{color:var(--wp--preset--color--base);}.wp-container-content-3{flex-grow:1;}.wp-container-core-buttons-is-layout-2{flex-wrap:nowrap;gap:0;justify-content:flex-end;}.wp-container-core-group-is-layout-9{gap:16px;justify-content:flex-start;}.wp-container-core-group-is-layout-10 > .alignfull{margin-right:calc(var(--wp--preset--spacing--30) * -1);margin-left:calc(var(--wp--preset--spacing--30) * -1);}.wp-elements-93d3f2d785f9a848082305b4115d2be6 a:where(:not(.wp-element-button)){color:var(--wp--preset--color--base);}.wp-container-core-columns-is-layout-1{flex-wrap:nowrap;}.wp-container-core-group-is-layout-13 > :where(:not(.alignleft):not(.alignright):not(.alignfull)){max-width:704px;margin-left:auto !important;margin-right:auto !important;}.wp-container-core-group-is-layout-13 > .alignwide{max-width:704px;}.wp-container-core-group-is-layout-13 .alignfull{max-width:none;}.wp-container-core-group-is-layout-15 > :where(:not(.alignleft):not(.alignright):not(.alignfull)){max-width:960px;margin-left:auto !important;margin-right:auto !important;}.wp-container-core-group-is-layout-15 > .alignwide{max-width:960px;}.wp-container-core-group-is-layout-15 .alignfull{max-width:none;}.wp-container-core-buttons-is-layout-3{gap:20px;justify-content:center;}.wp-elements-c86a9fde0a6e0373f1588a576e3b9990 a:where(:not(.wp-element-button)){color:var(--wp--preset--color--base);}.wp-container-core-group-is-layout-18 > *{margin-block-start:0;margin-block-end:0;}.wp-container-core-group-is-layout-18 > * + *{margin-block-start:10px;margin-block-end:0;}.wp-container-core-group-is-layout-19 > *{margin-block-start:0;margin-block-end:0;}.wp-container-core-group-is-layout-19 > * + *{margin-block-start:10px;margin-block-end:0;}.wp-container-core-group-is-layout-20 > *{margin-block-start:0;margin-block-end:0;}.wp-container-core-group-is-layout-20 > * + *{margin-block-start:10px;margin-block-end:0;}.wp-container-core-group-is-layout-21 > *{margin-block-start:0;margin-block-end:0;}.wp-container-core-group-is-layout-21 > * + *{margin-block-start:10px;margin-block-end:0;}.wp-container-core-group-is-layout-22 > *{margin-block-start:0;margin-block-end:0;}.wp-container-core-group-is-layout-22 > * + *{margin-block-start:10px;margin-block-end:0;}.wp-container-core-group-is-layout-23 > *{margin-block-start:0;margin-block-end:0;}.wp-container-core-group-is-layout-23 > * + *{margin-block-start:10px;margin-block-end:0;}.wp-container-core-group-is-layout-24 > *{margin-block-start:0;margin-block-end:0;}.wp-container-core-group-is-layout-24 > * + *{margin-block-start:10px;margin-block-end:0;}.wp-container-core-columns-is-layout-2{flex-wrap:nowrap;}.wp-container-core-social-links-is-layout-2{gap:10px 10px;}.wp-container-core-group-is-layout-25{justify-content:space-between;}.wp-container-core-group-is-layout-27 > :where(:not(.alignleft):not(.alignright):not(.alignfull)){max-width:1200px;margin-left:auto !important;margin-right:auto !important;}.wp-container-core-group-is-layout-27 > .alignwide{max-width:1200px;}.wp-container-core-group-is-layout-27 .alignfull{max-width:none;}.wp-container-core-group-is-layout-27 > .alignfull{margin-right:calc(40px * -1);margin-left:calc(40px * -1);}.wp-duotone-002838-f4f7fa-2.wp-block-post-featured-image img, .wp-duotone-002838-f4f7fa-2.wp-block-post-featured-image .wp-block-post-featured-image__placeholder, .wp-duotone-002838-f4f7fa-2.wp-block-post-featured-image .components-placeholder__illustration, .wp-duotone-002838-f4f7fa-2.wp-block-post-featured-image .components-placeholder::before{filter:url(#wp-duotone-002838-f4f7fa-2);} </style> <style id='wp-block-template-skip-link-inline-css'> .skip-link.screen-reader-text { border: 0; clip: rect(1px,1px,1px,1px); clip-path: inset(50%); height: 1px; margin: -1px; overflow: hidden; padding: 0; position: absolute !important; width: 1px; word-wrap: normal !important; } .skip-link.screen-reader-text:focus { background-color: #eee; clip: auto !important; clip-path: none; color: #444; display: block; font-size: 1em; height: auto; left: 5px; line-height: normal; padding: 15px 23px 14px; text-decoration: none; top: 5px; width: auto; z-index: 100000; } </style> <link rel='stylesheet' id='wpe-builders-theme-css' href='https://wpengine.com/builders/wp-content/themes/builders/style.css?ver=1.0.13' media='all' /> <style id='teccc-nofile-stylesheet-inline-css'> .teccc-legend a, .tribe-events-calendar a, #tribe-events-content .tribe-events-tooltip h4 { font-weight: normal; } .tribe-events-list .vevent.hentry h2 { padding-left: 5px; } @media only screen and (max-width: 768px) { .tribe-events-calendar td .hentry, .tribe-events-calendar td .type-tribe_events { display: block; } h3.entry-title.summary, h3.tribe-events-month-event-title, .tribe-events-calendar .tribe-events-has-events:after { display: none; } .tribe-events-calendar .mobile-trigger .tribe-events-tooltip { display: none !important; } } .tribe-events .tribe-events-calendar-month__multiday-event-bar, .tribe-events .tribe-events-calendar-month__multiday-event-bar-inner, .tribe-events-calendar-month__multiday-event-wrapper { background-color: #F7F6F6; } .tribe-events-calendar-month__multiday-event-wrapper.tribe-events-calendar-month__multiday-event--empty { background-color: transparent !important; } .tribe-common--breakpoint-medium.tribe-events .tribe-events-calendar-list__event-datetime-featured-text, .tribe-events-calendar-month-mobile-events__mobile-event-datetime-featured-text, .tribe-events-calendar-day__event-datetime-featured-text, .tribe-common-c-svgicon--featured { color: #0ea0d7 !important; } .tribe-events-calendar-list__event-date-tag-datetime:after, .tribe-events-widget-events-list__event-date-tag-datetime:after, .tribe-events .tribe-events-calendar-day__event--featured:after, .tribe-events .tribe-events-calendar-month__calendar-event--featured:before { background-color: #0ea0d7 !important; } .tribe-events-category-community h2.tribe-events-list-event-title.entry-title a, .tribe-events-category-community h2.tribe-events-list-event-title a, .tribe-events-category-community h3.tribe-events-list-event-title a, .tribe-event-featured .tribe-events-category-community h3.tribe-events-list-event-title a, .tribe-events-list .tribe-events-loop .tribe-event-featured.tribe-events-category-community h3.tribe-events-list-event-title a, .tribe-events-shortcode .tribe-events-month table .type-tribe_events.tribe-events-category-community, .tribe-events-list .tribe-events-loop .tribe-event-featured.tribe-events-category-community h3.tribe-events-list-event-title a:hover, #tribe-events-content table.tribe-events-calendar .type-tribe_events.tribe-events-category-community.tribe-event-featured h3.tribe-events-month-event-title a:hover, .tribe-events-list-widget li.tribe-events-category-community a:link, .tribe-events-list-widget li.tribe-events-category-community a:visited, li.tribe-events-list-widget-events.tribe-events-category-community a:link, li.tribe-events-list-widget-events.tribe-events-category-community a:visited, .teccc-legend li.tribe_events_cat-community a, .tribe-common article.tribe_events_cat-community h3 a, .tribe-common article.tribe_events_cat-community h3 a:link, .tribe-common article.tribe_events_cat-community h3 a:visited, article.tribe-events-calendar-month__multiday-event.tribe_events_cat-community h3, #tribe-events-content table.tribe-events-calendar .tribe-event-featured.tribe-events-category-community .tribe-events-month-event-title a, .teccc-legend li.tribe-events-category-community a, .tribe-events-calendar .tribe-events-category-community a, #tribe-events-content .teccc-legend li.tribe-events-category-community a, #tribe-events-content .tribe-events-calendar .tribe-events-category-community a, .type-tribe_events.tribe-events-category-community h2 a, .tribe-events-category-community > div.hentry.vevent > h3.entry-title a, .tribe-events-mobile.tribe-events-category-community h4 a { color: #fff; text-decoration: none; } .tribe-events-category-community h3.tribe-events-list-event-title, .tribe-events-shortcode .tribe-events-month table .type-tribe_events.tribe-events-category-community, .tribe-events-list-widget li.tribe-events-category-community h4, li.tribe-events-list-widget-events.tribe-events-category-community h4, .teccc-legend li.tribe_events_cat-community, article.tribe_events_cat-community header.tribe-events-widget-events-list__event-header h3, article.tribe-events-calendar-month__calendar-event.tribe_events_cat-community h3, article.tribe-events-calendar-month__multiday-event.tribe_events_cat-community .tribe-events-calendar-month__multiday-event-bar-inner, article.tribe-events-calendar-month-mobile-events__mobile-event.tribe_events_cat-community h3, article.tribe-events-calendar-day__event.tribe_events_cat-community h3, article.tribe-events-calendar-list__event.tribe_events_cat-community h3, article.tribe-events-calendar-latest-past__event.tribe_events_cat-community h3, .events-archive.events-gridview #tribe-events-content table .type-tribe_events.tribe-events-category-community, .teccc-legend li.tribe-events-category-community, .tribe-events-calendar .tribe-events-category-community, .type-tribe_events.tribe-events-category-community h2, .tribe-events-category-community > div.hentry.vevent > h3.entry-title, .tribe-events-mobile.tribe-events-category-community h4 { background-color: #007eea; border-right: 5px solid transparent; color: #fff; line-height: 1.4em; padding-left: 5px; padding-bottom: 2px; } .tribe-events-calendar .tribe-event-featured.tribe-events-category-community, #tribe-events-content table.tribe-events-calendar .type-tribe_events.tribe-event-featured.tribe-events-category-community, .tribe-grid-body div[id*='tribe-events-event-'][class*='tribe-events-category-'].tribe-events-week-hourly-single.tribe-event-featured { border-right: 5px solid #0ea0d7 } .tribe-events-list-widget li.tribe-events-category-community a:link, .tribe-events-list-widget li.tribe-events-category-community a:visited, li.tribe-events-list-widget-events.tribe-events-category-community a:link, li.tribe-events-list-widget-events.tribe-events-category-community a:visited, .tribe-events-category-community h2.tribe-events-list-event-title.entry-title a, .tribe-events-category-community h2.tribe-events-list-event-title a, .tribe-events-category-community h3.tribe-events-list-event-title a, .tribe-event-featured .tribe-events-category-community h3.tribe-events-list-event-title a, .tribe-events-list .tribe-events-loop .tribe-event-featured.tribe-events-category-community h3.tribe-events-list-event-title a { width: auto; display: block; } .tribe-events-category-headless h2.tribe-events-list-event-title.entry-title a, .tribe-events-category-headless h2.tribe-events-list-event-title a, .tribe-events-category-headless h3.tribe-events-list-event-title a, .tribe-event-featured .tribe-events-category-headless h3.tribe-events-list-event-title a, .tribe-events-list .tribe-events-loop .tribe-event-featured.tribe-events-category-headless h3.tribe-events-list-event-title a, .tribe-events-shortcode .tribe-events-month table .type-tribe_events.tribe-events-category-headless, .tribe-events-list .tribe-events-loop .tribe-event-featured.tribe-events-category-headless h3.tribe-events-list-event-title a:hover, #tribe-events-content table.tribe-events-calendar .type-tribe_events.tribe-events-category-headless.tribe-event-featured h3.tribe-events-month-event-title a:hover, .tribe-events-list-widget li.tribe-events-category-headless a:link, .tribe-events-list-widget li.tribe-events-category-headless a:visited, li.tribe-events-list-widget-events.tribe-events-category-headless a:link, li.tribe-events-list-widget-events.tribe-events-category-headless a:visited, .teccc-legend li.tribe_events_cat-headless a, .tribe-common article.tribe_events_cat-headless h3 a, .tribe-common article.tribe_events_cat-headless h3 a:link, .tribe-common article.tribe_events_cat-headless h3 a:visited, article.tribe-events-calendar-month__multiday-event.tribe_events_cat-headless h3, #tribe-events-content table.tribe-events-calendar .tribe-event-featured.tribe-events-category-headless .tribe-events-month-event-title a, .teccc-legend li.tribe-events-category-headless a, .tribe-events-calendar .tribe-events-category-headless a, #tribe-events-content .teccc-legend li.tribe-events-category-headless a, #tribe-events-content .tribe-events-calendar .tribe-events-category-headless a, .type-tribe_events.tribe-events-category-headless h2 a, .tribe-events-category-headless > div.hentry.vevent > h3.entry-title a, .tribe-events-mobile.tribe-events-category-headless h4 a { color: #fff; text-decoration: none; } .tribe-events-category-headless h3.tribe-events-list-event-title, .tribe-events-shortcode .tribe-events-month table .type-tribe_events.tribe-events-category-headless, .tribe-events-list-widget li.tribe-events-category-headless h4, li.tribe-events-list-widget-events.tribe-events-category-headless h4, .teccc-legend li.tribe_events_cat-headless, article.tribe_events_cat-headless header.tribe-events-widget-events-list__event-header h3, article.tribe-events-calendar-month__calendar-event.tribe_events_cat-headless h3, article.tribe-events-calendar-month__multiday-event.tribe_events_cat-headless .tribe-events-calendar-month__multiday-event-bar-inner, article.tribe-events-calendar-month-mobile-events__mobile-event.tribe_events_cat-headless h3, article.tribe-events-calendar-day__event.tribe_events_cat-headless h3, article.tribe-events-calendar-list__event.tribe_events_cat-headless h3, article.tribe-events-calendar-latest-past__event.tribe_events_cat-headless h3, .events-archive.events-gridview #tribe-events-content table .type-tribe_events.tribe-events-category-headless, .teccc-legend li.tribe-events-category-headless, .tribe-events-calendar .tribe-events-category-headless, .type-tribe_events.tribe-events-category-headless h2, .tribe-events-category-headless > div.hentry.vevent > h3.entry-title, .tribe-events-mobile.tribe-events-category-headless h4 { background-color: #0ecad4; border-right: 5px solid transparent; color: #fff; line-height: 1.4em; padding-left: 5px; padding-bottom: 2px; } .tribe-events-calendar .tribe-event-featured.tribe-events-category-headless, #tribe-events-content table.tribe-events-calendar .type-tribe_events.tribe-event-featured.tribe-events-category-headless, .tribe-grid-body div[id*='tribe-events-event-'][class*='tribe-events-category-'].tribe-events-week-hourly-single.tribe-event-featured { border-right: 5px solid #0ea0d7 } .tribe-events-list-widget li.tribe-events-category-headless a:link, .tribe-events-list-widget li.tribe-events-category-headless a:visited, li.tribe-events-list-widget-events.tribe-events-category-headless a:link, li.tribe-events-list-widget-events.tribe-events-category-headless a:visited, .tribe-events-category-headless h2.tribe-events-list-event-title.entry-title a, .tribe-events-category-headless h2.tribe-events-list-event-title a, .tribe-events-category-headless h3.tribe-events-list-event-title a, .tribe-event-featured .tribe-events-category-headless h3.tribe-events-list-event-title a, .tribe-events-list .tribe-events-loop .tribe-event-featured.tribe-events-category-headless h3.tribe-events-list-event-title a { width: auto; display: block; } .tribe-events-category-wordpress h2.tribe-events-list-event-title.entry-title a, .tribe-events-category-wordpress h2.tribe-events-list-event-title a, .tribe-events-category-wordpress h3.tribe-events-list-event-title a, .tribe-event-featured .tribe-events-category-wordpress h3.tribe-events-list-event-title a, .tribe-events-list .tribe-events-loop .tribe-event-featured.tribe-events-category-wordpress h3.tribe-events-list-event-title a, .tribe-events-shortcode .tribe-events-month table .type-tribe_events.tribe-events-category-wordpress, .tribe-events-list .tribe-events-loop .tribe-event-featured.tribe-events-category-wordpress h3.tribe-events-list-event-title a:hover, #tribe-events-content table.tribe-events-calendar .type-tribe_events.tribe-events-category-wordpress.tribe-event-featured h3.tribe-events-month-event-title a:hover, .tribe-events-list-widget li.tribe-events-category-wordpress a:link, .tribe-events-list-widget li.tribe-events-category-wordpress a:visited, li.tribe-events-list-widget-events.tribe-events-category-wordpress a:link, li.tribe-events-list-widget-events.tribe-events-category-wordpress a:visited, .teccc-legend li.tribe_events_cat-wordpress a, .tribe-common article.tribe_events_cat-wordpress h3 a, .tribe-common article.tribe_events_cat-wordpress h3 a:link, .tribe-common article.tribe_events_cat-wordpress h3 a:visited, article.tribe-events-calendar-month__multiday-event.tribe_events_cat-wordpress h3, #tribe-events-content table.tribe-events-calendar .tribe-event-featured.tribe-events-category-wordpress .tribe-events-month-event-title a, .teccc-legend li.tribe-events-category-wordpress a, .tribe-events-calendar .tribe-events-category-wordpress a, #tribe-events-content .teccc-legend li.tribe-events-category-wordpress a, #tribe-events-content .tribe-events-calendar .tribe-events-category-wordpress a, .type-tribe_events.tribe-events-category-wordpress h2 a, .tribe-events-category-wordpress > div.hentry.vevent > h3.entry-title a, .tribe-events-mobile.tribe-events-category-wordpress h4 a { color: #fff; text-decoration: none; } .tribe-events-category-wordpress h3.tribe-events-list-event-title, .tribe-events-shortcode .tribe-events-month table .type-tribe_events.tribe-events-category-wordpress, .tribe-events-list-widget li.tribe-events-category-wordpress h4, li.tribe-events-list-widget-events.tribe-events-category-wordpress h4, .teccc-legend li.tribe_events_cat-wordpress, article.tribe_events_cat-wordpress header.tribe-events-widget-events-list__event-header h3, article.tribe-events-calendar-month__calendar-event.tribe_events_cat-wordpress h3, article.tribe-events-calendar-month__multiday-event.tribe_events_cat-wordpress .tribe-events-calendar-month__multiday-event-bar-inner, article.tribe-events-calendar-month-mobile-events__mobile-event.tribe_events_cat-wordpress h3, article.tribe-events-calendar-day__event.tribe_events_cat-wordpress h3, article.tribe-events-calendar-list__event.tribe_events_cat-wordpress h3, article.tribe-events-calendar-latest-past__event.tribe_events_cat-wordpress h3, .events-archive.events-gridview #tribe-events-content table .type-tribe_events.tribe-events-category-wordpress, .teccc-legend li.tribe-events-category-wordpress, .tribe-events-calendar .tribe-events-category-wordpress, .type-tribe_events.tribe-events-category-wordpress h2, .tribe-events-category-wordpress > div.hentry.vevent > h3.entry-title, .tribe-events-mobile.tribe-events-category-wordpress h4 { background-color: #7e5cef; border-right: 5px solid transparent; color: #fff; line-height: 1.4em; padding-left: 5px; padding-bottom: 2px; } .tribe-events-calendar .tribe-event-featured.tribe-events-category-wordpress, #tribe-events-content table.tribe-events-calendar .type-tribe_events.tribe-event-featured.tribe-events-category-wordpress, .tribe-grid-body div[id*='tribe-events-event-'][class*='tribe-events-category-'].tribe-events-week-hourly-single.tribe-event-featured { border-right: 5px solid #0ea0d7 } .tribe-events-list-widget li.tribe-events-category-wordpress a:link, .tribe-events-list-widget li.tribe-events-category-wordpress a:visited, li.tribe-events-list-widget-events.tribe-events-category-wordpress a:link, li.tribe-events-list-widget-events.tribe-events-category-wordpress a:visited, .tribe-events-category-wordpress h2.tribe-events-list-event-title.entry-title a, .tribe-events-category-wordpress h2.tribe-events-list-event-title a, .tribe-events-category-wordpress h3.tribe-events-list-event-title a, .tribe-event-featured .tribe-events-category-wordpress h3.tribe-events-list-event-title a, .tribe-events-list .tribe-events-loop .tribe-event-featured.tribe-events-category-wordpress h3.tribe-events-list-event-title a { width: auto; display: block; } /* End The Events Calendar: Category Colors CSS */ </style> <script src="https://wpengine.com/builders/wp-content/plugins/wpe-builders/build/site-search/search-toggle.js?ver=89e939e496109752ba17" id="wpe-site-search-view-script-js" defer data-wp-strategy="defer"></script> <link rel="https://api.w.org/" href="https://wpengine.com/builders/wp-json/" /><link rel="alternate" title="JSON" type="application/json" href="https://wpengine.com/builders/wp-json/wp/v2/posts/31676" /><link rel="EditURI" type="application/rsd+xml" title="RSD" href="https://wpengine.com/builders/xmlrpc.php?rsd" /> <link rel='shortlink' href='https://wpengine.com/builders/?p=31676' /> <link rel="alternate" title="oEmbed (JSON)" type="application/json+oembed" href="https://wpengine.com/builders/wp-json/oembed/1.0/embed?url=https%3A%2F%2Fwpengine.com%2Fbuilders%2Fon-demand-isr-support-for-next-js-faust-js-on-wp-engines-headless-wordpress-platform%2F" /> <link rel="alternate" title="oEmbed (XML)" type="text/xml+oembed" href="https://wpengine.com/builders/wp-json/oembed/1.0/embed?url=https%3A%2F%2Fwpengine.com%2Fbuilders%2Fon-demand-isr-support-for-next-js-faust-js-on-wp-engines-headless-wordpress-platform%2F&format=xml" /> <meta name="tec-api-version" content="v1"><meta name="tec-api-origin" content="https://wpengine.com/builders"><link rel="alternate" href="https://wpengine.com/builders/wp-json/tribe/events/v1/" /> <script src="https://cdn.usefathom.com/script.js" data-site="GPPWOCQJ" defer></script> <script id="wp-load-polyfill-importmap"> ( HTMLScriptElement.supports && HTMLScriptElement.supports("importmap") ) || document.write( '<script src="https://wpengine.com/builders/wp-includes/js/dist/vendor/wp-polyfill-importmap.min.js?ver=1.8.2"></scr' + 'ipt>' ); </script> <script type="importmap" id="wp-importmap"> {"imports":{"@wordpress\/interactivity":"https:\/\/wpengine.com\/builders\/wp-includes\/js\/dist\/interactivity.min.js?ver=6.6.1"}} </script> <script type="module" src="https://wpengine.com/builders/wp-includes/blocks/navigation/view.min.js?ver=6.6.1" id="@wordpress/block-library/navigation-js-module"></script> <link rel="modulepreload" href="https://wpengine.com/builders/wp-includes/js/dist/interactivity.min.js?ver=6.6.1" id="@wordpress/interactivity-js-modulepreload"><style id='wp-fonts-local'> @font-face{font-family:"Open Sans";font-style:normal;font-weight:100 900;font-display:block;src:url('https://wpengine.com/builders/wp-content/themes/builders/assets/fonts/OpenSans-Variable.woff2') format('woff2');font-stretch:normal;} @font-face{font-family:"Open Sans";font-style:italic;font-weight:100 900;font-display:block;src:url('https://wpengine.com/builders/wp-content/themes/builders/assets/fonts/OpenSans-Italic-Variable.woff2') format('woff2');font-stretch:normal;} @font-face{font-family:Inter;font-style:normal;font-weight:100;font-display:fallback;src:url('https://wpengine.com/builders/wp-content/uploads/fonts/UcCO3FwrK3iLTeHuS_fvQtMwCp50KnMw2boKoduKmMEVuLyeMZ1rib2Bg-4.woff2') format('woff2');} @font-face{font-family:Inter;font-style:normal;font-weight:200;font-display:fallback;src:url('https://wpengine.com/builders/wp-content/uploads/fonts/UcCO3FwrK3iLTeHuS_fvQtMwCp50KnMw2boKoduKmMEVuDyfMZ1rib2Bg-4.woff2') format('woff2');} @font-face{font-family:Inter;font-style:normal;font-weight:300;font-display:fallback;src:url('https://wpengine.com/builders/wp-content/uploads/fonts/UcCO3FwrK3iLTeHuS_fvQtMwCp50KnMw2boKoduKmMEVuOKfMZ1rib2Bg-4.woff2') format('woff2');} @font-face{font-family:Inter;font-style:normal;font-weight:400;font-display:fallback;src:url('https://wpengine.com/builders/wp-content/uploads/fonts/UcCO3FwrK3iLTeHuS_fvQtMwCp50KnMw2boKoduKmMEVuLyfMZ1rib2Bg-4.woff2') format('woff2');} @font-face{font-family:Inter;font-style:normal;font-weight:500;font-display:fallback;src:url('https://wpengine.com/builders/wp-content/uploads/fonts/UcCO3FwrK3iLTeHuS_fvQtMwCp50KnMw2boKoduKmMEVuI6fMZ1rib2Bg-4.woff2') format('woff2');} @font-face{font-family:Inter;font-style:normal;font-weight:600;font-display:fallback;src:url('https://wpengine.com/builders/wp-content/uploads/fonts/UcCO3FwrK3iLTeHuS_fvQtMwCp50KnMw2boKoduKmMEVuGKYMZ1rib2Bg-4.woff2') format('woff2');} @font-face{font-family:Inter;font-style:normal;font-weight:700;font-display:fallback;src:url('https://wpengine.com/builders/wp-content/uploads/fonts/UcCO3FwrK3iLTeHuS_fvQtMwCp50KnMw2boKoduKmMEVuFuYMZ1rib2Bg-4.woff2') format('woff2');} @font-face{font-family:Inter;font-style:normal;font-weight:800;font-display:fallback;src:url('https://wpengine.com/builders/wp-content/uploads/fonts/UcCO3FwrK3iLTeHuS_fvQtMwCp50KnMw2boKoduKmMEVuDyYMZ1rib2Bg-4.woff2') format('woff2');} @font-face{font-family:Inter;font-style:normal;font-weight:900;font-display:fallback;src:url('https://wpengine.com/builders/wp-content/uploads/fonts/UcCO3FwrK3iLTeHuS_fvQtMwCp50KnMw2boKoduKmMEVuBWYMZ1rib2Bg-4.woff2') format('woff2');} </style> <link rel="icon" href="https://wpengine.com/builders/wp-content/uploads/2024/05/wp-engine-favicon-32.png" sizes="32x32" /> <link rel="icon" href="https://wpengine.com/builders/wp-content/uploads/2024/05/wp-engine-favicon-32.png" sizes="192x192" /> <link rel="apple-touch-icon" href="https://wpengine.com/builders/wp-content/uploads/2024/05/wp-engine-favicon-32.png" /> <meta name="msapplication-TileImage" content="https://wpengine.com/builders/wp-content/uploads/2024/05/wp-engine-favicon-32.png" /> </head> <body class="post-template-default single single-post postid-31676 single-format-standard wp-custom-logo wp-embed-responsive tribe-no-js"> <div class="wp-site-blocks"><header class="site-header wpe-site-search-header wp-block-template-part"> <div class="wp-block-group alignfull has-base-background-color has-background has-global-padding is-layout-constrained wp-container-core-group-is-layout-3 wp-block-group-is-layout-constrained" style="padding-top:32px;padding-bottom:32px"> <div class="wp-block-group alignwide is-content-justification-space-between is-layout-flex wp-container-core-group-is-layout-2 wp-block-group-is-layout-flex"> <figure class="wp-block-image size-full is-resized"><a href="https://wpengine.com"><img decoding="async" width="348" height="68" src="https://wpengine.com/builders/wp-content/uploads/2024/05/WP-Engine-Horizontal@2x.png" alt="WP Engine logo" class="wp-image-31588" style="width:179px" srcset="https://wpengine.com/builders/wp-content/uploads/2024/05/WP-Engine-Horizontal@2x.png 348w, https://wpengine.com/builders/wp-content/uploads/2024/05/WP-Engine-Horizontal@2x-300x59.png 300w" sizes="(max-width: 348px) 100vw, 348px" /></a></figure> <div class="wp-block-group is-content-justification-right is-nowrap is-layout-flex wp-container-core-group-is-layout-1 wp-block-group-is-layout-flex"><nav class="is-responsive items-justified-left wp-block-navigation is-horizontal is-content-justification-left is-layout-flex wp-container-core-navigation-is-layout-1 wp-block-navigation-is-layout-flex" aria-label="Navigation" data-wp-interactive="core/navigation" data-wp-context='{"overlayOpenedBy":{"click":false,"hover":false,"focus":false},"type":"overlay","roleAttribute":"","ariaLabel":"Menu"}'><button aria-haspopup="dialog" aria-label="Open menu" class="wp-block-navigation__responsive-container-open " data-wp-on-async--click="actions.openMenuOnClick" data-wp-on--keydown="actions.handleMenuKeydown" ><svg width="24" height="24" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" aria-hidden="true" focusable="false"><rect x="4" y="7.5" width="16" height="1.5" /><rect x="4" y="15" width="16" height="1.5" /></svg></button> <div class="wp-block-navigation__responsive-container " id="modal-1" data-wp-class--has-modal-open="state.isMenuOpen" data-wp-class--is-menu-open="state.isMenuOpen" data-wp-watch="callbacks.initMenu" data-wp-on--keydown="actions.handleMenuKeydown" data-wp-on-async--focusout="actions.handleMenuFocusout" tabindex="-1" > <div class="wp-block-navigation__responsive-close" tabindex="-1"> <div class="wp-block-navigation__responsive-dialog" data-wp-bind--aria-modal="state.ariaModal" data-wp-bind--aria-label="state.ariaLabel" data-wp-bind--role="state.roleAttribute" > <button aria-label="Close menu" class="wp-block-navigation__responsive-container-close" data-wp-on-async--click="actions.closeMenuOnClick" ><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" width="24" height="24" aria-hidden="true" focusable="false"><path d="M13 11.8l6.1-6.3-1-1-6.1 6.2-6.1-6.2-1 1 6.1 6.3-6.5 6.7 1 1 6.5-6.6 6.5 6.6 1-1z"></path></svg></button> <div class="wp-block-navigation__responsive-container-content" data-wp-watch="callbacks.focusFirstElement" id="modal-1-content"> <ul class="wp-block-navigation__container is-responsive items-justified-left wp-block-navigation"><li data-wp-context="{ "submenuOpenedBy": { "click": false, "hover": false, "focus": false }, "type": "submenu" }" data-wp-interactive="core/navigation" data-wp-on--focusout="actions.handleMenuFocusout" data-wp-on--keydown="actions.handleMenuKeydown" data-wp-on-async--mouseenter="actions.openMenuOnHover" data-wp-on-async--mouseleave="actions.closeMenuOnHover" data-wp-watch="callbacks.initMenu" tabindex="-1" class=" wp-block-navigation-item has-child open-on-hover-click wp-block-navigation-submenu"><a class="wp-block-navigation-item__content" href="https://wpengine.com/builders/">Resources</a><button data-wp-bind--aria-expanded="state.isMenuOpen" data-wp-on-async--click="actions.toggleMenuOnClick" aria-label="Resources submenu" class="wp-block-navigation__submenu-icon wp-block-navigation-submenu__toggle" ><svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" viewBox="0 0 12 12" fill="none" aria-hidden="true" focusable="false"><path d="M1.50002 4L6.00002 8L10.5 4" stroke-width="1.5"></path></svg></button><ul data-wp-on-async--focus="actions.openMenuOnFocus" class="wp-block-navigation__submenu-container wp-block-navigation-submenu"><li class=" wp-block-navigation-item wp-block-navigation-link"><a class="wp-block-navigation-item__content" href="https://wpengine.com/builders/wordpress/"><span class="wp-block-navigation-item__label">WordPress</span></a></li><li class=" wp-block-navigation-item wp-block-navigation-link"><a class="wp-block-navigation-item__content" href="https://wpengine.com/builders/headless/"><span class="wp-block-navigation-item__label">Headless</span></a></li></ul></li><li class=" wp-block-navigation-item wp-block-navigation-link"><a class="wp-block-navigation-item__content" href="https://wpengine.com/builders/events/"><span class="wp-block-navigation-item__label">Events</span></a></li><li class=" wp-block-navigation-item wp-block-navigation-link"><a class="wp-block-navigation-item__content" href="https://wpengine.com/contact/"><span class="wp-block-navigation-item__label">Contact</span></a></li><li class="wp-block-navigation-item"> <ul class="wp-block-social-links has-normal-icon-size has-icon-color is-style-logos-only is-layout-flex wp-container-core-social-links-is-layout-1 wp-block-social-links-is-layout-flex"><li style="color: #002838; " class="wp-social-link wp-social-link-youtube has-mirage-color wp-block-social-link"><a rel="noopener nofollow" target="_blank" href="https://www.youtube.com/@WPEngineBuilders" class="wp-block-social-link-anchor"><svg width="24" height="24" viewBox="0 0 24 24" version="1.1" xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false"><path d="M21.8,8.001c0,0-0.195-1.378-0.795-1.985c-0.76-0.797-1.613-0.801-2.004-0.847c-2.799-0.202-6.997-0.202-6.997-0.202 h-0.009c0,0-4.198,0-6.997,0.202C4.608,5.216,3.756,5.22,2.995,6.016C2.395,6.623,2.2,8.001,2.2,8.001S2,9.62,2,11.238v1.517 c0,1.618,0.2,3.237,0.2,3.237s0.195,1.378,0.795,1.985c0.761,0.797,1.76,0.771,2.205,0.855c1.6,0.153,6.8,0.201,6.8,0.201 s4.203-0.006,7.001-0.209c0.391-0.047,1.243-0.051,2.004-0.847c0.6-0.607,0.795-1.985,0.795-1.985s0.2-1.618,0.2-3.237v-1.517 C22,9.62,21.8,8.001,21.8,8.001z M9.935,14.594l-0.001-5.62l5.404,2.82L9.935,14.594z"></path></svg><span class="wp-block-social-link-label screen-reader-text">WPEngineBuilders</span></a></li> <li style="color: #002838; " class="wp-social-link wp-social-link-x has-mirage-color wp-block-social-link"><a rel="noopener nofollow" target="_blank" href="https://x.com/wpebuilders" class="wp-block-social-link-anchor"><svg width="24" height="24" viewBox="0 0 24 24" version="1.1" xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false"><path d="M13.982 10.622 20.54 3h-1.554l-5.693 6.618L8.745 3H3.5l6.876 10.007L3.5 21h1.554l6.012-6.989L15.868 21h5.245l-7.131-10.378Zm-2.128 2.474-.697-.997-5.543-7.93H8l4.474 6.4.697.996 5.815 8.318h-2.387l-4.745-6.787Z" /></svg><span class="wp-block-social-link-label screen-reader-text">X</span></a></li></ul> </li></ul> </div> </div> </div> </div></nav> <div id="js-site-search" class="wpe-site-search wp-block-wpe-site-search"> <button id="js-site-search-toggle" aria-expanded="false" aria-controls="js-site-search-overlay" aria-haspopup="true" class="wpe-site-search__toggle"> <span class="screen-reader-text">Search</span> <svg id="js-site-search-open" class="wpe-site-search__icon wpe-site-search__icon-open" focusable="false" aria-hidden="true" xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><circle cx="11" cy="11" r="8"></circle><line x1="21" y1="21" x2="16.65" y2="16.65"></line></svg> <svg id="js-site-search-close" class="wpe-site-search__icon wpe-site-search__icon-close" focusable="false" aria-hidden="true" xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><line x1="18" y1="6" x2="6" y2="18"></line><line x1="6" y1="6" x2="18" y2="18"></line></svg> </button><!-- .wpe-search__toggle --> </div><!-- .wpe-site-search --> <div id="js-site-search-overlay" class="wpe-site-search-overlay" aria-hidden="true"> <form role="search" method="get" class="wpe-site-search-form" action="https://wpengine.com/builders/"> <label class="wpe-site-search-label"> <span class="screen-reader-text">Search for:</span> <input type="search" class="search-field" placeholder="" value="" name="s" title="Search for:" /> </label> <input type="submit" class="wpe-site-search-form-submit" value="Search" /> </form> </div><!-- .wpe-site-search-overlay --> </div> </div> </div> </header> <main class="wp-block-group site-content has-global-padding is-layout-constrained wp-block-group-is-layout-constrained" style="margin-top:0;padding-bottom:80px"> <div class="wp-block-group alignfull has-base-color has-text-color has-global-padding is-layout-constrained wp-container-core-group-is-layout-5 wp-block-group-is-layout-constrained has-background" style="padding-top:100px;padding-right:var(--wp--preset--spacing--30);padding-bottom:200px;padding-left:var(--wp--preset--spacing--30);background-image:url('https://wpengine.com/builders/wp-content/uploads/2024/05/WPE-Builders-HeaderBackground.png');background-size:cover;"><h1 class="has-text-align-center wp-block-post-title has-max-60-font-size">On-Demand ISR Support for Next.js/Faust.js on WP engine’s headless WordPress Platform</h1> <div class="wp-block-group is-content-justification-center is-nowrap is-layout-flex wp-container-core-group-is-layout-4 wp-block-group-is-layout-flex" style="line-height:1"><div class="wp-block-avatar"><a href="https://wpengine.com/builders/author/francis-agultowpengine-com/" target="_self" class="wp-block-avatar__link"><img alt='Francis Agulto Avatar' src='https://secure.gravatar.com/avatar/c24a68b84c9ad2b53c633d14917d8298?s=50&d=mm&r=g' srcset='https://secure.gravatar.com/avatar/c24a68b84c9ad2b53c633d14917d8298?s=100&d=mm&r=g 2x' class='avatar avatar-50 photo wp-block-avatar__image has-border-color has-base-border-color' height='50' width='50' style="border-radius:50px;border-width:2px;" decoding='async'/></a></div> <div class="wp-block-post-author has-small-font-size"><div class="wp-block-post-author__content"><p class="wp-block-post-author__name">Francis Agulto</p></div></div> <p>·</p> <div class="wp-block-post-date has-small-font-size"><time datetime="2024-08-12T08:19:12-05:00">Aug 12, 2024</time></div></div> </div> <div class="wp-block-group alignwide has-global-padding is-layout-constrained wp-container-core-group-is-layout-15 wp-block-group-is-layout-constrained" style="margin-top:0px"> <div class="wp-block-group alignwide has-negative-top-margin is-style-boxshadow has-base-background-color has-background is-layout-flow wp-block-group-is-layout-flow" style="padding-top:0px;padding-right:0px;padding-bottom:0px;padding-left:0px"> <div class="wp-block-group is-layout-flow wp-block-group-is-layout-flow" style="margin-top:0px;padding-top:80px;padding-right:var(--wp--preset--spacing--30);padding-left:var(--wp--preset--spacing--30)"><div class="entry-content wp-block-post-content has-global-padding is-layout-constrained wp-block-post-content-is-layout-constrained"> <p>WP engine’s headless WordPress hosting platform is the go-to end-to-end solution for the headless approach. In this article, I will discuss and guide you through the easy implementation of the latest feature on the platform: Support for On-Demand ISR on Next.js/Faust.js. By the end of this article, you will have a better understanding of On-Demand ISR and using the headless WP platform to support it with Next.js/Faust.js.</p> <div class="wp-block-group has-polar-background-color has-background is-layout-flow wp-container-core-group-is-layout-6 wp-block-group-is-layout-flow" style="padding-top:var(--wp--preset--spacing--30);padding-right:var(--wp--preset--spacing--40);padding-bottom:var(--wp--preset--spacing--30);padding-left:var(--wp--preset--spacing--40)"> <p class="has-large-font-size"><strong>Table of Contents</strong></p> <ul class="wp-block-list" id="Prerequisites"> <li><a href="#prerequisites">Prerequisites</a></li> <li><a href="#what-is-on-demand-isr">What is On-Demand ISR?</a></li> <li><a href="#why-use-it-in-headlesswp">Why Use it in headless WordPress?</a></li> <li><a href="#configuring-with-headlesswp">Configuring Next.js with the headless WP Platform for On-Demand ISR</a></li> <li><a href="#atlas-next-package">Atlas-Next Package</a></li> <li><a href="#faustjs-wrapper">Faust.js Wrapper</a></li> <li><a href="#create-api-route">Create an API Route</a></li> <li><a href="#use-api-to-configure-cache-revalidation">Use the API route to configure cache revalidation</a></li> <li><a href="#headlesswp-user-portal">Headless WP User Portal</a></li> <li><a href="#limitations">Limitations</a></li> <li><a href="#conclusions">Conclusions</a></li> </ul> </div> <p>If you prefer the video format of this video, you can access it here:</p> <iframe class="youtube-video" src="https://www.youtube.com/embed/v6QExVbX_UM?si=U9T7daOFDPHUyn1B" title="YouTube video player" frameborder="0" style="display: block; margin: auto; width: 100%; height: 400px;" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe> <h2 class="wp-block-heading" id="prerequisites"><strong>Prerequisites</strong></h2> <p>Before reading this article, you should have the following prerequisites checked off:</p> <ul class="wp-block-list"> <li>Basic knowledge of Next.js and Faust.js.</li> <li>A WP engine headless WordPress account and environment set up.</li> <li>Node.js and npm are installed on your local machine.</li> </ul> <p>If you do not and need a basic understanding of Next.js and Faust.js, please visit the docs:</p> <p><a href="https://nextjs.org/docs">https://nextjs.org/docs</a></p> <p><a href="https://faustjs.org/tutorial/get-started-with-faust">https://faustjs.org/tutorial/get-started-with-faust</a></p> <div class="wp-block-group has-base-color has-heliotrope-background-color has-text-color has-background has-link-color wp-elements-60580c77f35127ab4c58efd3ae854863 has-global-padding is-layout-constrained wp-container-core-group-is-layout-8 wp-block-group-is-layout-constrained" style="border-radius:12px;margin-bottom:var(--wp--preset--spacing--30);padding-top:var(--wp--preset--spacing--30);padding-right:var(--wp--preset--spacing--30);padding-bottom:var(--wp--preset--spacing--30);padding-left:var(--wp--preset--spacing--30)"> <div class="wp-block-group alignwide is-content-justification-left is-layout-flex wp-container-core-group-is-layout-7 wp-block-group-is-layout-flex" style="padding-top:0;padding-right:0;padding-bottom:0;padding-left:0"> <p style="font-size:26px;font-style:normal;font-weight:700;letter-spacing:-1px;line-height:1">Headless<br>Platform</p> <p class="has-small-font-size wp-container-content-1" style="line-height:1.5">The all-in-one platform for <br>radically fast headless sites.</p> <div class="wp-block-buttons is-content-justification-right is-nowrap is-layout-flex wp-container-core-buttons-is-layout-1 wp-block-buttons-is-layout-flex"> <div class="wp-block-button is-style-outline-base"><a class="wp-block-button__link wp-element-button" href="https://wpeng.in/headless-platform/" style="border-radius:99px;padding-top:10px;padding-right:24px;padding-bottom:10px;padding-left:24px" target="_blank" rel="noreferrer noopener">Try for free →</a></div> </div> </div> </div> <h2 class="wp-block-heading" id="what-is-on-demand-isr">What is On-Demand ISR?</h2> <p><a href="https://nextjs.org/docs/pages/building-your-application/data-fetching/incremental-static-regeneration#on-demand-revalidation">On-Demand Incremental Static Regeneration (ISR)</a> is a feature that allows you to manually purge the Next.js cache for specific pages, enabling more dynamic and timely updates to your site. Typically, in regular ISR when you set a revalidate time, such as 60 seconds, all visitors will see the same generated version of your site for that duration. The cache is only invalidated when someone visits the page after the revalidation period has passed.</p> <p>With the introduction of On-Demand ISR in Next.js version 12.2.0, you can now trigger cache invalidation manually, providing greater flexibility in updating your site. This is particularly useful when:</p> <ul class="wp-block-list"> <li>Content from your headless CMS is created or updated.</li> <li>E-commerce metadata changes, such as price, description, category, or reviews, are made.</li> </ul> <p>This feature streamlines the process of reflecting changes on your site in real-time, ensuring that your content is always fresh and up-to-date.</p> <h2 class="wp-block-heading" id="why-use-it-in-headlesswp">Why Use it in headless WordPress?</h2> <p>In headless WordPress, the front end is decoupled from the WordPress backend, often using Next.js and Faust.js to render the website. This architecture offers several advantages, such as potential for improved performance, enhanced security, and greater flexibility in choosing front-end technologies.</p> <p>However, one challenge with headless WordPress is ensuring that content changes in WordPress are reflected on the front end without sacrificing performance. This is where On-Demand ISR becomes crucial. By leveraging On-Demand ISR, you can achieve the following benefits:</p> <p><strong>Up-to-date Content:</strong> On-Demand ISR allows your site to fetch the latest content updates from WordPress manually, as needed. Unlike regular ISR, which checks for updates at specified intervals, On-Demand ISR lets you trigger cache invalidation whenever content is created or updated in WordPress. This ensures that users see the most recent content without waiting for a revalidation period.</p> <p><strong>Enhanced Performance:</strong> Since On-Demand ISR updates only the specific pages that need regeneration at the moment they are triggered, your site remains fast and responsive. Initial load times are minimized, and only the changed content is updated, reducing server load and build times.</p> <p><strong>SEO Benefits:</strong> Static pages are highly favored by search engines due to their speed and reliability. With On-Demand ISR, you maintain the SEO advantages of static generation while ensuring that your content is always fresh and relevant, as updates are reflected immediately after they are triggered.</p> <p><strong>Scalability:</strong> On-Demand ISR enables your site to handle large volumes of content efficiently. Whether you’re running a blog with frequent updates or an e-commerce site with dynamic product listings, On-Demand ISR ensures that your site scales seamlessly.</p> <p>All those benefits got me stoked! Let’s get it on our Next.js and Faust.js sites!</p> <h2 class="wp-block-heading" id="configuring-with-headlesswp"><strong>Configuring Next.js with the headless WP Platform for On-Demand ISR</strong></h2> <p>Let’s configure our Next.js application to work with On-Demand ISR.</p> <p>Here is the docs link to the <a href="https://developers.wpengine.com/docs/atlas/framework-guides/next-js/nextjs-isr-support/#on-demand-incremental-static-regeneration">headless WordPress platform support for On-Demand ISR.</a></p> <h3 class="wp-block-heading" id="atlas-next-package">Atlas-Next Package</h3> <p>In your Next.js project, go to your terminal and install the <a href="https://www.npmjs.com/package/@wpengine/atlas-next">@wpengine/atlas-next package</a>:</p> <p><code>npm install --save @wpengine/atlas-next</code></p> <p>This package provides improved support on the headless WP platform. Once you install it, ensure it is in your project by navigating to your <code>package.json</code> file at the root of your project:</p> <pre class="wp-block-code" aria-describedby="shcb-language-3" data-shcb-language-name="JSON / JSON with Comments" data-shcb-language-slug="json"><span><code class="hljs language-json shcb-code-table shcb-line-numbers"><span class='shcb-loc'><span>{ </span></span><span class='shcb-loc'><span> <span class="hljs-attr">"name"</span>: <span class="hljs-string">"atlas-on-demand-isr"</span>, </span></span><span class='shcb-loc'><span> <span class="hljs-attr">"version"</span>: <span class="hljs-string">"0.1.0"</span>, </span></span><span class='shcb-loc'><span> <span class="hljs-attr">"private"</span>: <span class="hljs-literal">true</span>, </span></span><span class='shcb-loc'><span> <span class="hljs-attr">"scripts"</span>: { </span></span><span class='shcb-loc'><span> <span class="hljs-attr">"dev"</span>: <span class="hljs-string">"next dev"</span>, </span></span><span class='shcb-loc'><span> <span class="hljs-attr">"build"</span>: <span class="hljs-string">"next build"</span>, </span></span><span class='shcb-loc'><span> <span class="hljs-attr">"start"</span>: <span class="hljs-string">"next start"</span>, </span></span><span class='shcb-loc'><span> <span class="hljs-attr">"lint"</span>: <span class="hljs-string">"next lint"</span> </span></span><span class='shcb-loc'><span> }, </span></span><span class='shcb-loc'><span> <span class="hljs-attr">"dependencies"</span>: { </span></span><span class='shcb-loc'><span> <span class="hljs-attr">"@wpengine/atlas-next"</span>: <span class="hljs-string">"^1.3.0-beta.0"</span>, </span></span><span class='shcb-loc'><span> <span class="hljs-attr">"next"</span>: <span class="hljs-string">"14.2.4"</span>, </span></span><span class='shcb-loc'><span> <span class="hljs-attr">"react"</span>: <span class="hljs-string">"^18"</span>, </span></span><span class='shcb-loc'><span> <span class="hljs-attr">"react-dom"</span>: <span class="hljs-string">"^18"</span> </span></span><span class='shcb-loc'><span> }, </span></span><span class='shcb-loc'><span> <span class="hljs-attr">"devDependencies"</span>: { </span></span><span class='shcb-loc'><span> <span class="hljs-attr">"eslint"</span>: <span class="hljs-string">"^8"</span>, </span></span><span class='shcb-loc'><span> <span class="hljs-attr">"eslint-config-next"</span>: <span class="hljs-string">"14.2.4"</span>, </span></span><span class='shcb-loc'><span> <span class="hljs-attr">"postcss"</span>: <span class="hljs-string">"^8"</span>, </span></span><span class='shcb-loc'><span> <span class="hljs-attr">"tailwindcss"</span>: <span class="hljs-string">"^3.4.1"</span> </span></span><span class='shcb-loc'><span> } </span></span><span class='shcb-loc'><span>} </span></span><span class='shcb-loc'><span> </span></span></code></span><small class="shcb-language" id="shcb-language-3"><span class="shcb-language__label">Code language:</span> <span class="shcb-language__name">JSON / JSON with Comments</span> <span class="shcb-language__paren">(</span><span class="shcb-language__slug">json</span><span class="shcb-language__paren">)</span></small></pre> <p>Now that you have verified the proper installation, staying at the root of your project, modify your <code>next.config.js</code> file like so:</p> <pre class="wp-block-code" aria-describedby="shcb-language-4" data-shcb-language-name="PHP" data-shcb-language-slug="php"><span><code class="hljs language-php shcb-code-table shcb-line-numbers"><span class='shcb-loc'><span><span class="hljs-keyword">const</span> { withAtlasConfig } = <span class="hljs-keyword">require</span>(<span class="hljs-string">"@wpengine/atlas-next"</span>); </span></span><span class='shcb-loc'><span> </span></span><span class='shcb-loc'><span><span class="hljs-comment">/** <span class="hljs-doctag">@type</span> {import('next').NextConfig} */</span> </span></span><span class='shcb-loc'><span> </span></span><span class='shcb-loc'><span><span class="hljs-keyword">const</span> nextConfig = { </span></span><span class='shcb-loc'><span> </span></span><span class='shcb-loc'><span> <span class="hljs-comment">// Your existing Next.js config</span> </span></span><span class='shcb-loc'><span> </span></span><span class='shcb-loc'><span>}; </span></span><span class='shcb-loc'><span> </span></span><span class='shcb-loc'><span>module.exports = withAtlasConfig(nextConfig); </span></span></code></span><small class="shcb-language" id="shcb-language-4"><span class="shcb-language__label">Code language:</span> <span class="shcb-language__name">PHP</span> <span class="shcb-language__paren">(</span><span class="shcb-language__slug">php</span><span class="shcb-language__paren">)</span></small></pre> <h3 class="wp-block-heading" id="faustjs-wrapper"><strong>Faust.js Wrapper</strong> and Next.js/React.js Versions</h3> <p>If you are using Faust.js, please note that you need to update your Next.js to a minimum of 13.5.1 and React versions to 18.3.1 for this feature to work in Faust. <strong><em>The <code>npx</code> utility command that pulls down the Faust.js boilerplate from the Faust docs comes with Next.js 12 by default. So please change this if using that package.</em></strong></p> <p>Following the update to your versions, all you need to do is modify your <code>next.config.js</code> file using the <code>withFaust</code> wrapper:</p> <pre class="wp-block-code" aria-describedby="shcb-language-5" data-shcb-language-name="PHP" data-shcb-language-slug="php"><span><code class="hljs language-php shcb-code-table shcb-line-numbers"><span class='shcb-loc'><span><span class="hljs-keyword">const</span> { withFaust } = <span class="hljs-keyword">require</span>(<span class="hljs-string">"@faustwp/core"</span>) </span></span><span class='shcb-loc'><span><span class="hljs-keyword">const</span> { withAtlasConfig } = <span class="hljs-keyword">require</span>(<span class="hljs-string">"@wpengine/atlas-next"</span>) </span></span><span class='shcb-loc'><span> </span></span><span class='shcb-loc'><span><span class="hljs-comment">/** <span class="hljs-doctag">@type</span> {import('next').NextConfig} */</span> </span></span><span class='shcb-loc'><span><span class="hljs-keyword">const</span> nextConfig = { </span></span><span class='shcb-loc'><span> <span class="hljs-comment">// Your existing Next.js config</span> </span></span><span class='shcb-loc'><span>} </span></span><span class='shcb-loc'><span> </span></span><span class='shcb-loc'><span>module.exports = withFaust(withAtlasConfig(nextConfig)) </span></span><span class='shcb-loc'><span> </span></span></code></span><small class="shcb-language" id="shcb-language-5"><span class="shcb-language__label">Code language:</span> <span class="shcb-language__name">PHP</span> <span class="shcb-language__paren">(</span><span class="shcb-language__slug">php</span><span class="shcb-language__paren">)</span></small></pre> <p>Next, we need to verify that it works. Run your app in dev mode via npm run dev and you should see this output in your terminal:</p> <figure class="wp-block-image size-large"><img fetchpriority="high" decoding="async" width="1024" height="405" src="https://wpengine.com/builders/wp-content/uploads/2024/08/Screenshot-2024-08-08-at-10.28.23 AM-1024x405.png" alt="" class="wp-image-31677" srcset="https://wpengine.com/builders/wp-content/uploads/2024/08/Screenshot-2024-08-08-at-10.28.23 AM-1024x405.png 1024w, https://wpengine.com/builders/wp-content/uploads/2024/08/Screenshot-2024-08-08-at-10.28.23 AM-300x119.png 300w, https://wpengine.com/builders/wp-content/uploads/2024/08/Screenshot-2024-08-08-at-10.28.23 AM-768x304.png 768w, https://wpengine.com/builders/wp-content/uploads/2024/08/Screenshot-2024-08-08-at-10.28.23 AM-1536x608.png 1536w, https://wpengine.com/builders/wp-content/uploads/2024/08/Screenshot-2024-08-08-at-10.28.23 AM.png 1950w" sizes="(max-width: 1024px) 100vw, 1024px" /></figure> <p>Stoked! It works!</p> <h3 class="wp-block-heading" id="create-api-route">Create an API route</h3> <p>The first thing we need to do is create an API route. This will allow you to pass the path to be revalidated as a parameter.</p> <p><strong>Step 1.</strong> Create the API route file: Navigate to the <code>pages/api </code>directory in your Next.js project and create a new file named <code>revalidate.js</code>.</p> <p><strong>Step 2.</strong> Add the API Route code: Open <code>revalidate.js</code> and add the following code:</p> <pre class="wp-block-code" aria-describedby="shcb-language-6" data-shcb-language-name="JavaScript" data-shcb-language-slug="javascript"><span><code class="hljs language-javascript shcb-code-table shcb-line-numbers"><span class='shcb-loc'><span><span class="hljs-keyword">export</span> <span class="hljs-keyword">default</span> <span class="hljs-keyword">async</span> <span class="hljs-function"><span class="hljs-keyword">function</span> <span class="hljs-title">handler</span>(<span class="hljs-params">req, res</span>) </span>{ </span></span><span class='shcb-loc'><span> <span class="hljs-comment">// Check for a secret token to authenticate the request</span> </span></span><span class='shcb-loc'><span> <span class="hljs-keyword">if</span> (req.query.secret !== process.env.MY_SECRET_TOKEN) { </span></span><span class='shcb-loc'><span> <span class="hljs-keyword">return</span> res.status(<span class="hljs-number">401</span>).json({ <span class="hljs-attr">message</span>: <span class="hljs-string">'Invalid token'</span> }); </span></span><span class='shcb-loc'><span> } </span></span><span class='shcb-loc'><span> </span></span><span class='shcb-loc'><span> <span class="hljs-keyword">const</span> path = req.query.path; </span></span><span class='shcb-loc'><span> </span></span><span class='shcb-loc'><span> <span class="hljs-comment">// Ensure the path parameter is provided</span> </span></span><span class='shcb-loc'><span> <span class="hljs-keyword">if</span> (!path) { </span></span><span class='shcb-loc'><span> <span class="hljs-keyword">return</span> res.status(<span class="hljs-number">400</span>).json({ <span class="hljs-attr">message</span>: <span class="hljs-string">'Path query parameter is required'</span> }); </span></span><span class='shcb-loc'><span> } </span></span><span class='shcb-loc'><span> </span></span><span class='shcb-loc'><span> <span class="hljs-keyword">try</span> { </span></span><span class='shcb-loc'><span> <span class="hljs-comment">// Revalidate the specified path</span> </span></span><span class='shcb-loc'><span> <span class="hljs-keyword">await</span> res.revalidate(path); </span></span><span class='shcb-loc'><span> <span class="hljs-keyword">return</span> res.json({ <span class="hljs-attr">revalidated</span>: <span class="hljs-literal">true</span> }); </span></span><span class='shcb-loc'><span> } <span class="hljs-keyword">catch</span> (err) { </span></span><span class='shcb-loc'><span> <span class="hljs-keyword">return</span> res.status(<span class="hljs-number">500</span>).json({ <span class="hljs-attr">message</span>: <span class="hljs-string">'Error revalidating'</span>, <span class="hljs-attr">error</span>: err.message }); </span></span><span class='shcb-loc'><span> } </span></span><span class='shcb-loc'><span>} </span></span><span class='shcb-loc'><span> </span></span></code></span><small class="shcb-language" id="shcb-language-6"><span class="shcb-language__label">Code language:</span> <span class="shcb-language__name">JavaScript</span> <span class="shcb-language__paren">(</span><span class="shcb-language__slug">javascript</span><span class="shcb-language__paren">)</span></small></pre> <p><strong>Step 3.</strong> Configure the environment variables: Create a <code>.env.local</code> file in the root of your project if it does not exist already.</p> <p><strong>Step 4.</strong> Next, create a secret token. This code sets up an API route that checks for a secret token for security, validates the presence of the path parameter, and triggers the revalidation of the specified path.</p> <p>Once you have Node.js installed, you can use it to generate a secret token.</p> <p><strong>Open Your Terminal</strong>: Start by opening your terminal or command prompt.</p> <p><strong>Generate a Secret Token</strong>: Run the following command in your terminal:</p> <pre class="wp-block-code"><span><code class="hljs shcb-code-table shcb-line-numbers"><span class='shcb-loc'><span>node -e "console.log(require('crypto').randomBytes(32).toString('hex')) </span></span></code></span></pre> <p>This command uses the crypto module to generate a 32-byte random string in hexadecimal format. The output will be your secret token.</p> <p>Once the token is generated, copy and paste it into your <code>.env.local </code>file and give it an environment variable name e.g. <code>`REVALIDATION_SECRET` </code></p> <p>It should look like this: <code>REVALIDATION_SECRET=your-secret-key</code></p> <h3 class="wp-block-heading" id="use-api-to-configure-cache-revalidation">Use the API route to configure cache revalidation</h3> <p>To configure cache revalidation in the headless WordPress setup, you could follow one of the approaches below:</p> <p><strong>Use a webhook plugin</strong>: You can use plugins like <a href="https://wordpress.org/plugins/wp-webhooks/">WP Webhooks</a> to enable webhook functionality and trigger the API endpoint you’ve just created when relevant events occur, such as when a post is published or updated.</p> <p>When you have your secret key generated and need an API endpoint, append a query string parameter to it with the key and value pair, where the key is secret and the value is the secret token. For instance:</p> <p><a href="http://localhost:3000/api/revalidate?secret=your-secret-key&path=/your-route">https://your-wordpress-site.com/api/revalidate?secret=your-secret-key&path=/your-route</a></p> <p>This is the endpoint you can embed in a field that requires it when using a plugin like WP Webhooks. The field will correlate to whatever action will happen when the endpoint that is associated with this path is hit such as updating a post. </p> <p>Just a note, if you are developing locally and want to test it, you will have to manually visit the endpoint which typically spins up on port 3000 since the app will only know when to revalidate it on your local machine.</p> <p><strong>Set up WordPress hooks</strong>: You can also add actions in your WordPress theme or plugin to send requests to your Next.js API route. Here’s an example using the <code>wp_remote_post</code> function in <code>php</code>, which will send a POST request to the Next.js API route whenever a post is saved in WordPress, triggering the revalidation of the corresponding path:</p> <pre class="wp-block-code" aria-describedby="shcb-language-7" data-shcb-language-name="PHP" data-shcb-language-slug="php"><span><code class="hljs language-php shcb-code-table shcb-line-numbers"><span class='shcb-loc'><span><span class="hljs-function"><span class="hljs-keyword">function</span> <span class="hljs-title">trigger_revalidation</span><span class="hljs-params">($post_id)</span> </span>{ </span></span><span class='shcb-loc'><span> $url = <span class="hljs-string">'https://your-nextjs-site.com/api/revalidate?secret=your-secret-token&path='</span> . get_permalink($post_id); </span></span><span class='shcb-loc'><span> </span></span><span class='shcb-loc'><span> $response = wp_remote_post($url); </span></span><span class='shcb-loc'><span> </span></span><span class='shcb-loc'><span> <span class="hljs-keyword">if</span> (is_wp_error($response)) { </span></span><span class='shcb-loc'><span> error_log(<span class="hljs-string">'Error triggering revalidation: '</span> . $response->get_error_message()); </span></span><span class='shcb-loc'><span> } </span></span><span class='shcb-loc'><span>} </span></span><span class='shcb-loc'><span>add_action(<span class="hljs-string">'save_post'</span>, <span class="hljs-string">'trigger_revalidation'</span>); </span></span></code></span><small class="shcb-language" id="shcb-language-7"><span class="shcb-language__label">Code language:</span> <span class="shcb-language__name">PHP</span> <span class="shcb-language__paren">(</span><span class="shcb-language__slug">php</span><span class="shcb-language__paren">)</span></small></pre> <h3 class="wp-block-heading" id="headlesswp-user-portal">Headless WordPress Platform User Portal</h3> <p>We now have On-Demand ISR set up with the proper configuration. The last steps are to connect our remote repository to WP engine’s headless WP platform, git push any changes, and observe On-Demand ISR working in all its cache invalidation glory.</p> <p>If you have not connected your local project to a remote repository, go ahead and do so. WP engine headless platform supports GitHub, Bitbucket, and GitLab.</p> <figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="1024" height="329" src="https://wpengine.com/builders/wp-content/uploads/2024/08/Screenshot-2024-08-08-at-2.51.20 PM-1024x329.png" alt="" class="wp-image-31679" srcset="https://wpengine.com/builders/wp-content/uploads/2024/08/Screenshot-2024-08-08-at-2.51.20 PM-1024x329.png 1024w, https://wpengine.com/builders/wp-content/uploads/2024/08/Screenshot-2024-08-08-at-2.51.20 PM-300x96.png 300w, https://wpengine.com/builders/wp-content/uploads/2024/08/Screenshot-2024-08-08-at-2.51.20 PM-768x247.png 768w, https://wpengine.com/builders/wp-content/uploads/2024/08/Screenshot-2024-08-08-at-2.51.20 PM-1536x494.png 1536w, https://wpengine.com/builders/wp-content/uploads/2024/08/Screenshot-2024-08-08-at-2.51.20 PM-2048x658.png 2048w" sizes="(max-width: 1024px) 100vw, 1024px" /></figure> <p>Once you have connected your remote repository and added all your necessary environment variables, go ahead and build the app. If you have done this with an existing repo, you can <code>git push</code> the change, which will trigger a build.</p> <p>When the application is finished in the build step, you are on the <em>main</em> page of the WP engine headless WP portal. Navigate over to the <strong>Logs</strong> subpage:</p> <figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="1024" height="567" src="https://wpengine.com/builders/wp-content/uploads/2024/08/Screenshot-2024-08-08-at-2.57.03 PM-1024x567.png" alt="" class="wp-image-31680" srcset="https://wpengine.com/builders/wp-content/uploads/2024/08/Screenshot-2024-08-08-at-2.57.03 PM-1024x567.png 1024w, https://wpengine.com/builders/wp-content/uploads/2024/08/Screenshot-2024-08-08-at-2.57.03 PM-300x166.png 300w, https://wpengine.com/builders/wp-content/uploads/2024/08/Screenshot-2024-08-08-at-2.57.03 PM-768x425.png 768w, https://wpengine.com/builders/wp-content/uploads/2024/08/Screenshot-2024-08-08-at-2.57.03 PM-1536x850.png 1536w, https://wpengine.com/builders/wp-content/uploads/2024/08/Screenshot-2024-08-08-at-2.57.03 PM-2048x1134.png 2048w" sizes="(max-width: 1024px) 100vw, 1024px" /></figure> <p>In the <em>Logs</em> subpage, click the <strong>“Show logs”</strong> button on the Runtime option:</p> <figure class="wp-block-image size-full"><img loading="lazy" decoding="async" width="819" height="418" src="https://wpengine.com/builders/wp-content/uploads/2024/08/Screenshot-2024-08-08-at-3.00.45 PM.png" alt="" class="wp-image-31681" srcset="https://wpengine.com/builders/wp-content/uploads/2024/08/Screenshot-2024-08-08-at-3.00.45 PM.png 819w, https://wpengine.com/builders/wp-content/uploads/2024/08/Screenshot-2024-08-08-at-3.00.45 PM-300x153.png 300w, https://wpengine.com/builders/wp-content/uploads/2024/08/Screenshot-2024-08-08-at-3.00.45 PM-768x392.png 768w" sizes="(max-width: 819px) 100vw, 819px" /></figure> <p>You should see the same output focusing on line 6 as you did in your terminal to ensure it’s working properly:</p> <figure class="wp-block-image size-full"><img loading="lazy" decoding="async" width="689" height="337" src="https://wpengine.com/builders/wp-content/uploads/2024/08/Screenshot-2024-08-08-at-3.01.48 PM.png" alt="" class="wp-image-31682" srcset="https://wpengine.com/builders/wp-content/uploads/2024/08/Screenshot-2024-08-08-at-3.01.48 PM.png 689w, https://wpengine.com/builders/wp-content/uploads/2024/08/Screenshot-2024-08-08-at-3.01.48 PM-300x147.png 300w" sizes="(max-width: 689px) 100vw, 689px" /></figure> <p>Awesome!!! It is implemented and working in runtime. Now, when you edit or input new content in your WP backend, and then visit the live URL of the WP engine headless WP site you just deployed, the ISR should work on demand like so:</p> <figure class="wp-block-image size-full"><img loading="lazy" decoding="async" width="1920" height="1080" src="https://wpengine.com/builders/wp-content/uploads/2024/08/ODISR.gif" alt="" class="wp-image-31685"/></figure> <h2 class="wp-block-heading" id="limitations">Limitations</h2> <p>At the moment, the headless WP platform supports On-Demand ISR with the following limitations:</p> <ol class="wp-block-list"> <li><strong>Requires @wpengine/atlas-next package</strong>: To enable On-Demand ISR on Atlas, you must use the <code>@wpenngine/atlas-next</code> package and follow the setup steps outlined in the previous sections of this document.</li> <li><strong>On-demand ISR for App Router is not supported</strong>: The App Router is a new routing system in Next.js that enhances routing capabilities with features like server components and nested layouts. However, Atlas currently supports On-Demand ISR only in the context of the traditional Pages Router. This means that methods like <code>revalidatePath</code> and <code>revalidateTag</code>, which are used for revalidation in the App Router, are not compatible with the headless WP platform’s ISR mechanism. For more details on the App Router and its data fetching methods, you can refer to the Next.js documentation <a href="https://nextjs.org/docs/app/building-your-application/data-fetching/fetching-caching-and-revalidating">here</a>.</li> <li><strong>Rewrites are not supported</strong>: Rewrites in Next.js allow you to change the destination URL of a request without altering the URL visible to the user. However, On-Demand ISR on the headless WP platform does not support rewrites. This means that if your Next.js application relies on rewrites, the On-Demand ISR feature might not function as expected. You can learn more about rewrites <a href="https://nextjs.org/docs/pages/api-reference/next-config-js/rewrites">here</a>.</li> <li><strong>Not compatible with Next.js I18N</strong>: Since Next.js uses rewrites for internationalization, this feature is not supported on the headless WP platform due to the rewrite limitation mentioned above.</li> <li><strong>Next.js >=13.5 is required</strong>: To be able to use this feature, you need to update your application to Next.js version 13.5 or higher.</li> </ol> <p><strong>Note</strong>: <a href="https://nextjs.org/docs/pages/api-reference/next-config-js/redirects">Redirects</a> (which, unlike rewrites, actually change the URL in the user’s browser to the specified destination) are supported.</p> <p>If you want to give us feedback on how we can make things better for this feature or anything else with the platform, please visit our <a href="https://developers.wpengine.com/docs/atlas/feedback/">feedback form</a>.</p> <h2 class="wp-block-heading" id="conclusion">Conclusion</h2> <p>Implementing On-Demand Incremental Static Regeneration (ISR) with Next.js and Faust.js on WP engine’s headless WP platform is a game-changer for maintaining performance and up-to-date content in a headless WordPress setup. By following the steps outlined in this guide, you can leverage On-Demand ISR to ensure your site remains both fast and current, without the need for full rebuilds. </p> <p>The integration with the platform also simplifies the deployment and management process, providing a seamless workflow from development to production. </p> <p> As always, we look forward to hearing your feedback, thoughts, and projects so hit us up in our headless <a href="https://discord.com/invite/headless-wordpress-836253505944813629">Discord</a>!</p> </div> <div class="wp-block-group has-global-padding is-layout-constrained wp-block-group-is-layout-constrained" style="margin-top:var(--wp--preset--spacing--30);margin-bottom:var(--wp--preset--spacing--40)"> <div class="wp-block-group has-border-color has-mirage-border-color has-mirage-color has-base-background-color has-text-color has-background has-link-color wp-elements-4ec246525e7debe1f58ed930f4055f64 has-global-padding is-layout-constrained wp-container-core-group-is-layout-10 wp-block-group-is-layout-constrained" style="border-radius:12px;margin-bottom:var(--wp--preset--spacing--30);padding-top:var(--wp--preset--spacing--30);padding-right:var(--wp--preset--spacing--30);padding-bottom:var(--wp--preset--spacing--30);padding-left:var(--wp--preset--spacing--30)"> <div class="wp-block-group alignwide is-content-justification-left is-layout-flex wp-container-core-group-is-layout-9 wp-block-group-is-layout-flex" style="padding-top:0;padding-right:0;padding-bottom:0;padding-left:0"> <div class="wp-block-outermost-icon-block"><div class="icon-container has-icon-color has-mirage-color" style="color:#002838;width:54px"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" aria-hidden="true"><path d="M20,4H4C2.895,4,2,4.895,2,6v12c0,1.105,0.895,2,2,2h16c1.105,0,2-0.895,2-2V6C22,4.895,21.105,4,20,4z M20,8.236l-8,4.882 L4,8.236V6h16V8.236z"></path></svg></div></div> <p class="has-medium-font-size wp-container-content-3" style="line-height:1.5">Get the latest headless and modern <br>WordPress tutorials in your inbox.</p> <div class="wp-block-buttons is-content-justification-right is-nowrap is-layout-flex wp-container-core-buttons-is-layout-2 wp-block-buttons-is-layout-flex"> <div class="wp-block-button is-style-outline is-style-outline--0f53ff4c9709aaca3c7e77b444130fbb"><a class="wp-block-button__link wp-element-button" href="https://wpeng.in/82d3c0/" style="border-radius:99px;padding-top:10px;padding-right:24px;padding-bottom:10px;padding-left:24px">Subscribe →</a></div> </div> </div> </div> </div> </div> <div class="wp-block-group has-base-color has-mirage-background-color has-text-color has-background has-link-color wp-elements-93d3f2d785f9a848082305b4115d2be6 has-global-padding is-layout-constrained wp-container-core-group-is-layout-13 wp-block-group-is-layout-constrained" style="margin-top:60px;padding-top:120px;padding-bottom:120px"> <div class="wp-block-columns are-vertically-aligned-center is-layout-flex wp-container-core-columns-is-layout-1 wp-block-columns-is-layout-flex" style="padding-right:var(--wp--preset--spacing--30);padding-left:var(--wp--preset--spacing--30)"> <div class="wp-block-column is-vertically-aligned-center is-layout-flow wp-block-column-is-layout-flow" style="flex-basis:120px"><div class="aligncenter wp-block-avatar"><img alt='Francis Agulto Avatar' src='https://secure.gravatar.com/avatar/c24a68b84c9ad2b53c633d14917d8298?s=90&d=mm&r=g' srcset='https://secure.gravatar.com/avatar/c24a68b84c9ad2b53c633d14917d8298?s=180&d=mm&r=g 2x' class='avatar avatar-90 photo wp-block-avatar__image has-border-color has-base-border-color' height='90' width='90' style="border-radius:90px;border-width:2px;" loading='lazy' decoding='async'/></div></div> <div class="wp-block-column is-vertically-aligned-center is-layout-flow wp-block-column-is-layout-flow" style="flex-basis:100%"><div class="wp-block-post-author-biography">Fran Agulto is a Developer Advocate at WP Engine. He is a lover of all things headless WordPress, Rock Climbing, and overall being stoked for people that love what they do and share that stoke with others! Follow me on <a href="https://twitter.com/fran_the_dev">Twitter</a> for cool stoked headless WP!</div></div> </div> </div> </div> </div> </main> <footer class="site-footer wp-block-template-part"> <div class="wp-block-group alignfull wpe-footer-cta has-base-color has-custom-cta-gradient-background has-text-color has-background has-global-padding is-layout-constrained wp-block-group-is-layout-constrained" style="padding-top:100px;padding-bottom:100px"> <h2 class="wp-block-heading has-text-align-center has-max-48-font-size" style="line-height:1.3">WP Engine Headless Platform</h2> <p class="has-text-align-center has-large-font-size" style="line-height:1.3">Build, deploy, and manage headless websites with the power of WordPress and the best of modern web development.</p> <div class="wp-block-buttons is-content-justification-center is-layout-flex wp-container-core-buttons-is-layout-3 wp-block-buttons-is-layout-flex" style="margin-top:40px"> <div class="wp-block-button is-style-fill-base"><a class="wp-block-button__link wp-element-button" href="https://my.wpengine.com/signup?plan=headless-eval">Try Headless for Free</a></div> </div> </div> <div class="wp-block-group alignfull is-half-height has-mirage-background-color has-background has-link-color wp-elements-c86a9fde0a6e0373f1588a576e3b9990 has-global-padding is-layout-constrained wp-container-core-group-is-layout-27 wp-block-group-is-layout-constrained" style="margin-top:0px;padding-top:80px;padding-right:40px;padding-bottom:40px;padding-left:40px"> <div class="wp-block-group has-small-font-size is-layout-flow wp-block-group-is-layout-flow"> <div class="wp-block-columns has-white-color has-text-color is-layout-flex wp-container-core-columns-is-layout-2 wp-block-columns-is-layout-flex"> <div class="wp-block-column is-layout-flow wp-block-column-is-layout-flow" style="flex-basis:36%"> <div class="wp-block-group is-layout-flow wp-container-core-group-is-layout-18 wp-block-group-is-layout-flow"> <h2 class="wp-block-heading has-small-font-size" id="wp-engine" style="margin-top:0px;margin-bottom:10px">WP Engine</h2> <ul class="is-style-no-disc wp-block-list"> <li><span style="font-family: var(--wp--preset--font-family--primary); font-weight: var(--wp--custom--font-weight--regular);">504 Lavaca Street</span></li> <li>Suite 1000</li> <li>Austin, TX 78701</li> </ul> </div> <div class="wp-block-group is-layout-flow wp-container-core-group-is-layout-19 wp-block-group-is-layout-flow"> <h2 class="wp-block-heading has-small-font-size" id="wp-engine" style="margin-top:0px;margin-bottom:10px">Sales</h2> <ul class="is-style-no-disc wp-block-list"> <li><a href="tel:1-877-973-6446">1-877-973-6446</a></li> <li><a href="/cdn-cgi/l/email-protection#97e4f6fbf2e4d7e0e7f2f9f0fef9f2b9f4f8fa"><span class="__cf_email__" data-cfemail="7102101d1402310601141f16181f145f121e1c">[email protected]</span></a></li> <li>7am–7pm CST</li> </ul> </div> <div class="wp-block-group is-layout-flow wp-container-core-group-is-layout-20 wp-block-group-is-layout-flow"> <h2 class="wp-block-heading has-small-font-size" id="wp-engine" style="margin-top:0px;margin-bottom:10px">Billing</h2> <ul class="is-style-no-disc wp-block-list"> <li><a href="tel:1-877-973-6446"></a><a href="/cdn-cgi/l/email-protection#3153585d5d585f56714641545f56585f541f525e5c"><span class="__cf_email__" data-cfemail="77151e1b1b1e19103700071219101e19125914181a">[email protected]</span></a></li> </ul> </div> </div> <div class="wp-block-column is-layout-flow wp-block-column-is-layout-flow" style="flex-basis:16%"> <div class="wp-block-group is-layout-flow wp-container-core-group-is-layout-21 wp-block-group-is-layout-flow"> <h2 class="wp-block-heading has-small-font-size" id="solutions">Solutions</h2> <ul id="menu-footer-solutions" class="is-style-no-disc has-small-font-size wp-block-list"> <li><a href="https://wpengine.com/managed-wordpress-hosting/">Managed WordPress Hosting</a></li> <li><a href="https://wpengine.com/ecommerce/">WooCommerce Hosting</a></li> <li><a href="https://wpengine.com/smb/">SMB</a></li> <li><a href="https://wpengine.com/agency/">Agency</a></li> <li><a href="https://wpengine.com/enterprise/">Enterprise</a></li> <li><a href="https://wpengine.com/partners/affiliate/">Affiliate</a></li> <li><a href="https://wpengine.com/platform/">Our Platform</a></li> </ul> </div> </div> <div class="wp-block-column is-layout-flow wp-block-column-is-layout-flow" style="flex-basis:16%"> <div class="wp-block-group is-layout-flow wp-container-core-group-is-layout-22 wp-block-group-is-layout-flow"> <h2 class="wp-block-heading has-small-font-size" id="insights">Insights</h2> <ul id="menu-footer-insights" class="is-style-no-disc has-small-font-size wp-block-list"> <li><a href="https://wpengine.com/blog/">Blog</a></li> <li><a href="https://torquemag.io/?utm_source=wpengine&utm_medium=referral&utm_campaign=footer">Torque</a></li> <li><a href="https://velocitize.com/?utm_source=wpengine&utm_medium=referral&utm_campaign=footer">Velocitize</a></li> </ul> </div> </div> <div class="wp-block-column is-layout-flow wp-block-column-is-layout-flow" style="flex-basis:16%"> <div class="wp-block-group is-layout-flow wp-container-core-group-is-layout-23 wp-block-group-is-layout-flow"> <h2 class="wp-block-heading has-small-font-size" id="about">About</h2> <ul id="menu-footer-about" class="is-style-no-disc has-small-font-size wp-block-list"> <li><a href="https://wpengine.com/about-us/">Our Company</a></li> <li><a href="https://wpengine.com/newsroom/leadership-team/">Leadership Team</a></li> <li><a target="_blank" rel="noreferrer noopener" href="https://wpengine.careers/?utm_source=wpengine&utm_medium=referral&utm_campaign=footer">Careers</a></li> <li><a href="https://wpengine.com/contact/">Contact</a></li> <li><a href="https://wpengine.com/our-customers/">Customer Stories</a></li> <li><a href="https://wpengine.com/legal/">Legal</a></li> <li><a href="https://wpengine.com/newsroom/">Newsroom</a></li> <li><a href="https://wpengine.com/legal/privacy/">Privacy Policy</a></li> </ul> </div> </div> <div class="wp-block-column is-layout-flow wp-block-column-is-layout-flow" style="flex-basis:16%"> <div class="wp-block-group is-layout-flow wp-container-core-group-is-layout-24 wp-block-group-is-layout-flow"> <h2 class="wp-block-heading has-small-font-size" id="resources">Resources</h2> <ul id="menu-footer-resources" class="is-style-no-disc has-small-font-size wp-block-list"> <li><a href="https://wpengine.com/resources/">Resource Center</a></li> <li><a href="https://wpengine.com/support/">Support Center</a></li> <li><a href="https://wpengine.com/solution-center/">Solution Center</a></li> <li><a href="https://wpengine.com/partners/">Partner Programs</a></li> <li><a href="https://wpengine.com/partners/agencies/">Agency Directory</a></li> <li><a rel="noreferrer noopener" href="https://wpenginestatus.com/?utm_source=wpengine&utm_medium=referral&utm_campaign=footer" target="_blank">System Status</a></li> <li><a href="https://wpengine.com/brand-assets/">Brand Assets</a></li> </ul> </div> </div> </div> <div style="height:40px" aria-hidden="true" class="wp-block-spacer"></div> <hr class="wp-block-separator has-text-color has-alpha-channel-opacity has-background is-style-wide" style="background-color:#243c4b;color:#243c4b"/> <div style="height:40px" aria-hidden="true" class="wp-block-spacer"></div> <div class="wp-block-group is-horizontal is-content-justification-space-between is-layout-flex wp-container-core-group-is-layout-25 wp-block-group-is-layout-flex"> <p class="has-text-color" style="color:#98a2a7;font-size:12px;line-height:1.5">© 2013–2023 WPEngine, Inc. All rights reserved.<br>WP ENGINE®, VELOCITIZE®, TORQUE®, EVERCACHE®, and the cog logo service marks are owned by WPEngine, Inc.</p> <ul class="wp-block-social-links has-small-icon-size has-icon-color has-icon-background-color is-layout-flex wp-container-core-social-links-is-layout-2 wp-block-social-links-is-layout-flex"><li style="color: #002838; background-color: #fff; " class="wp-social-link wp-social-link-facebook has-mirage-color has-base-background-color wp-block-social-link"><a href="https://facebook.com/wpengine" class="wp-block-social-link-anchor"><svg width="24" height="24" viewBox="0 0 24 24" version="1.1" xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false"><path d="M12 2C6.5 2 2 6.5 2 12c0 5 3.7 9.1 8.4 9.9v-7H7.9V12h2.5V9.8c0-2.5 1.5-3.9 3.8-3.9 1.1 0 2.2.2 2.2.2v2.5h-1.3c-1.2 0-1.6.8-1.6 1.6V12h2.8l-.4 2.9h-2.3v7C18.3 21.1 22 17 22 12c0-5.5-4.5-10-10-10z"></path></svg><span class="wp-block-social-link-label screen-reader-text">Facebook</span></a></li> <li style="color: #002838; background-color: #fff; " class="wp-social-link wp-social-link-x has-mirage-color has-base-background-color wp-block-social-link"><a href="https://x.com/wpengine" class="wp-block-social-link-anchor"><svg width="24" height="24" viewBox="0 0 24 24" version="1.1" xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false"><path d="M13.982 10.622 20.54 3h-1.554l-5.693 6.618L8.745 3H3.5l6.876 10.007L3.5 21h1.554l6.012-6.989L15.868 21h5.245l-7.131-10.378Zm-2.128 2.474-.697-.997-5.543-7.93H8l4.474 6.4.697.996 5.815 8.318h-2.387l-4.745-6.787Z" /></svg><span class="wp-block-social-link-label screen-reader-text">X</span></a></li> <li style="color: #002838; background-color: #fff; " class="wp-social-link wp-social-link-twitter has-mirage-color has-base-background-color wp-block-social-link"><a href="https://twitter.com/wpengine" class="wp-block-social-link-anchor"><svg width="24" height="24" viewBox="0 0 24 24" version="1.1" xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false"><path d="M22.23,5.924c-0.736,0.326-1.527,0.547-2.357,0.646c0.847-0.508,1.498-1.312,1.804-2.27 c-0.793,0.47-1.671,0.812-2.606,0.996C18.324,4.498,17.257,4,16.077,4c-2.266,0-4.103,1.837-4.103,4.103 c0,0.322,0.036,0.635,0.106,0.935C8.67,8.867,5.647,7.234,3.623,4.751C3.27,5.357,3.067,6.062,3.067,6.814 c0,1.424,0.724,2.679,1.825,3.415c-0.673-0.021-1.305-0.206-1.859-0.513c0,0.017,0,0.034,0,0.052c0,1.988,1.414,3.647,3.292,4.023 c-0.344,0.094-0.707,0.144-1.081,0.144c-0.264,0-0.521-0.026-0.772-0.074c0.522,1.63,2.038,2.816,3.833,2.85 c-1.404,1.1-3.174,1.756-5.096,1.756c-0.331,0-0.658-0.019-0.979-0.057c1.816,1.164,3.973,1.843,6.29,1.843 c7.547,0,11.675-6.252,11.675-11.675c0-0.178-0.004-0.355-0.012-0.531C20.985,7.47,21.68,6.747,22.23,5.924z"></path></svg><span class="wp-block-social-link-label screen-reader-text">Twitter</span></a></li> <li style="color: #002838; background-color: #fff; " class="wp-social-link wp-social-link-linkedin has-mirage-color has-base-background-color wp-block-social-link"><a href="https://www.linkedin.com/company/wpengine" class="wp-block-social-link-anchor"><svg width="24" height="24" viewBox="0 0 24 24" version="1.1" xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false"><path d="M19.7,3H4.3C3.582,3,3,3.582,3,4.3v15.4C3,20.418,3.582,21,4.3,21h15.4c0.718,0,1.3-0.582,1.3-1.3V4.3 C21,3.582,20.418,3,19.7,3z M8.339,18.338H5.667v-8.59h2.672V18.338z M7.004,8.574c-0.857,0-1.549-0.694-1.549-1.548 c0-0.855,0.691-1.548,1.549-1.548c0.854,0,1.547,0.694,1.547,1.548C8.551,7.881,7.858,8.574,7.004,8.574z M18.339,18.338h-2.669 v-4.177c0-0.996-0.017-2.278-1.387-2.278c-1.389,0-1.601,1.086-1.601,2.206v4.249h-2.667v-8.59h2.559v1.174h0.037 c0.356-0.675,1.227-1.387,2.526-1.387c2.703,0,3.203,1.779,3.203,4.092V18.338z"></path></svg><span class="wp-block-social-link-label screen-reader-text">LinkedIn</span></a></li> <li style="color: #002838; background-color: #fff; " class="wp-social-link wp-social-link-youtube has-mirage-color has-base-background-color wp-block-social-link"><a href="https://www.youtube.com/channel/UCJeAEAxX69v24CUBZ0WBYSg" class="wp-block-social-link-anchor"><svg width="24" height="24" viewBox="0 0 24 24" version="1.1" xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false"><path d="M21.8,8.001c0,0-0.195-1.378-0.795-1.985c-0.76-0.797-1.613-0.801-2.004-0.847c-2.799-0.202-6.997-0.202-6.997-0.202 h-0.009c0,0-4.198,0-6.997,0.202C4.608,5.216,3.756,5.22,2.995,6.016C2.395,6.623,2.2,8.001,2.2,8.001S2,9.62,2,11.238v1.517 c0,1.618,0.2,3.237,0.2,3.237s0.195,1.378,0.795,1.985c0.761,0.797,1.76,0.771,2.205,0.855c1.6,0.153,6.8,0.201,6.8,0.201 s4.203-0.006,7.001-0.209c0.391-0.047,1.243-0.051,2.004-0.847c0.6-0.607,0.795-1.985,0.795-1.985s0.2-1.618,0.2-3.237v-1.517 C22,9.62,21.8,8.001,21.8,8.001z M9.935,14.594l-0.001-5.62l5.404,2.82L9.935,14.594z"></path></svg><span class="wp-block-social-link-label screen-reader-text">YouTube</span></a></li> <li style="color: #002838; background-color: #fff; " class="wp-social-link wp-social-link-instagram has-mirage-color has-base-background-color wp-block-social-link"><a href="https://instagram.com/wpengine" class="wp-block-social-link-anchor"><svg width="24" height="24" viewBox="0 0 24 24" version="1.1" xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false"><path d="M12,4.622c2.403,0,2.688,0.009,3.637,0.052c0.877,0.04,1.354,0.187,1.671,0.31c0.42,0.163,0.72,0.358,1.035,0.673 c0.315,0.315,0.51,0.615,0.673,1.035c0.123,0.317,0.27,0.794,0.31,1.671c0.043,0.949,0.052,1.234,0.052,3.637 s-0.009,2.688-0.052,3.637c-0.04,0.877-0.187,1.354-0.31,1.671c-0.163,0.42-0.358,0.72-0.673,1.035 c-0.315,0.315-0.615,0.51-1.035,0.673c-0.317,0.123-0.794,0.27-1.671,0.31c-0.949,0.043-1.233,0.052-3.637,0.052 s-2.688-0.009-3.637-0.052c-0.877-0.04-1.354-0.187-1.671-0.31c-0.42-0.163-0.72-0.358-1.035-0.673 c-0.315-0.315-0.51-0.615-0.673-1.035c-0.123-0.317-0.27-0.794-0.31-1.671C4.631,14.688,4.622,14.403,4.622,12 s0.009-2.688,0.052-3.637c0.04-0.877,0.187-1.354,0.31-1.671c0.163-0.42,0.358-0.72,0.673-1.035 c0.315-0.315,0.615-0.51,1.035-0.673c0.317-0.123,0.794-0.27,1.671-0.31C9.312,4.631,9.597,4.622,12,4.622 M12,3 C9.556,3,9.249,3.01,8.289,3.054C7.331,3.098,6.677,3.25,6.105,3.472C5.513,3.702,5.011,4.01,4.511,4.511 c-0.5,0.5-0.808,1.002-1.038,1.594C3.25,6.677,3.098,7.331,3.054,8.289C3.01,9.249,3,9.556,3,12c0,2.444,0.01,2.751,0.054,3.711 c0.044,0.958,0.196,1.612,0.418,2.185c0.23,0.592,0.538,1.094,1.038,1.594c0.5,0.5,1.002,0.808,1.594,1.038 c0.572,0.222,1.227,0.375,2.185,0.418C9.249,20.99,9.556,21,12,21s2.751-0.01,3.711-0.054c0.958-0.044,1.612-0.196,2.185-0.418 c0.592-0.23,1.094-0.538,1.594-1.038c0.5-0.5,0.808-1.002,1.038-1.594c0.222-0.572,0.375-1.227,0.418-2.185 C20.99,14.751,21,14.444,21,12s-0.01-2.751-0.054-3.711c-0.044-0.958-0.196-1.612-0.418-2.185c-0.23-0.592-0.538-1.094-1.038-1.594 c-0.5-0.5-1.002-0.808-1.594-1.038c-0.572-0.222-1.227-0.375-2.185-0.418C14.751,3.01,14.444,3,12,3L12,3z M12,7.378 c-2.552,0-4.622,2.069-4.622,4.622S9.448,16.622,12,16.622s4.622-2.069,4.622-4.622S14.552,7.378,12,7.378z M12,15 c-1.657,0-3-1.343-3-3s1.343-3,3-3s3,1.343,3,3S13.657,15,12,15z M16.804,6.116c-0.596,0-1.08,0.484-1.08,1.08 s0.484,1.08,1.08,1.08c0.596,0,1.08-0.484,1.08-1.08S17.401,6.116,16.804,6.116z"></path></svg><span class="wp-block-social-link-label screen-reader-text">Instagram</span></a></li> <li style="color: #002838; background-color: #fff; " class="wp-social-link wp-social-link-feed has-mirage-color has-base-background-color wp-block-social-link"><a href="https://wpengine.com/feed/" class="wp-block-social-link-anchor"><svg width="24" height="24" viewBox="0 0 24 24" version="1.1" xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false"><path d="M2,8.667V12c5.515,0,10,4.485,10,10h3.333C15.333,14.637,9.363,8.667,2,8.667z M2,2v3.333 c9.19,0,16.667,7.477,16.667,16.667H22C22,10.955,13.045,2,2,2z M4.5,17C3.118,17,2,18.12,2,19.5S3.118,22,4.5,22S7,20.88,7,19.5 S5.882,17,4.5,17z"></path></svg><span class="wp-block-social-link-label screen-reader-text">RSS Feed</span></a></li></ul> </div> <div style="height:20px" aria-hidden="true" class="wp-block-spacer"></div> </div> </div> </footer></div> <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 0 0" width="0" height="0" focusable="false" role="none" style="visibility: hidden; position: absolute; left: -9999px; overflow: hidden;" ><defs><filter id="wp-duotone-002838-f4f7fa-2"><feColorMatrix color-interpolation-filters="sRGB" type="matrix" values=" .299 .587 .114 0 0 .299 .587 .114 0 0 .299 .587 .114 0 0 .299 .587 .114 0 0 " /><feComponentTransfer color-interpolation-filters="sRGB" ><feFuncR type="table" tableValues="0 0.956862745098" /><feFuncG type="table" tableValues="0.156862745098 0.96862745098" /><feFuncB type="table" tableValues="0.219607843137 0.980392156863" /><feFuncA type="table" tableValues="1 1" /></feComponentTransfer><feComposite in2="SourceGraphic" operator="in" /></filter></defs></svg> <!-- TWIPLA tracking code for for wpengine.com/builders --> <script data-cfasync="false" src="/cdn-cgi/scripts/5c5dd728/cloudflare-static/email-decode.min.js"></script><script>(function(v,i,s,a,t){v[t]=v[t]||function(){(v[t].v=v[t].v||[]).push(arguments)};if(!v._visaSettings){v._visaSettings={}}v._visaSettings[a]={v:'1.0',s:a,a:'1',t:t};var b=i.getElementsByTagName('body')[0];var p=i.createElement('script');p.defer=1;p.async=1;p.src=s+'?s='+a;b.appendChild(p)})(window,document,'//app-worker.visitor-analytics.io/main.js','9b9c724c-a32f-11ef-9280-bee4895ac99e','va')</script> <script> ( function ( body ) { 'use strict'; body.className = body.className.replace( /\btribe-no-js\b/, 'tribe-js' ); } )( document.body ); </script> <script> /* <![CDATA[ */var tribe_l10n_datatables = {"aria":{"sort_ascending":": activate to sort column ascending","sort_descending":": activate to sort column descending"},"length_menu":"Show _MENU_ entries","empty_table":"No data available in table","info":"Showing _START_ to _END_ of _TOTAL_ entries","info_empty":"Showing 0 to 0 of 0 entries","info_filtered":"(filtered from _MAX_ total entries)","zero_records":"No matching records found","search":"Search:","all_selected_text":"All items on this page were selected. ","select_all_link":"Select all pages","clear_selection":"Clear Selection.","pagination":{"all":"All","next":"Next","previous":"Previous"},"select":{"rows":{"0":"","_":": Selected %d rows","1":": Selected 1 row"}},"datepicker":{"dayNames":["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"],"dayNamesShort":["Sun","Mon","Tue","Wed","Thu","Fri","Sat"],"dayNamesMin":["S","M","T","W","T","F","S"],"monthNames":["January","February","March","April","May","June","July","August","September","October","November","December"],"monthNamesShort":["January","February","March","April","May","June","July","August","September","October","November","December"],"monthNamesMin":["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"],"nextText":"Next","prevText":"Prev","currentText":"Today","closeText":"Done","today":"Today","clear":"Clear"}};/* ]]> */ </script><script id="wp-block-template-skip-link-js-after"> ( function() { var skipLinkTarget = document.querySelector( 'main' ), sibling, skipLinkTargetID, skipLink; // Early exit if a skip-link target can't be located. if ( ! skipLinkTarget ) { return; } /* * Get the site wrapper. * The skip-link will be injected in the beginning of it. */ sibling = document.querySelector( '.wp-site-blocks' ); // Early exit if the root element was not found. if ( ! sibling ) { return; } // Get the skip-link target's ID, and generate one if it doesn't exist. skipLinkTargetID = skipLinkTarget.id; if ( ! skipLinkTargetID ) { skipLinkTargetID = 'wp--skip-link--target'; skipLinkTarget.id = skipLinkTargetID; } // Create the skip link. skipLink = document.createElement( 'a' ); skipLink.classList.add( 'skip-link', 'screen-reader-text' ); skipLink.href = '#' + skipLinkTargetID; skipLink.innerHTML = 'Skip to content'; // Inject the skip link. sibling.parentElement.insertBefore( skipLink, sibling ); }() ); </script> </body> </html>