こんにちは。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下にあるアイテムが取得されます。