追記 (2019/6/27)

SXAのサイトかどうか判定するIsSxaSite拡張メソッドが用意されていました。
こちらを使うことをおすすめします。

// 以下の名前空間をusingする必要があります。
// using Sitecore.XA.Foundation.Multisite.Extensions;

var sxaSites = SiteManager.GetSites().Where(site => site.IsSxaSite()).ToList();


こんにちは。Sitecore技術担当の山田です。

今回はSitecoreのサイト取得APIについて、ちょっとしたテクニックをご紹介します。

Sitecoreで定義したサイト一覧を取得するには、Sitecore.Sites.SiteManager.GetSitesメソッドを使用します。
しかしこのメソッドで取得したサイトには、configのsitesセクションで定義したサイトとSXAで定義したサイトの両方が含まれています。

SXAで定義したサイトのみを取得するには、以下のアセンブリに含まれるAPIを使用します。

  • Sitecore.DependencyInjection.dll
  • Sitecore.XA.Foundation.Multisite.dll

使い方は以下のサンプルコードをご覧ください。
var sitesResolver = ServiceLocator.ServiceProvider.GetService(typeof (IEnvironmentSitesResolver)) as IEnvironmentSitesResolver;
var sites = sitesResolver.ResolveAllSites(Context.Database);

foreach (var site in sites)
{
    // サイト名
    var siteName = site["SiteName"];

    // ホスト名
    var hostName = site["HostName"];

    // ホームアイテム
    var startItem = ((ReferenceField)site.Fields["StartItem"]).TargetItem;

    // ...
}

取得したサイトはSiteInfoオブジェクトではなくSitecore上のアイテムだという点に注意してください。
実際には各SXAサイトのSettings/Site Grouping下にあるアイテムが取得されます。