Quan Mai
Oct 16, 2018
visibility 2955
star star star star star
(7 votes)

Extending Commerce campaign facets

It's fair to say Commerce sites are imcomplete without sales campaigns and promotions. Episerver Commerce fully supports that and even better, it allows you to handle (fairly *) big number of campaigns and promotions with ease. One of the most highly anticipated features that was added to Commerce last year was the Campaign facet groups, which allows you to filter campaigns and promotions without breaking a sweat:

This is great because it allows you to quickly navigate/filter by campaign statuses, promotion types and markets. However, can it be even greater?

What if you have one type of promotion so you don't bother showing other types? Or if you have 4 markets, and everytime you want to filter by the forth market, you would have to click on the expand button on the market filter, so you can select it. Or if you have more filters, based on the targeting visitor groups of the campaigns?

Until now, it is possible, but with a ceveat. You have to do things that you should not have to (and probably don't want to) to get it done.

Worry no more, with the upcoming Commerce 12.10, it is, hopefully, much easier.

Commerce 12.10 introduces FacetGroupModifier, which can be overriden to change the builtin facet groups, or to add new facet groups. Let's go back to previous example: let's make the market facet group show 4 markets all the time:

 public class CustomFacetGroupModifier : FacetGroupModifier
    {
        public override IEnumerable<FacetGroup> ModifyFacetGroups(IEnumerable<FacetGroup> facetGroups)
        {
            var marketFacetGroup = facetGroups.FirstOrDefault(f => f.Id == CampaignFacetConstants.MarketGroupId);
            if (marketFacetGroup != null)
            {
                marketFacetGroup.Settings.ItemsToShow = 4;
            }
            return facetGroups;
        }
    }


 So FacetGroupModifier has only one method that take a list of FacetGroup and returns one. Here you can decide what to do with the builtin facet groups (which is passed to you), by changing their settings, remove one or more, or decide to add your own. And then you just need to register your implementation in one of your IConfigurableModule

 public void ConfigureContainer(ServiceConfigurationContext context)
        {
            var services = context.Services;
services.AddSingleton<FacetGroupModifier, CustomFacetGroupModifier>();
        }

And that's it, my friends :)

Commerce 12.10 is being baked (read, being tested by our QAs) and will be released in one week or so.

*: By Fairly, I meant thousands. Anything more than a dozen thousands is on the edge of the UI.

Oct 16, 2018

Comments

Jafet Valdez
Jafet Valdez Oct 16, 2018 02:50 PM

Very nice! Looking forward to testing this out. laughing

Jeroen Stemerdink
Jeroen Stemerdink Oct 17, 2018 11:33 AM

Cool! So that would mean that when filter my campaigns for acces, like I wrote about here, I can make the count in the facets reflect the actual filtered value?

Quan Mai
Quan Mai Oct 18, 2018 08:22 AM

Without digging into your blog post - I would probably say yes. Here you can control what you would like to show and if you set the FacetItem.Count to correct value then it should work :) 

error Please login to comment.
Latest blogs
Advanced Task Manager Gets a Big Update

One of the things I keep coming back to with Optimizely's content approval workflow is that it's solid at the individual level - you know a piece o...

Adnan Zameer | Jul 21, 2026 |

Parallel Development in Optimizely CMS SaaS: A Smarter Way to Register Components

📌 A note before you read: The approach described in this article is not a replacement for Optimizely’s recommended out-of-the-box component...

Vipin Banka | Jul 21, 2026

How I Deployed My Optimizely Content JS SDK Next.js App on Vercel (Hello Opti World)

📌 Scope: This post covers Optimizely CMS (SaaS) only, using the official content-js-sdk with Next.js 15 deployed to Vercel. This is a practitioner...

Kiran Patil | Jul 21, 2026 |

Finding Thomas Part 5 - The Closed Loop

Five weeks. Five layers. One Thomas. If you've followed this series from the start — thank you. If you're just landing here, the short version:...

Ritu Madan | Jul 20, 2026

Extending the Optimizely Product Recommendations Feed to Include Custom Product Types

A practical way to extend the Optimizely Product Recommendations catalog feed so the export scheduled job also includes custom catalog types, like...

Wojciech Seweryn | Jul 20, 2026 |

Parallel Development in Optimizely CMS SaaS: A Smarter Way to Push Content Models

When Optimizely shipped the JavaScript SDK and CLI for CMS SaaS, they gave developers something pretty cool — a code-first workflow for content...

Vipin Banka | Jul 20, 2026