<?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 Francisco Quintanilla</title> <link>https://world.optimizely.com/blogs/francisco-quintanilla/</link><description></description><ttl>60</ttl><generator>Optimizely World</generator><item> <title>Building a TwoColumnWideLeftSection in Optimizely CMS 13 Visual Builder</title>            <link>http://powerbuilder.home.blog/?p=609</link>            <description>This post walks through a practical “66% / 33%” section built for Visual Builder using the composition tag helpers: &amp;#60;epi-grid&amp;#62;, &amp;#60;epi-row&amp;#62;, &amp;#60;epi-column&amp;#62;, and &amp;#60;epi-component /&amp;#62;. Visual Builder is Optimizely’s layout-and-composition editing experience (originally introduced for CMS SaaS, but the concepts carry over). What you’re building A section type that renders: A Bootstrap container One row &amp;#8230; &lt;p&gt;&lt;a href=&quot;https://powerbuilder.home.blog/2026/02/12/building-a-twocolumnwideleftsection-in-optimizely-cms-13-visual-builder/&quot; class=&quot;more-link&quot;&gt;Continue reading &lt;span class=&quot;screen-reader-text&quot;&gt;Building a TwoColumnWideLeftSection in Optimizely CMS 13 Visual&amp;#160;Builder&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;</description>            <guid>http://powerbuilder.home.blog/?p=609</guid>            <pubDate>Thu, 12 Feb 2026 20:47:19 GMT</pubDate>           <category>Blog post</category></item><item> <title>Optimizely CMS 13 (Pre-release) Visual Builder</title>            <link>http://powerbuilder.home.blog/?p=595</link>            <description>This post captures a proof of concept built on an Alloy MVC site upgraded to Optimizely CMS 13 pre-release, focused on Visual Builder, how to model the new ExperienceData and SectionData types, and how to configure editor-friendly style choices for Visual Builder elements. Sample Alloy MVC repo for CMS 13:https://github.com/evest/cms13-test1/tree/master Why CMS 13 and Visual &amp;#8230; &lt;p&gt;&lt;a href=&quot;https://powerbuilder.home.blog/2026/02/11/optimizely-cms-13-pre-release-visual-builder/&quot; class=&quot;more-link&quot;&gt;Continue reading &lt;span class=&quot;screen-reader-text&quot;&gt;Optimizely CMS 13 (Pre-release) Visual&amp;#160;Builder&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;</description>            <guid>http://powerbuilder.home.blog/?p=595</guid>            <pubDate>Wed, 11 Feb 2026 17:43:21 GMT</pubDate>           <category>Blog post</category></item><item> <title>Fixing TinyMCE Initialization Failures in Optimizely CMS: A Hidden Pipeline Issue with .NET SDK Versions</title>            <link>http://powerbuilder.home.blog/?p=575</link>            <description>Over the past few weeks, several Optimizely CMS projects began experiencing a puzzling failure: XHtmlString fields stopped initializing TinyMCE in the edit interface. The editor simply refused to load, leaving users unable to manage rich text content. This issue surfaced in multiple unrelated projects, so it was clear the root cause wasn’t project-specific code. After &amp;#8230; &lt;p&gt;&lt;a href=&quot;https://powerbuilder.home.blog/2025/12/08/fixing-tinymce-initialization-failures-in-optimizely-cms-a-hidden-pipeline-issue-with-net-sdk-versions/&quot; class=&quot;more-link&quot;&gt;Continue reading &lt;span class=&quot;screen-reader-text&quot;&gt;Fixing TinyMCE Initialization Failures in Optimizely CMS: A Hidden Pipeline Issue with .NET SDK&amp;#160;Versions&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;</description>            <guid>http://powerbuilder.home.blog/?p=575</guid>            <pubDate>Tue, 09 Dec 2025 00:33:29 GMT</pubDate>           <category>Blog post</category></item><item> <title>How to Add Multiple Authentication Providers to an Optimizely CMS 12 Site (Entra ID, Google, Facebook, and Local Identity)</title>            <link>http://powerbuilder.home.blog/?p=547</link>            <description>Modern websites often need to let users sign in with their corporate account (Entra ID), their social identity (Google, Facebook), or a simple email/password for internal users. If you’re building on Optimizely CMS 12, you can support all of them at once — without breaking the built-in CMS login system. In this post, we’ll walk &amp;#8230; &lt;p&gt;&lt;a href=&quot;https://powerbuilder.home.blog/2025/10/22/how-to-add-multiple-authentication-providers-to-an-optimizely-cms-12-site-entra-id-google-facebook-and-local-identity/&quot; class=&quot;more-link&quot;&gt;Continue reading &lt;span class=&quot;screen-reader-text&quot;&gt;How to Add Multiple Authentication Providers to an Optimizely CMS 12 Site (Entra ID, Google, Facebook, and Local&amp;#160;Identity)&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;</description>            <guid>http://powerbuilder.home.blog/?p=547</guid>            <pubDate>Wed, 22 Oct 2025 20:03:27 GMT</pubDate>           <category>Blog post</category></item><item> <title>Building a Custom Payment in Optimizely Commerce 14 (with a simple “Account” method)</title>            <link>http://powerbuilder.home.blog/?p=495</link>            <description>This post outlines a simplified method for integrating Account payments into Commerce 14, detailing a minimal working path without extensive exploration. It covers creating a Payment Option and Payment Gateway, registering them in the Admin UI, and optionally persisting Account numbers in a custom database table.</description>            <guid>http://powerbuilder.home.blog/?p=495</guid>            <pubDate>Fri, 17 Oct 2025 19:41:38 GMT</pubDate>           <category>Blog post</category></item><item> <title>How to Use IPlacedPriceProcessor in Optimizely Commerce to Preserve Custom Line Item Prices (Donation Example)</title>            <link>http://powerbuilder.home.blog/?p=482</link>            <description>Optimizely Commerce 12+ automatically validates line item prices based on catalog data, which can overwrite user-entered prices for donations or custom amounts. To avoid this, you can extend the IPlacedPriceProcessor to preserve user-defined prices by using a custom flag. This method maintains the pricing system&#39;s integrity while accommodating unique business models.</description>            <guid>http://powerbuilder.home.blog/?p=482</guid>            <pubDate>Wed, 15 Oct 2025 15:48:45 GMT</pubDate>           <category>Blog post</category></item><item> <title>Secure Your CMS: A Guide to the OptiAccess Restrictor Add-on</title>            <link>http://powerbuilder.home.blog/?p=464</link>            <description>The OptiAccess Restrictor add-on enhances CMS security by preventing unauthorized access, allowing IP whitelisting.</description>            <guid>http://powerbuilder.home.blog/?p=464</guid>            <pubDate>Tue, 18 Mar 2025 15:22:24 GMT</pubDate>           <category>Blog post</category></item><item> <title>Resolving High CPU Consumption Due to Database Queries in Optimizely CMS</title>            <link>http://powerbuilder.home.blog/?p=442</link>            <description>Have you ever encountered a scenario where your database server&#39;s CPU consumption spiked to 100%, causing major disruptions? In this blog post, we&#39;ll delve into a real-life case where a client experienced precisely that, and how we identified and resolved the root cause. The Problem Unveiled Our client, let&#39;s call them ClientX, was facing intermittent &amp;#8230; &lt;p&gt;&lt;a href=&quot;https://powerbuilder.home.blog/2024/04/01/resolving-high-cpu-consumption-due-to-database-queries-in-optimizely-cms/&quot; class=&quot;more-link&quot;&gt;Continue reading &lt;span class=&quot;screen-reader-text&quot;&gt;Resolving High CPU Consumption Due to Database Queries in Optimizely&amp;#160;CMS&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;</description>            <guid>http://powerbuilder.home.blog/?p=442</guid>            <pubDate>Mon, 01 Apr 2024 21:56:00 GMT</pubDate>           <category>Blog post</category></item><item> <title>Getting Started with Optimizely SaaS Core and Next.js Integration: Content Areas and Blocks</title>            <link>http://powerbuilder.home.blog/?p=399</link>            <description>The blog guide elaborates on improving content rendering by exploring content areas and blocks within the Optimizely CMS. It walks through setting up a ContentArea, creating blocks, populating content, and integrating these blocks in Next.js. The guide also discusses creating a helper class, a Content Area Factory class, and finally incorporating the factory into the Content Page. This allows dynamic rendering of different block types without extensive modifications.</description>            <guid>http://powerbuilder.home.blog/?p=399</guid>            <pubDate>Fri, 08 Dec 2023 01:00:00 GMT</pubDate>           <category>Blog post</category></item><item> <title>Getting Started with Optimizely SaaS Core and Next.js Integration: Creating Content Pages</title>            <link>http://powerbuilder.home.blog/?p=363</link>            <description>The blog post discusses the creation of additional page types with Next.js and Optimizely SaaS Core. It provides a step-by-step guide on how to create content pages, query content, and build pages in Next.js. The post also explains how dynamic routing and the implementation of a Factory class can streamline the creation process and enhance code maintainability.</description>            <guid>http://powerbuilder.home.blog/?p=363</guid>            <pubDate>Fri, 01 Dec 2023 01:30:00 GMT</pubDate>           <category>Blog post</category></item><item> <title>Getting Started with Optimizely SaaS Core and Next.js Integration: Testing Content Updates</title>            <link>http://powerbuilder.home.blog/?p=339</link>            <description>The blog post discusses the challenges of content updates on a website using Optimizely CMS, Next.js, and the Apollo Client due to Apollo&#39;s local caching feature. The local caching enhances application speed but fails to reflect real-time updates. A temporary solution used is the revalidate parameter set  to revalidate the cache every 5 seconds, ensuring content updates are reflected. However, this is not ideal for long-term use, and more targeted cache updates are preferable in a production environment.</description>            <guid>http://powerbuilder.home.blog/?p=339</guid>            <pubDate>Mon, 27 Nov 2023 13:47:09 GMT</pubDate>           <category>Blog post</category></item><item> <title>Getting Started with Optimizely SaaS Core and Next.js Integration</title>            <link>http://powerbuilder.home.blog/?p=285</link>            <description>The blog post covers the process of creating a website with Optimizely SaaS Core and integrating it with a Next.js project. Key steps include defining content types, setting up the website, synchronizing data with Optimizely Graph, installing Next.js, and incorporating Apollo for GraphQL data fetching. The post also provides information about styling adjustments and future topics.</description>            <guid>http://powerbuilder.home.blog/?p=285</guid>            <pubDate>Thu, 23 Nov 2023 18:08:30 GMT</pubDate>           <category>Blog post</category></item><item> <title>How to Merge Anonymous Carts When a Customer Logs In with Optimizely Commerce 14</title>            <link>https://world.optimizely.com/blogs/francisco-quintanilla/dates/2023/3/how-to-merge-anonymous-carts-when-a-customer-logs-in-with-optimizely-commerce-14/</link>            <description>&lt;p&gt;In e-commerce, it is common for users to browse a site anonymously, adding items to their cart without creating an account. Later, when the user decides to create an account or log in, they may have items already in their anonymous cart that they would like to keep. In this scenario, it is important to merge the anonymous cart with the authenticated cart to ensure a seamless shopping experience.&lt;/p&gt;
&lt;p&gt;In this blog post, I will show you how to merge anonymous carts with authenticated carts in Optimizely Commerce 14.&lt;/p&gt;
&lt;h3&gt;Overview&lt;/h3&gt;
&lt;p&gt;The code I will be using is a middleware component that runs on every incoming HTTP request. If the user is authenticated, the middleware retrieves the user&#39;s anonymous cart using the &lt;code&gt;IAnonymousIdFeature&lt;/code&gt; and merges it with their authenticated cart.&lt;/p&gt;
&lt;pre class=&quot;language-csharp&quot;&gt;&lt;code&gt;using EPiServer.Commerce.Order;
using EPiServer.ServiceLocation;
using Mediachase.Commerce;
using Mediachase.Commerce.Anonymous;
using Mediachase.Commerce.Customers;
using Mediachase.Commerce.Markets;

