サイトコア既定のRSSフィード機能を使用してRSSページを実装する場合、特定のアイテム配下(子孫のアイテム含む)または、サイトコアクエリーに一致するアイテムをRSS のページに表示できます。表示件数や表示アイテムの有効期限は Web.configの以下の項目で設定できます。

<setting name="Feeds.ItemExpiration" value="0"/>
<setting name="Feeds.MaximumItemsInFeed" value="50"/>

サイトコアクエリーを使用する場合は次のWeb.configのQuery.MaxItemsの値も影響する可能性があります。取得されたアイテムは RSSの日付フィールドに設定したフィールドの降順でRSS Feedの一覧に表示されます。

既定の RSSフィードに表示をする機能は非常にシンプルで簡単にRSSのページを作成することができます。公開サイト用のRSSフィードの作成方法については、SDNのドキュメントや次のURLを参照してください。

サイトコアの機能を利用してRSSフィードを作成する

標準で提供される RSSフィードアイテムを選択する方法では、ハードコードされたサイトコアクエリで表現するのが難しい条件を使用してフィードに表示するアイテムを抽出するロジックを組み込むことができません。そこで、現在日付から X日以内に更新されたフィード用のアイテムを取得するカスタム PublicFeedクラスを実装してみます。

検証環境は次の通りです

  • Sitecore CMS 6.6 SP1

Feed用のアイテムを取得するためのカスタムなPublicFeedクラスの実装方法の詳細は,SDNのコンテンツ API クックブックのシンジケーションAPIのセクションを参照してください。

1.カスタムPublicFeedクラスの作成

今回は、具体的には現在日時から、30日以内に更新されたアイテムのみをフィードに表示する次のような CustomPublicFeed.cs ファイルを作成しました。csファイルをビルドするには Sitecore.Kernel.dll への参照が必要です。 CustomPublicFeedクラスでは RSSFeed型のアイテムのSourceフィールドを参照して custom: とういプリフィックスが設定されていたら、Sourceフィールドで指定された サイトコアクエリーのプレースホルダー {0} に現在日時から 30日前の日付を設定することで、30日以内のアイテムを抽出できるサイトコアクエリーを動的に作成するように実装されています。そのため、本クラスを期待通りに動作させるには、サイトコアクエリーの一部に絞り込み条件に使用したい日付フィールドを含めておく必要があります。実際の例は後で記載します。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;

namespace Sample.Web.Rss
{
    /// <summary>
    /// 現在から30日以降に更新されたアイテムを取得する
    /// </summary>
    public class CustomPublicFeed : Sitecore.Syndication.PublicFeed
    {
        public override IEnumerable<Sitecore.Data.Items.Item> GetSourceItems()
        {
            string text = this.FeedItem["Source"];
            if (!string.IsNullOrEmpty(text) && text.StartsWith("custom:"))
            {
                string query = FormatCustomQuery(text).Replace("custom:", "query:");
                
                return Sitecore.Web.UI.HtmlControls.Data.LookupSources.GetItems(this.FeedItem, query);
            }
            else
            {
                return base.GetSourceItems();
            }
        }

        public virtual string FormatCustomQuery(string queryBase)
        {
            return string.Format(queryBase, DateTime.Now.AddDays(-30).ToString("yyyyMMdd"));
        }
    }
}

クラスを作成したらビルドを行い、アセンブリを Website/bin フォルダ配下に配置します。

2.動作確認

作成したCustomPublicFeedを使用して RSSフィードを表示するサンプルを見てみます。今回は想定として下図のようなコンテンツツリーがあるとします。RssTop 配下のアイテムをRSSフィードとして表示するように ItemRss という Rss Feed型のアイテムを作成しています。

ItemRss アイテムのアイテム(Source)フィールドに日付比較の条件がプレースホルダーとして設定された カスタムの サイトコアクエリーを設定しています。custom:というプリフィックスを指定することで、CustomPublicFeedクラスで日付絞り込みのためのプレースホルダー付きのサイトコアクエリー文字列が処理されるようにしています。今回のサイトコアクエリでは、ReleaseDateフィールドが30日以内の日付のアイテムが抽出されるようになります。@ReleaseDate は比較に使用するフィールド例です。__Updated など日時や日付型のスタンダードフィールドも使うことができます。

拡張性セクションのタイプフィールドで、CustomPublicFeedクラスのシグネチャを指定しています。

設定は完了です。ItemRssのページを表示すると CustomPublicFeedクラスを使用して抽出した アイテムを含む RSSシンジケーションの画面が表示されるようになります。

3.まとめ

説明は以上です。間違いや指摘点などがあればご連絡ください。

PublicFeedを拡張することで、RSSフィードとして使用するアイテムの抽出条件のカスタマイズやRSSフィードをレンダリングするためのSyndicationItemのカスタマイズを簡単に行うことができるようになります。