追記 (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
下にあるアイテムが取得されます。