namespace Infrastructure.Commerce.Extensions
{
    public class AnonymousCartMergingMiddleware
    {
        private readonly RequestDelegate _next;

        public AnonymousCartMergingMiddleware(RequestDelegate next)
        {
            _next = next;
        }

        public async Task InvokeAsync(HttpContext context)
        {
            if (context.User.Identity != null &amp;amp;&amp;amp; context.User.Identity.IsAuthenticated)
            {
                var anonymousId = context.Features.Get&amp;lt;IAnonymousIdFeature&amp;gt;().AnonymousId;
                
                if (!string.IsNullOrWhiteSpace(anonymousId))
                {
                    var orderRepository = ServiceLocator.Current.GetInstance&amp;lt;IOrderRepository&amp;gt;();
                    var marketService = ServiceLocator.Current.GetInstance&amp;lt;IMarketService&amp;gt;();
                    
                    var market = marketService.GetMarket(MarketId.Default);
                    var cart = orderRepository.LoadCart&amp;lt;ICart&amp;gt;(new Guid(anonymousId), Constants.CartName.ShoppingCart, market.MarketId);

                    if (cart != null &amp;amp;&amp;amp; cart.GetAllLineItems().ToList().Count &amp;gt; 0)
                    {
                        var currentMarket = ServiceLocator.Current.GetInstance&amp;lt;ICurrentMarket&amp;gt;();
                        cart.MarketId = currentMarket.GetCurrentMarket().MarketId;
                        orderRepository.Save(cart);
                        
                        var profileMigrator = ServiceLocator.Current.GetInstance&amp;lt;IProfileMigrator&amp;gt;();
                        profileMigrator.MigrateCarts(new Guid(anonymousId));
                    }
                }
            }

            await _next(context);
        }
    }
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;You can use an extension method to expose the middleware through `IApplicationBuilder`.&lt;/p&gt;
&lt;pre class=&quot;language-csharp&quot;&gt;&lt;code&gt;namespace Infrastructure.Commerce.Extensions
{
    public static class AnonymousCartMergingMiddlewareExtensions
    {
        public static IApplicationBuilder UseAnonymousCartMerging(this IApplicationBuilder builder)
        {
            return builder.UseMiddleware&amp;lt;AnonymousCartMergingMiddleware&amp;gt;();
        }
    }
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;The following code calls the middleware from `Startup.cs`&lt;/p&gt;
&lt;pre class=&quot;language-csharp&quot;&gt;&lt;code&gt;    public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
    {
        app.UseAnonymousCartMerging();        
    }&lt;/code&gt;&lt;/pre&gt;</description>            <guid>https://world.optimizely.com/blogs/francisco-quintanilla/dates/2023/3/how-to-merge-anonymous-carts-when-a-customer-logs-in-with-optimizely-commerce-14/</guid>            <pubDate>Mon, 27 Mar 2023 22:44:18 GMT</pubDate>           <category>Blog post</category></item><item> <title>Organize page content into folders dynamically</title>            <link>https://powerbuilder.home.blog/?p=255</link>            <description>Why do we need organized content into folders or containers? As your content tree grows, it gets more difficult to locate items and performance can decrease.All the items inside the folder or container are automatically organized in a logical format. When to use dynamic folders? When you need to manage large number of items in &amp;#8230; &lt;p&gt;&lt;a href=&quot;https://powerbuilder.home.blog/2022/03/03/organize-page-content-into-folders-dynamically/&quot; class=&quot;more-link&quot;&gt;Continue reading &lt;span class=&quot;screen-reader-text&quot;&gt;Organize page content into folders&amp;#160;dynamically&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;</description>            <guid>https://powerbuilder.home.blog/?p=255</guid>            <pubDate>Thu, 03 Mar 2022 20:59:35 GMT</pubDate>           <category>Blog post</category></item><item> <title>Organize page content into folders dynamically</title>            <link>http://powerbuilder.home.blog/?p=255</link>            <description>Why do we need organized content into folders or containers? As your content tree grows, it gets more difficult to locate items and performance can decrease.All the items inside the folder or container are automatically organized in a logical format. When to use dynamic folders? When you need to manage large number of items in &amp;#8230; &lt;p&gt;&lt;a href=&quot;https://powerbuilder.home.blog/2022/03/03/organize-page-content-into-folders-dynamically/&quot; class=&quot;more-link&quot;&gt;Continue reading &lt;span class=&quot;screen-reader-text&quot;&gt;Organize page content into folders&amp;#160;dynamically&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;</description>            <guid>http://powerbuilder.home.blog/?p=255</guid>            <pubDate>Thu, 03 Mar 2022 20:59:35 GMT</pubDate>           <category>Blog post</category></item><item> <title>Cache Tag Helpers in Optimizely 12</title>            <link>https://powerbuilder.home.blog/?p=237</link>            <description>As developers, we always should look for opportunities to boost the performance of web applications. Caching is one of them. It can significantly improve our application load time and responsiveness and ASP.NET Core helps us with this by providing server-side caching using Caching Tag Helpers in views.</description>            <guid>https://powerbuilder.home.blog/?p=237</guid>            <pubDate>Fri, 26 Nov 2021 22:27:32 GMT</pubDate>           <category>Blog post</category></item><item> <title>Cache Tag Helpers in Optimizely 12</title>            <link>http://powerbuilder.home.blog/?p=237</link>            <description>As developers, we always should look for opportunities to boost the performance of web applications. Caching is one of them. It can significantly improve our application load time and responsiveness and ASP.NET Core helps us with this by providing server-side caching using Caching Tag Helpers in views.</description>            <guid>http://powerbuilder.home.blog/?p=237</guid>            <pubDate>Fri, 26 Nov 2021 22:27:32 GMT</pubDate>           <category>Blog post</category></item><item> <title>Downgrade Optimizely (Former Episerver)</title>            <link>http://powerbuilder.home.blog/?p=226</link>            <description>Downgrade Episerver library verions</description>            <guid>http://powerbuilder.home.blog/?p=226</guid>            <pubDate>Sat, 29 May 2021 17:04:11 GMT</pubDate>           <category>Blog post</category></item><item> <title>Downgrade Optimizely (Former Episerver)</title>            <link>https://powerbuilder.home.blog/?p=226</link>            <description>This may sound a bit strange, but I had to downgrade Episerver Find in lower environments. It is not enough to install the old NuGet library into your development environment and publish it again to Integration. First, you need to make sure that the database has not been upgraded, but if it was, you should &amp;#8230; &lt;p&gt;&lt;a href=&quot;https://powerbuilder.home.blog/2021/05/29/downgrade-optimizely-former-episerver/&quot; class=&quot;more-link&quot;&gt;Continue reading &lt;span class=&quot;screen-reader-text&quot;&gt;Downgrade Optimizely (Former&amp;#160;Episerver)&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;</description>            <guid>https://powerbuilder.home.blog/?p=226</guid>            <pubDate>Sat, 29 May 2021 17:04:11 GMT</pubDate>           <category>Blog post</category></item><item> <title>Content Usages Add-on</title>            <link>http://powerbuilder.home.blog/?p=205</link>            <description>It is very important for editors to know the impact of changing content, especially what exact pages will be affected when changing block content. This add-on will help editors know on what pages the item is being used. Content Link Add-on Content Links Report Installation The module is available for download and installation as&amp;#160; NuGet &amp;#8230; &lt;p&gt;&lt;a href=&quot;https://powerbuilder.home.blog/2020/12/16/content-usages-add-on/&quot; class=&quot;more-link&quot;&gt;Continue reading &lt;span class=&quot;screen-reader-text&quot;&gt;Content Usages Add-on&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;</description>            <guid>http://powerbuilder.home.blog/?p=205</guid>            <pubDate>Wed, 16 Dec 2020 21:25:08 GMT</pubDate>           <category>Blog post</category></item></channel>
</rss>