Take the community feedback survey now.

Ben Nitti
Oct 6, 2021
  4675
(2 votes)

How to exclude pages from your search index, sitemaps and internet search engines

Your client wants to exclude certain pages from showiing up in your site's search results, they also want prevent these pages from being crawled by external search engines (Google, Bing etc.) and lastly they want them removed from their sitemap.xml file.  All of this can be achieved and controlled with a checkbox property on the Settings tab in the editor. I'll demonstrate below. 

Create an interface with a boolean property that inherits IContent

	public interface IDisableIndexing : IContent
	{
		bool DisableIndex { get; set; }
	}

Add it to your base class or any page type 

    public abstract class SitePageData : PageData, IDisableIndex
    {
        [CultureSpecific]
		[Display(Name = "Disable Indexing",
			Description = "Removes the page from search index, sitemap and search engines",
			GroupName = SystemTabNames.Settings,
			Order = 10)]
		public virtual bool DisableIndex { get; set; }
    }

Optimizely Search & Navigation

You can filter  from your Optimizely Search & Navigation search index by creating a module dependency class for your search conventions (this where IContent is implemented)

	[ModuleDependency(typeof(IndexingModule))]
	public class FindConventionsInitialization : IInitializableModule
	{
		public void Initialize(InitializationEngine context)
		{
			var client = SearchClient.Instance;
			ContentIndexer.Instance.Conventions.ForInstancesOf<IHasDisableIndex>().ShouldIndex(x => !x.DisableIndex);
		}

		public void Uninitialize(InitializationEngine context) { }
	}

External Search Engines

Use the same boolean property to add instructions for search robots from the <head></head> element in your layout view

<head>
    @if (Model.DisableIndex)
    {
		<meta name="ROBOTS" content="noindex, nofollow" />
    }
</head>

Sitemaps

If you're using the Geta Sitemap generator you can extend it and filter these pages from being added to when the xml file is being generated. Create a class that inherits from the abstract base SitemapXmlGenerator class and interface ICommerceAndStandardSitemapXmlGenerator. Override the AddFilteredContentElement method and from there you can exlude the pages with IDisableIndex.  

    public class CommerceAndStandardSitemapXmlGenerator : SitemapXmlGenerator, ICommerceAndStandardSitemapXmlGenerator
	{
		public CommerceAndStandardSitemapXmlGenerator(
			ISitemapRepository sitemapRepository, 
			IContentRepository contentRepository, 
			UrlResolver urlResolver, 
			ISiteDefinitionRepository siteDefinitionRepository, 
			ILanguageBranchRepository languageBranchRepository, 
			IContentFilter contentFilter) 
			: base(sitemapRepository,  contentRepository, urlResolver, siteDefinitionRepository, languageBranchRepository, contentFilter)
		{
		}

		//Filter content from xml sitemap
		protected override void AddFilteredContentElement(CurrentLanguageContent languageContentInfo, IList<XElement> xmlElements)
		{
			var sitemapContent = languageContentInfo.Content as IHasDisableIndex;

			if (sitemapContent != null && sitemapContent.DisableIndex)
			{
				return;
			}

			base.AddFilteredContentElement(languageContentInfo, xmlElements);
		}
	}
Oct 06, 2021

Comments

Please login to comment.
Latest blogs
A day in the life of an Optimizely Developer - The Optimizely Opal Tools SDK: How to Extend Opal with Your Own Superpowers

If you’ve spent any time with  Optimizely Opal —Optimizely’s cross‑platform AI assistant—you’ll know it can already plan, generate, analyze, and...

Graham Carr | Sep 4, 2025

Building Faster Feedback Loops with Opal: Two Hackathon Projects

Two Opal Hackathon projects explored how to bridge data and action. Using the Optimizely.Opal.Tools SDK, we extended Opal with new tools, showing h...

Andy Blyth | Sep 3, 2025 |

Custom Deepl Glossary Translation in Optimizely CMS

Introduction in this post, I have created a custom DeepL glossary translation for specific words. For example, when translating from English to...

Deepmala S | Sep 3, 2025

Showing Unpublished Block Status in Optimizely CMS 12 ContentArea

Introduction One of the most common editor complaints in Optimizely CMS is that it’s not obvious when a block inside a ContentArea has unpublished...

Adnan Zameer | Sep 2, 2025 |

How to Show Unpublished Blocks in Page Preview (Optimizely CMS 12)

Introduction In this post, we’ll look at why Draft Blocks don’t show in Page Preview by default, and I'll show you a clean, drop-in solution to fix...

Adnan Zameer | Sep 1, 2025 |

A day in the life of an Optimizely Developer - We Hacked the Future: Netcel's Opal Hackathon Adventure

Ever wondered what happens when you mix  AI ,  creativity , and a dash of competitive spirit? Welcome to the  Opal Hackathon 2025 —where we rolled ...

Graham Carr | Aug 31, 2025