<?xml version="1.0" encoding="utf-8"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/"><channel><language>en</language><title>Blog posts by Santiago Morla</title> <link>https://world.optimizely.com/blogs/santiago-morla/</link><description></description><ttl>60</ttl><generator>Optimizely World</generator><item> <title>Technical SEO That Ships: Building Google News Sitemaps Into the CMS</title>            <link>http://opticmsxperience.com/?p=333</link>            <description>Technical SEO is full of work that sounds small in a planning meeting and turns out to be product infrastructure once you start building it. &amp;#8220;Add a news sitemap&amp;#8221; is one of those requests. If the goal is to be discoverable in Google News, the work is not just about generating XML. You need publication-specific&lt;a class=&quot;more-link&quot; href=&quot;https://opticmsxperience.com/2026/02/12/technical-seo-that-ships-building-google-news-sitemaps-into-the-cms/&quot;&gt;Continue reading &lt;span class=&quot;screen-reader-text&quot;&gt;&quot;Technical SEO That Ships: Building Google News Sitemaps Into the&amp;#160;CMS&quot;&lt;/span&gt;&lt;/a&gt;</description>            <guid>http://opticmsxperience.com/?p=333</guid>            <pubDate>Thu, 12 Feb 2026 22:18:45 GMT</pubDate>           <category>Blog post</category></item><item> <title>Gated Media Without Fragile Redirects in Optimizely CMS</title>            <link>http://opticmsxperience.com/?p=343</link>            <description>Restricted media usually looks simple on the whiteboard. If the user can read the asset, serve it. If they cannot, redirect them to sign in. In practice, document protection breaks in much more interesting ways than that. The rendered page may expose a direct asset URL before the request pipeline ever sees it. A redirect&lt;a class=&quot;more-link&quot; href=&quot;https://opticmsxperience.com/2025/12/09/gated-media-without-fragile-redirects-in-optimizely-cms/&quot;&gt;Continue reading &lt;span class=&quot;screen-reader-text&quot;&gt;&quot;Gated Media Without Fragile Redirects in Optimizely&amp;#160;CMS&quot;&lt;/span&gt;&lt;/a&gt;</description>            <guid>http://opticmsxperience.com/?p=343</guid>            <pubDate>Tue, 09 Dec 2025 14:22:41 GMT</pubDate>           <category>Blog post</category></item><item> <title>Moving SSO Configuration From `appsettings` Files to PaaSPortal Without Rewriting the App</title>            <link>http://opticmsxperience.com/?p=347</link>            <description>That was the interesting part of this configuration update. The visible code change was tiny: the committed value for SSO:AzureAD_ClientSecret was removed from appsettings.json and appsettings.Production.json, leaving the key present but empty. The actual secret was then expected to come from PaaSPortal-managed application settings at deployment time. On paper, that sounds almost too small to&lt;a class=&quot;more-link&quot; href=&quot;https://opticmsxperience.com/2025/11/05/moving-sso-configuration-from-appsettings-files-to-paasportal-without-rewriting-the-app/&quot;&gt;Continue reading &lt;span class=&quot;screen-reader-text&quot;&gt;&quot;Moving SSO Configuration From `appsettings` Files to PaaSPortal Without Rewriting the&amp;#160;App&quot;&lt;/span&gt;&lt;/a&gt;</description>            <guid>http://opticmsxperience.com/?p=347</guid>            <pubDate>Wed, 05 Nov 2025 15:56:29 GMT</pubDate>           <category>Blog post</category></item><item> <title>Why `/episerver/health` Failed Behind CMS Security Layers and How We Fixed It</title>            <link>http://opticmsxperience.com/?p=352</link>            <description>Health check failures are often diagnosed as an infrastructure problem first. The app must be down. The load balancer must be wrong. The probe configuration must be off. But sometimes the endpoint is perfectly fine and the real issue is much closer to the request pipeline. That was the shape of this fix. The failing&lt;a class=&quot;more-link&quot; href=&quot;https://opticmsxperience.com/2025/10/08/why-episerver-health-failed-behind-cms-security-layers-and-how-we-fixed-it/&quot;&gt;Continue reading &lt;span class=&quot;screen-reader-text&quot;&gt;&quot;Why `/episerver/health` Failed Behind CMS Security Layers and How We Fixed&amp;#160;It&quot;&lt;/span&gt;&lt;/a&gt;</description>            <guid>http://opticmsxperience.com/?p=352</guid>            <pubDate>Wed, 08 Oct 2025 23:02:55 GMT</pubDate>           <category>Blog post</category></item><item> <title>How We Stopped Deleted CMS Pages from Showing Up in Personalized Recommendations</title>            <link>http://opticmsxperience.com/?p=319</link>            <description>A small recommendation bug can quietly damage trust when deleted or unpublished pages keep showing up in personalized content modules. Here is a practical pattern for validating third-party recommendation URLs against live CMS content before rendering them.</description>            <guid>http://opticmsxperience.com/?p=319</guid>            <pubDate>Thu, 14 Aug 2025 13:00:00 GMT</pubDate>           <category>Blog post</category></item><item> <title>Extending UrlResolver to Generate Lowercase Links in Optimizely CMS 12</title>            <link>http://opticmsxperience.com/?p=282</link>            <description>When working with Optimizely CMS 12, URL consistency is crucial for SEO and usability. By default, Optimizely does not enforce lowercase URLs, which can lead to duplicate content issues and inconsistent link structures. In this blog, we&#39;ll explore how to extend UrlResolver to ensure all generated URLs are in lowercase.</description>            <guid>http://opticmsxperience.com/?p=282</guid>            <pubDate>Fri, 07 Mar 2025 15:23:52 GMT</pubDate>           <category>Blog post</category></item><item> <title>Building an Interactive Hotspot Editor in Optimizely CMS 12</title>            <link>http://opticmsxperience.com/?p=290</link>            <description>Have you ever wanted to let content editors place interactive hotspots directly on an image—without leaving the CMS? In this post, I’ll walk through how we built a custom Hotspot Module in Optimizely CMS 12 that does exactly that. What We BuiltThis solution allows editors to:* Upload a background image.* Click directly on the image&lt;a class=&quot;more-link&quot; href=&quot;https://opticmsxperience.com/2024/10/10/building-an-interactive-hotspot-editor-in-optimizely-cms-12/&quot;&gt;Continue reading &lt;span class=&quot;screen-reader-text&quot;&gt;&quot;Building an Interactive Hotspot Editor in Optimizely CMS&amp;#160;12&quot;&lt;/span&gt;&lt;/a&gt;</description>            <guid>http://opticmsxperience.com/?p=290</guid>            <pubDate>Thu, 10 Oct 2024 16:06:00 GMT</pubDate>           <category>Blog post</category></item><item> <title>Custom ContentArea Converter for Optimizely CMS 12 in a Headless + PaaS Architecture</title>            <link>http://opticmsxperience.com/?p=307</link>            <description>When building headless websites with Optimizely CMS 12 using the Content Delivery API, ContentArea properties can be tricky. By default, they return minimal references to nested content—not the rich, expanded content structures modern frontends need. In this post, I’ll walk through how we solved that by implementing a custom ContentArea converter, giving full control over&lt;a class=&quot;more-link&quot; href=&quot;https://opticmsxperience.com/2024/05/15/custom-contentarea-converter-for-optimizely-cms-12-in-a-headless-paas-architecture/&quot;&gt;Continue reading &lt;span class=&quot;screen-reader-text&quot;&gt;&quot;Custom ContentArea Converter for Optimizely CMS 12 in a Headless + PaaS&amp;#160;Architecture&quot;&lt;/span&gt;&lt;/a&gt;</description>            <guid>http://opticmsxperience.com/?p=307</guid>            <pubDate>Wed, 15 May 2024 16:48:00 GMT</pubDate>           <category>Blog post</category></item><item> <title>Enhancing the Authoring Experience: Extending the LinkItem</title>            <link>http://opticmsxperience.com/?p=251</link>            <description>The LinkItem field is one of the most demanded properties by the community, allowing editors to effortlessly create and manage links across pages and blocks. It was introduced on CMS 12 &amp;#8211; EPiServer.CMS 12.11.0 and this blog post will show how it can be extended to have a better authoring experience. This is how you&lt;a class=&quot;more-link&quot; href=&quot;https://opticmsxperience.com/2024/04/10/enhancing-the-authoring-experience-extending-the-linkitem/&quot;&gt;Continue reading &lt;span class=&quot;screen-reader-text&quot;&gt;&quot;Enhancing the Authoring Experience: Extending the&amp;#160;LinkItem&quot;&lt;/span&gt;&lt;/a&gt;</description>            <guid>http://opticmsxperience.com/?p=251</guid>            <pubDate>Wed, 10 Apr 2024 15:42:03 GMT</pubDate>           <category>Blog post</category></item><item> <title>Optimizely CMS – Allow Forms to Redirect to Media Assets</title>            <link>http://opticmsxperience.com/?p=239</link>            <description>Optimizely Forms is a powerful add-on that can improve the experience for authors to create custom forms as needed with plenty of capabilities. It can be also extensible, so a developer can implement custom form elements and add complex logic to forms to accommodate the user&amp;#8217;s needs and the client&amp;#8217;s requirements. Forms can be configured&lt;a class=&quot;more-link&quot; href=&quot;https://opticmsxperience.com/2023/08/16/optimizely-cms-allow-forms-to-redirect-to-media-assets/&quot;&gt;Continue reading &lt;span class=&quot;screen-reader-text&quot;&gt;&quot;Optimizely CMS &amp;#8211; Allow Forms to Redirect to Media&amp;#160;Assets&quot;&lt;/span&gt;&lt;/a&gt;</description>            <guid>http://opticmsxperience.com/?p=239</guid>            <pubDate>Wed, 16 Aug 2023 16:41:28 GMT</pubDate>           <category>Blog post</category></item><item> <title>Optimizely CMS 11 – Download Blob items from Production</title>            <link>http://opticmsxperience.com/?p=203</link>            <description>This post will walk you through the process of getting the blob assets from production to get the images working locally.</description>            <guid>http://opticmsxperience.com/?p=203</guid>            <pubDate>Tue, 04 Apr 2023 15:26:07 GMT</pubDate>           <category>Blog post</category></item><item> <title>Optimizely CMS 12 – Unable to Import Data</title>            <link>http://opticmsxperience.com/?p=194</link>            <description>Are you unable to import data from another instance? If you are getting a non-explanatory error message &amp;#8220;No file uploaded&amp;#8221; when you click on &amp;#8220;Upload and Verify File&amp;#8221; or &amp;#8220;Begin Import&amp;#8221;, this post will help you. I exported some content items from a lower environment and I wanted to import them to an upper environment,&lt;a class=&quot;more-link&quot; href=&quot;https://opticmsxperience.com/2023/01/11/optimizely-cms-12-unable-to-import-data/&quot;&gt;Continue reading &lt;span class=&quot;screen-reader-text&quot;&gt;&quot;Optimizely CMS 12 &amp;#8211; Unable to Import&amp;#160;Data&quot;&lt;/span&gt;&lt;/a&gt;</description>            <guid>http://opticmsxperience.com/?p=194</guid>            <pubDate>Wed, 11 Jan 2023 15:10:16 GMT</pubDate>           <category>Blog post</category></item><item> <title>Restricting Environment Access “/Episerver”</title>            <link>http://opticmsxperience.com/?p=182</link>            <description>As a web administrator, you would probably want to restrict the editing portal to the public and one way to achieve this is applying rules directly on yout configuration file so the access can be restricted by IP. You probably have read this article from Optimizely (CMS 11) https://docs.developers.optimizely.com/digital-experience-platform/v1.3.0-DXP-for-CMS11-COM13/docs/restricting-environment-access where it describes how you can&lt;a class=&quot;more-link&quot; href=&quot;https://opticmsxperience.com/2022/08/08/restricting-environment-access-episerver/&quot;&gt;Continue reading &lt;span class=&quot;screen-reader-text&quot;&gt;&quot;Restricting Environment Access &amp;#8220;/Episerver&amp;#8221;&quot;&lt;/span&gt;&lt;/a&gt;</description>            <guid>http://opticmsxperience.com/?p=182</guid>            <pubDate>Mon, 08 Aug 2022 17:37:10 GMT</pubDate>           <category>Blog post</category></item><item> <title>Hide Field From Local Block</title>            <link>http://opticmsxperience.com/?p=163</link>            <description>There are times when you have a local block that is shared across multiple blocks or pages and you want to hide a specific field based on the content type. Here is a guide on how you can achieve this with a custom attribute. Imagine that you have a block which used by other content&lt;a class=&quot;more-link&quot; href=&quot;https://opticmsxperience.com/2022/01/06/hide-field-from-local-block/&quot;&gt;Continue reading &lt;span class=&quot;screen-reader-text&quot;&gt;&quot;Hide Field From Local&amp;#160;Block&quot;&lt;/span&gt;&lt;/a&gt;</description>            <guid>http://opticmsxperience.com/?p=163</guid>            <pubDate>Thu, 06 Jan 2022 19:57:17 GMT</pubDate>           <category>Blog post</category></item><item> <title>Optimizely Forms Issue with Claims</title>            <link>http://epicmsxperience.com/?p=145</link>            <description>This is a quick fix for an Optimizely Form issue when your implementation integrates Azure AD with OpenID Connect to sign-in/sign-out users on your application. If you try to browse your page that contains an Optimizely Form and there is an active user session, you could probably get the following error: A claim of type&lt;a class=&quot;more-link&quot; href=&quot;https://epicmsxperience.com/2021/06/30/optimizely-forms-issue-with-claims/&quot;&gt;Continue reading &lt;span class=&quot;screen-reader-text&quot;&gt;&quot;Optimizely Forms Issue with&amp;#160;Claims&quot;&lt;/span&gt;&lt;/a&gt;</description>            <guid>http://epicmsxperience.com/?p=145</guid>            <pubDate>Thu, 01 Jul 2021 01:43:38 GMT</pubDate>           <category>Blog post</category></item><item> <title>Invalidate Cache After Publishing</title>            <link>http://epicmsxperience.com/?p=129</link>            <description>In order to improve performance and enhace the page loading time while using Search and Navigation, Optimizely provides an extension to cache the search results for a specific period of time. StaticallyCacheFor lets you store your query results, using a timestamp, in a cache with an auto-generated key. Once the defined timestamp has reached, the&lt;a class=&quot;more-link&quot; href=&quot;https://epicmsxperience.com/2021/05/31/invalidate-cache-after-publishing/&quot;&gt;Continue reading &lt;span class=&quot;screen-reader-text&quot;&gt;&quot;Invalidate Cache After&amp;#160;Publishing&quot;&lt;/span&gt;&lt;/a&gt;</description>            <guid>http://epicmsxperience.com/?p=129</guid>            <pubDate>Mon, 31 May 2021 07:47:26 GMT</pubDate>           <category>Blog post</category></item><item> <title>Allowed Types By Interface</title>            <link>http://epicmsxperience.com/?p=113</link>            <description>Sometimes, you will have a flexible content area where you will be able to add a large number of blocks. In this blog post, I will show you how you can replace a large list of allowed types in a property by using an interface. First, let&amp;#8217;s go with a real scenario, where we have&lt;a class=&quot;more-link&quot; href=&quot;https://epicmsxperience.com/2021/05/15/allowed-types-by-interface/&quot;&gt;Continue reading &lt;span class=&quot;screen-reader-text&quot;&gt;&quot;Allowed Types By&amp;#160;Interface&quot;&lt;/span&gt;&lt;/a&gt;</description>            <guid>http://epicmsxperience.com/?p=113</guid>            <pubDate>Sat, 15 May 2021 14:44:25 GMT</pubDate>           <category>Blog post</category></item><item> <title>Exact Time Picker</title>            <link>http://epicmsxperience.com/?p=100</link>            <description>Time picker field is always useful when authors need to manage the time separated from the date. Episerver stores dates as UTC and it dynamically displays the datetime of the content editor&amp;#8217;s machine but what happen if time zone is also managed as a separated field. In this post I will show you how can&lt;a class=&quot;more-link&quot; href=&quot;https://epicmsxperience.com/2021/03/09/exact-time-picker/&quot;&gt;Continue reading &lt;span class=&quot;screen-reader-text&quot;&gt;&quot;Exact Time Picker&quot;&lt;/span&gt;&lt;/a&gt;</description>            <guid>http://epicmsxperience.com/?p=100</guid>            <pubDate>Tue, 09 Mar 2021 22:48:33 GMT</pubDate>           <category>Blog post</category></item><item> <title>Add Link to Edit Media Asset Fields</title>            <link>http://epicmsxperience.com/?p=76</link>            <description>Finding a media asset sometimes can be challenging if the management is not well-done. Use an EditorDescriptor to let your content authors find you assets easily.</description>            <guid>http://epicmsxperience.com/?p=76</guid>            <pubDate>Fri, 29 Jan 2021 20:04:00 GMT</pubDate>           <category>Blog post</category></item><item> <title>Date Range Facets</title>            <link>http://epidevmaster.wordpress.com/?p=11</link>            <description>Faceted search adds powerful search functionality to websites and allows web users to narrow down the results in a listing page, letting the users find what they really want. Sometimes, we need to add a date range facet as part of our search page.  This post will give you some guidance on how to create facets based on DateTime fields using Episerver Search &amp;#38; Navigation (formerly called Episerver Find). </description>            <guid>http://epidevmaster.wordpress.com/?p=11</guid>            <pubDate>Fri, 29 Jan 2021 17:00:00 GMT</pubDate>           <category>Blog post</category></item></channel>
</rss>