注:
重要 (最新の SharePoint 更新プログラム): この記事では、コンテンツ検索 Web パーツ、クエリ ルール、カスタム サーバー側コードを使用した従来の SharePoint Server アプローチについて説明します。
最新の SharePoint (SharePoint Online および SharePoint Server サブスクリプション エディション) では、このアプローチは非推奨または推奨されていません。
同様の結果は、対象ユーザーのターゲット設定、Microsoft Entra ID グループ、Microsoft Search、および最新の Web パーツを使用して実現できるようになりました。
用語セット、コンテンツ検索 Web パーツ、クエリ ルールを組み合わせて SharePoint で使用して、ロケール、興味、性別、紹介リンクなどに基づいて定義したユーザー セグメントに合わせてカスタマイズしたコンテンツを表示します。 SharePoint には、エンド ユーザーの性別、住んでいる場所、興味、紹介リンクなど、エンド ユーザーの特定の属性に応じて、SharePoint サイトに表示するコンテンツを調整するための構成要素が用意されています。 このようなユーザー属性のグループ化をユーザー セグメントと呼びます。
SharePoint では、このユーザー セグメンテーション機能が多くのシナリオで役立ちます。そのようなシナリオの例を次に示します。
- エンド ユーザーの性別に応じてページに異なるバナーを表示する
- エンド ユーザーのロケールに応じて異なる割引プランを表示する
- エンド ユーザーの参照元のリンク (エンド ユーザーをページに移動させた Web サイト) に応じて、ページに異なる記事を表示します。
SharePoint でユーザー セグメントを実装するには、ユーザー セグメントごとに用語セットを作成し、コンテンツ検索 Web パーツを拡張してユーザー セグメントを認識し、クエリ ルールを使用してユーザー セグメントごとに特定のアクションを実行する 3 つのことを行います。
前提条件
SharePoint のユーザー セグメンテーションの実装を開始する前に、次に示すものが開発環境にインストールされていることを確認します。
- SharePoint
- Visual Studio 2012
この記事では、SharePoint で Web パーツを開発した経験があることを前提としています。 Web パーツの開発の詳細については、「 構成要素: Web パーツ」を参照してください。
ユーザー セグメンテーション機能の SharePoint サイトへの追加の概要
図 1 に、ユーザー セグメンテーション機能を SharePoint サイトに追加する基本手順を示します。
図 1.SharePoint サイトにユーザー セグメント化機能を追加する手順
用語セットを作成する
用語とは、SharePoint のアイテムに関連付けできる単語または語句のことです。 用語セットとは、関連する用語の集まりです。 詳細については、「SharePoint Server 2013 の管理されたメタデータの概要」を参照してください。 用語セットは、SharePoint 用語ストア管理ツールで作成することも、プログラムによって作成することもできます。
Microsoft.SharePoint.Taxonomy で公開されている型を使用して、プログラムで用語セットを作成できます。 次のコード例は、 TermSet オブジェクトを作成し、 NavigationTermSetを取得する方法を示しています。 次に、TermSet内にTerm オブジェクトを作成します。 最後に、これらの変更を TermStore にコミットし、ナビゲーションに使用する TermSet を読み込みます。
用語セットに追加した用語ごとに一意の識別子が付与されます。 この識別子は、 コンテンツ検索 Web パーツ にユーザー セグメントを認識させるためのキーです。
static void CreateNavigationTermSet(string siteUrl)
{
using (SPSite site = new SPSite(siteUrl))
{
using (SPWeb web = site.OpenWeb())
{
TaxonomySession taxonomySession = new TaxonomySession(site);
taxonomySession.UpdateCache();
TermStore termStore = taxonomySession.DefaultSiteCollectionTermStore;
// Create a TermSet object in a default site collection term group.
Group siteCollectionGroup = termStore.GetSiteCollectionGroup(site, createIfMissing: true);
TermSet termSet = siteCollectionGroup.CreateTermSet("Navigation Demo", Guid.NewGuid(), lcid: 1033);
// Obtain navigation term set.
NavigationTermSet navigationTermSet = NavigationTermSet.GetAsResolvedByWeb(termSet, web, "GlobalNavigationTaxonomyProvider");
// Create a term that points to a SharePoint page set at the term set level of hierarchy.
NavigationTerm term1 = navigationTermSet.CreateTerm("Term 1", NavigationLinkType.FriendlyUrl, Guid.NewGuid());
// Create a term that points to an already existing URL outside of SharePoint.
NavigationTerm term2 = navigationTermSet.CreateTerm("Term 2", NavigationLinkType.SimpleLink, Guid.NewGuid());
term2.SimpleLinkUrl = "http://www.bing.com/";
// Create a term that points to an existing SharePoint page.
NavigationTerm term3 = navigationTermSet.CreateTerm("Term 3", NavigationLinkType.FriendlyUrl, Guid.NewGuid());
// Save all changes to the term store.
termStore.CommitAll();
}
}
}
ユーザー セグメンテーション用のカスタム Web パーツを作成する
Visual Studio 2012 で、SharePoint カテゴリの視覚的 Web パーツ テンプレートを使用してカスタム Web パーツを作成します。 カスタム Web パーツは 、Content Search Web パーツ オブジェクトから継承する必要があります。
注:
この記事では、SharePoint で Web パーツを開発した経験があることを前提としています。 Web パーツの開発の詳細については、「構成要素: Web パーツ」を参照してください。
ユーザー セグメンテーション ロジックを備えたカスタム Web パーツを構成する
カスタム Web パーツでは、 OnLoad() メソッドまたは OnInit() メソッドのいずれかを再実装して、カスタム ロジックを実行できます。 どちらの方法も、 Content Search Web パーツ オブジェクトのプロパティを設定またはカスタマイズする場合に便利です。
例 1: Male および Female ユーザー セグメントを SharePoint サイトに追加する
Male および Female ユーザー セグメントを追加するには、次のコードに示すように OnLoad() メソッドを再実装します。
protected override void OnLoad(EventArgs e)
{
if (this.AppManager != null)
{
if (this.AppManager.QueryGroups.ContainsKey(this.QueryGroupName) && this.AppManager.QueryGroups[this.QueryGroupName].DataProvider != null)
{
this.AppManager.QueryGroups[this.QueryGroupName].DataProvider.BeforeSerializeToClient += new
BeforeSerializeToClientEventHandler(AddMycustomProperties);
}
}
base.OnLoad(e);
}
対応する AddMycustomProperties メソッドは、次のコードのようになります。
private void AddMycustomProperties(object sender, BeforeSerializeToClientEventArgs e)
{
DataProviderScriptWebPart dp = sender as DataProviderScriptWebPart;
string gender = (string)Page.Session["DataProvider.Gender"];
// Depends on what your DataProvider is: Facebook, LinkedIn, etc.
if (dp != null && gender != null)
{ try
{
// Set property to male or female GUID.
if (gender.CompareTo("female") == 0)
{
dp.Properties["TermSetName"] = new String[] { "TermUniqueIdentifier" };
// E.g. 47ba9139-a4c5-4ff0-8f9a-2864be32da92
}
else if(gender.CompareTo("male") == 0)
{
dp.Properties["UserSegmentTerms"] = new String[] { "TermUniqueIdentifier" };
// E.g. f5bf2195-2170-4b11-a018-a688a285e579
}
}
catch (ArgumentException exp)
{
// Do something with the exception.
}
}
}
例 2: エンド ユーザーが使用している Web ブラウザーの種類に基づいてユーザー セグメントを作成する
エンド ユーザーが使用している Web ブラウザーの種類に基づいてユーザー セグメントを作成し、SharePoint サイトを表示するには、次のコードに示すように OnLoad メソッドを再実装します。
protected override void OnLoad(EventArgs e)
{
if (this.AppManager != null)
{
if (this.AppManager.QueryGroups.ContainsKey(this.QueryGroupName) && this.AppManager.QueryGroups[this.QueryGroupName].DataProvider != null)
{
this.AppManager.QueryGroups[this.QueryGroupName].DataProvider.BeforeSerializeToClient += new
BeforeSerializeToClientEventHandler(AddMycustomProperties);
}
}
base.OnLoad(e);
}
AddMycustomProperties メソッドのコードは、次の例のようになります。
private void AddMycustomProperties(object sender, BeforeSerializeToClientEventArgs e)
{
DataProviderScriptWebPart dataProvider = sender as DataProviderScriptWebPart;
SPSite site = SPContext.Current.Site;
TaxonomySession session = new TaxonomySession(site);
TermStore defaultSiteCollectionStore = session.DefaultSiteCollectionTermStore;
List<string> userSegmentTerms = new List<string>();
var userAgentparts = Page.Request.UserAgent.Split(new char[] { ';', '(', ')' });
foreach (var part in userAgentparts)
{
var entry = part.Trim();
var terms = termStore.GetTermsWithCustomProperty("UserAgent", entry, false);
if (terms.Count > 0)
{
userSegmentTerms.Add(terms[0].Id.ToString());
}
}
dataProvider.Properties["UserSegmentTerms"] = userSegmentTerms.ToArray();
}
カスタム Web パーツを SharePoint Web パーツ ギャラリーにアップロードする
カスタム Web パーツをページで使用するには、Web パーツを SharePoint Web パーツ ギャラリーにアップロードする必要があります。
SharePoint Web Part Galleryで [ サイトの設定] を選択し、[ Web デザイナー ギャラリー] で [ Web パーツ] を選択します。 [ ファイル] タブで、[ ドキュメントのアップロード] を選択します。
ユーザー セグメントに応じて特定のアクションを実行するためのクエリ ルールを追加する
クエリ ルールは、ユーザーが検索しようとする対象にインテリジェントに対応することによって、検索結果の関連性を向上させるようにクエリを変換します。 クエリ ルールでは、条件と関連付けられたアクションを指定します。 クエリがクエリ ルールの条件を満たすと、検索結果の絞り込みや結果の表示順の変更など、検索結果の関連性を向上させるためにルールで指定されたアクションが実行されます。
ユーザー セグメンテーションを実装する際に、クエリ ルールを使用して、定義したユーザー セグメント用の条件とアクションを定義します。 エンド ユーザーが特定のユーザー セグメントの一部である場合、クエリ ルールがアクティブになり、 コンテンツ検索 Web パーツ には、その特定のユーザー セグメントに合わせて調整されたコンテンツが表示されます。
特定のユーザー セグメントに対してアクティブになるクエリ ルールを作成するには
[ サイトの設定] にある発行サイト コレクションで [ サイト コレクションの管理] を選択し、[ 検索クエリ ルール] を選択します。
検索先を選択し、[ 新しいクエリ ルール] を選択します。
[ ルール名] フィールドにルール名を入力します。 次に、 を選択して [コンテキスト] を展開 します。
[ クエリはこれらのユーザー セグメントによって実行 されます] セクションで、[ これらのユーザー セグメントの 1 つ] を選択し、[ ユーザー セグメントの追加] を選択します。
[ タイトル] フィールドに、このユーザー セグメントのクエリ ルールの名前を入力します。 [ ユーザー セグメントの用語の追加] を選択します。
[ 用語ストアからインポートする] ダイアログ ボックスで、[ Managed Metadata Service] を展開します。 [サイト コレクション] で、「用語セットを作成する」で定義済みのユーザー セグメンテーション用語を含む用語セットを探します。 このクエリ ルールを適用するユーザー セグメントを選択します。 次に、[ 保存] を選択します。
[ ユーザー セグメントの追加] ダイアログ ボックスで、ユーザー セグメントの名前を入力します。
これでクエリ ルールがユーザー セグメントにマッピングされ、結果的にユーザー セグメントの用語にマッピングされます。
[ クエリの条件] で [ 条件の削除] を選択します。
これは、 コンテンツ検索 Web パーツ で構成されたクエリがクエリ条件として機能することを指定します。
クエリ ルールによって実行される、対応するアクションを設定します。 [ アクション] セクションで、クエリ ルールの結果として実行される、対応するアクションを選択します。 [ 昇格した結果の追加] または [ 結果のブロックを追加] を選択できます。
クエリ ルールを保存します。
実行するアクションに応じて、その他のユーザー セグメントに対して手順 1. ~ 10. を繰り返します。
カスタム Web パーツを SharePoint ページに追加してクエリ ルールを表示するように設定する
カスタム Web パーツを SharePoint ページに追加する必要があります。
カスタム Web パーツを追加するには
- カテゴリ ページに移動し、[ ページの編集] を選択して、[ ページ テンプレートの編集] を選択します。
- ページの上部セクションで [ Web パーツの追加] を選択します。 次に、Web パーツの右上隅にあるドロップダウン メニューからカスタム Web パーツを選択します。
- [ Web パーツの編集] を選択します。
- [ 設定] セクションを展開し、[ 結果テーブル] フィールドで [ SpecialTermResults] を選択します。
- 設定を保存します。