Sitecoreのアイテムを自動的にパブリッシュする方法をご紹介します。
この方法を活用することで、コード側でアイテムを作成したり編集したときに、手動でパブリッシュ操作しなくても自動的にパブリッシュが実行されるようになります。
この方法を使いたいケース
通常の運用フローであれば、CMS上の「パブリッシュ公開日時設定」や、タイムトリガーパブリッシュを用いることで自動パブリッシュをすることができます。
しかし今回の方法は、アイテムをプログラム側で作成・編集したのちに、即時でパブリッシュしたいときに有効な方法となります。
以下はwebデータベースにアイテムをパブリッシュするサンプルコードになります。
サンプルコード
    public void PublishItem(Item item)
    {
        // PublishOptionsを定義
      Sitecore.Publishing.PublishOptions publishOptions = new Sitecore.Publishing.PublishOptions(
            item.Database,                 // ソースデータベース
        Sitecore.Data.Database.GetDatabase("web"),  // ターゲットデータベース
           Sitecore.Publishing.PublishMode.SingleItem,  // パブリッシュモード
            item.Language,                 // 言語
         System.DateTime.Now            // パブリッシュ日時
        );
        // Publisherを作成
        Sitecore.Publishing.Publisher publisher = new Sitecore.Publishing.Publisher(publishOptions);
        // パブリッシュ元のアイテムを指定
        publisher.Options.RootItem = item;
        // 子アイテムもパブリッシュするかどうかを指定
        publisher.Options.Deep = true;
        // パブリッシュを実行
        publisher.Publish();
    }
※パブリッシュ先のデータベースに合わせて、ターゲットデータベースを適宜変更してください。
実際の活用方法
今回はユーザーアカウントのアイテムをmasterデータベースに作成し、そのアイテムをwebデータベースにパブリッシュするメソッドを例にご紹介します。
        public void CreateUserItem(ViewUserInfoModel model)
        {
            // アイテムを編集するため権限設定を無効にする
            using (new Sitecore.SecurityModel.SecurityDisabler())
            {
                // 1: データベース指定(masterデータベース)
                var db = Sitecore.Data.Database.GetDatabase("master");
                // 2: 階層指定(作成するアイテムの親アイテムを決める)
                string folderName = GetFolderName(model.Occupation); // 入力された職種からフォルダ名をとる
                var parentItem = db.GetItem("/sitecore/content/Home/UserInfo/User/" + folderName);
                // 3: テンプレート指定(作成するアイテムのテンプレートを決める)
                TemplateItem template =db.GetItem("/sitecore/templates/Project/User");
                // 4: アイテム作成( 親アイテム.Add("作成するアイテム名", テンプレート) )
                // メールアドレスをアイテム名とする
                var createItem = parentItem.Add(model.Mail, template);
                // 5: その他のアイテムとかフィールドの入⼒情報
                try
                {
                    // アイテム編集開始
                    createItem.Editing.BeginEdit();
                    // アイテム編集
                    createItem.Fields["Name"].Value = model.Name;
                    createItem.Fields["Occupation"].Value = model.Occupation;
                    createItem.Fields["Mail"].Value = model.Mail;
                    // アイテム編集終了
                    createItem.Editing.EndEdit();                
                }
                catch
                {
                    // アイテム編集キャンセル
                    createItem.Editing.CancelEdit();
                }
                // アイテムの自動パブリッシュ
                PublishItem(createItem);
            }
        }
最後にPublishItemメソッドを実行することで、ユーザーアイテムが作成された際に自動的にパブリッシュされるようになります。
※エントリーの内容・画像等は、公開時点での情報に基づきます。
※Sitecoreのバージョンによって実装されている機能が異なります。