Sitecore
デジタルエクスペリエンスプラットフォーム。CMS、パーソナライゼーション、マーケティング自動化を統合。
CMS
Sitecore
概要
Sitecoreは、CMS、パーソナライゼーション、マーケティング自動化を統合した包括的なデジタルエクスペリエンスプラットフォームです。
詳細
Sitecore Experience Platform(XP)は、企業のデジタルマーケティングニーズに対応する統合型プラットフォームです。.NET/C#ベースで構築され、Microsoft技術スタックとの高い親和性を持ちます。リアルタイムパーソナライゼーション、AIを活用したコンテンツ最適化、顧客データプラットフォーム(CDP)、マーケティング自動化、A/Bテスト機能を一つのプラットフォームで提供します。Experience Database(xDB)により、すべての顧客インタラクションを記録・分析し、パターンカードによる顧客プロファイリングを実現します。2024年のSitecore Streamの導入により、ブランド認識AIとエージェント型ワークフローが追加され、マーケターの作業効率が大幅に向上しました。5000社以上のエンタープライズ顧客に採用され、特に大規模なeコマースとマーケティングサイトで高い評価を得ています。
メリット・デメリット
メリット
- 強力なパーソナライゼーション: リアルタイムでのコンテンツ最適化
- 統合マーケティング機能: CMS、CDP、MA、分析を一つのプラットフォームで
- AI駆動の最適化: Sitecore CortexとStreamによる自動化
- スケーラビリティ: 大規模サイトでの実績豊富
- 多言語・多地域対応: グローバルサイト管理に最適
- 豊富なAPI: RESTとGraphQLによる柔軟な統合
- エンタープライズサポート: 24/7サポートと豊富なパートナーネットワーク
デメリット
- 高額なライセンス費用: 年間$100,000以上の投資が必要
- 複雑な設定と管理: 専門的な技術知識が必須
- Microsoft技術への依存: .NET環境に限定される
- 長い実装期間: 導入に数ヶ月から1年以上かかることも
- 高い学習曲線: 開発者とマーケターの両方に習熟期間が必要
- インフラコスト: 高いサーバー要件とメンテナンスコスト
主要リンク
- Sitecore公式サイト
- Sitecore Documentation
- Sitecore Developer Portal
- Sitecore Community
- Sitecore Learning
- Sitecore Marketplace
使い方の例
初期セットアップとプロジェクト構成
# Sitecore CLIのインストール
dotnet tool install --global Sitecore.CLI
# 新規プロジェクトの作成
dotnet new sitecore.aspnet.gettingstarted -n MySitecoreProject
cd MySitecoreProject
# Sitecore環境の初期化
dotnet sitecore init
# Docker環境の起動
docker-compose up -d
# パッケージのインストールとデプロイ
dotnet sitecore ser push
コンポーネント開発(MVC)
// Models/HeroModel.cs
using Sitecore.Mvc.Presentation;
using Sitecore.Data.Fields;
namespace MySitecoreProject.Models
{
public class HeroModel : RenderingModel
{
public string Title { get; set; }
public string Subtitle { get; set; }
public string BackgroundImage { get; set; }
public string CtaText { get; set; }
public string CtaLink { get; set; }
public override void Initialize(Rendering rendering)
{
base.Initialize(rendering);
var dataSource = rendering.Item;
if (dataSource != null)
{
Title = dataSource["Title"];
Subtitle = dataSource["Subtitle"];
ImageField imageField = dataSource.Fields["Background Image"];
if (imageField?.MediaItem != null)
{
BackgroundImage = Sitecore.Resources.Media.MediaManager.GetMediaUrl(imageField.MediaItem);
}
LinkField ctaField = dataSource.Fields["CTA Link"];
if (ctaField != null)
{
CtaText = ctaField.Text;
CtaLink = ctaField.GetFriendlyUrl();
}
}
}
}
}
// Views/Hero.cshtml
@model MySitecoreProject.Models.HeroModel
<section class="hero" style="background-image: url('@Model.BackgroundImage')">
<div class="hero-content">
<h1>@Model.Title</h1>
<p>@Model.Subtitle</p>
@if (!string.IsNullOrEmpty(Model.CtaLink))
{
<a href="@Model.CtaLink" class="cta-button">@Model.CtaText</a>
}
</div>
</section>
Experience Database(xDB)とパーソナライゼーション
// カスタムファセットの定義
using Sitecore.XConnect;
using Sitecore.XConnect.Schema;
public class PurchaseHistory : Facet
{
public const string DefaultFacetKey = "PurchaseHistory";
public decimal TotalAmount { get; set; }
public int PurchaseCount { get; set; }
public DateTime LastPurchaseDate { get; set; }
public List<string> ProductCategories { get; set; }
}
// xConnectでの顧客データ更新
public async Task UpdateCustomerPurchase(Guid contactId, decimal amount, string category)
{
using (XConnectClient client = SitecoreXConnectClientConfiguration.GetClient())
{
try
{
var reference = new IdentifiedContactReference("sitecorecontactid", contactId.ToString());
var contact = await client.GetAsync(reference,
new ContactExecutionOptions(new ContactExpandOptions(PurchaseHistory.DefaultFacetKey)));
if (contact != null)
{
var purchaseHistory = contact.GetFacet<PurchaseHistory>(PurchaseHistory.DefaultFacetKey)
?? new PurchaseHistory();
purchaseHistory.TotalAmount += amount;
purchaseHistory.PurchaseCount++;
purchaseHistory.LastPurchaseDate = DateTime.UtcNow;
if (purchaseHistory.ProductCategories == null)
purchaseHistory.ProductCategories = new List<string>();
if (!purchaseHistory.ProductCategories.Contains(category))
purchaseHistory.ProductCategories.Add(category);
client.SetFacet(contact, PurchaseHistory.DefaultFacetKey, purchaseHistory);
await client.SubmitAsync();
}
}
catch (XdbExecutionException ex)
{
// エラーハンドリング
}
}
}
マーケティング自動化
// カスタムマーケティングオートメーションアクティビティ
using Sitecore.Marketing.Automation.Activity;
using Sitecore.Marketing.Automation.Models;
using Microsoft.Extensions.Logging;
public class SendPersonalizedEmailActivity : IActivity
{
private readonly ILogger<SendPersonalizedEmailActivity> _logger;
public SendPersonalizedEmailActivity(ILogger<SendPersonalizedEmailActivity> logger)
{
_logger = logger;
}
public ActivityResult Invoke(IContactProcessingContext context)
{
var contact = context.Contact;
var emailAddress = contact.Emails()?.PreferredEmail?.SmtpAddress;
if (string.IsNullOrEmpty(emailAddress))
{
return new FailureActivityResult("No email address found");
}
// パーソナライズされたコンテンツの生成
var purchaseHistory = contact.GetFacet<PurchaseHistory>(PurchaseHistory.DefaultFacetKey);
var emailContent = GeneratePersonalizedContent(contact, purchaseHistory);
// メール送信ロジック
SendEmail(emailAddress, emailContent);
return new SuccessActivityResult();
}
private EmailContent GeneratePersonalizedContent(Contact contact, PurchaseHistory history)
{
// AIを使用したコンテンツ生成ロジック
return new EmailContent
{
Subject = $"Special offer for {contact.Personal()?.FirstName}",
Body = GenerateRecommendations(history)
};
}
}
Sitecore JSS(ヘッドレス実装)
// components/Hero.js (React)
import React from 'react';
import { Text, Image, Link, RichText } from '@sitecore-jss/sitecore-jss-react';
const Hero = ({ fields }) => (
<section className="hero">
<Image
field={fields.backgroundImage}
className="hero-background"
srcSet={[{ mw: 768 }, { mw: 1200 }]}
/>
<div className="hero-content">
<Text tag="h1" field={fields.title} />
<RichText field={fields.description} />
<Link field={fields.ctaLink} className="cta-button">
<Text field={fields.ctaText} />
</Link>
</div>
</section>
);
export default Hero;
// GraphQL クエリ
export const query = graphql`
fragment HeroFragment on Hero {
title {
value
}
description {
value
}
backgroundImage {
value {
src
alt
}
}
ctaLink {
value {
href
text
}
}
}
`;
A/Bテストの実装
// パーソナライゼーションルールの設定
public class PremiumCustomerCondition : StringOperatorCondition<string>
{
public string CustomerLevel { get; set; }
protected override bool Execute(string customerLevel, ConditionalRenderingsRuleContext context)
{
if (context.Contact == null) return false;
var xConnectContact = GetXConnectContact(context.Contact);
var purchaseHistory = xConnectContact?.GetFacet<PurchaseHistory>(PurchaseHistory.DefaultFacetKey);
if (purchaseHistory == null) return false;
// プレミアム顧客の判定ロジック
return purchaseHistory.TotalAmount > 100000 ||
purchaseHistory.PurchaseCount > 50;
}
}
// MVTテストの設定
public class ProductPageMvtStrategy : IMultivariateTestStrategy
{
public string SelectVariation(MultivariateTest test, Contact contact)
{
// コンタクトの属性に基づいてバリエーションを選択
var segment = DetermineContactSegment(contact);
switch (segment)
{
case "HighValue":
return "PremiumLayout";
case "NewVisitor":
return "WelcomeLayout";
default:
return "StandardLayout";
}
}
}
SXA(Sitecore Experience Accelerator)の活用
// レンダリングバリアントの定義
{
"name": "Product Card",
"fields": [
{
"name": "Image",
"type": "Image",
"cssClass": "product-image"
},
{
"name": "Title",
"type": "Text",
"tag": "h3",
"cssClass": "product-title"
},
{
"name": "Price",
"type": "Text",
"prefix": "$",
"cssClass": "product-price"
},
{
"name": "Add to Cart",
"type": "Link",
"cssClass": "btn btn-primary"
}
]
}