如何删除 Sitecore 中的项目并更新所有引用

How to Delete Item in Sitecore and Update All References

我需要以编程方式删除 Sitecore 中的项目,但如果它们被其他项目引用,那么我需要更新这些项目以引用其他项目。

在 UI 中,Sitecore 提供了一个用于执行此操作的对话框,但是 item.Delete()item.Recycle() 方法似乎没有针对类似内容的任何覆盖。我可以使用 Sitecore.Globals.LinkDatabase.GetItemReferrers(item, true) 来获取引用项,但我仍然需要从这些项中获取特定字段并根据它们的类型更新它们。

据我所知,只要项目的 ID 在引用项目的字段中被替换,字段的类型就无关紧要。一个例外是富文本字段类型,其中 HTML 中的 link 具有以下格式:

<a href="-/media/somelowercaseguidwithouthyphens.ashx"></a>

所以我们应该可以做两个简单的替换。一种用于商品 ID,另一种用于小写、无连字符的 ID。

首先,获取引用项 links,并创建替换字符串。

var links = Sitecore.Globals.LinkDatabase.GetItemReferrers(item, true);

string oldIdWithoutBraces = item.ID.ToString().Replace("{", "").Replace("}", "");
string newIdWithoutBraces = newItem.ID.ToString().Replace("{", "").Replace("}", "");
string oldIdForHyperlinks = oldIdWithoutBraces.ToLower().Replace("-", "");
string newIdForHyperlinks = newIdWithoutBraces.ToLower().Replace("-", "");

然后,对于每个引用项目 link,获取其引用字段并更新其中的项目 ID。

using (new Sitecore.SecurityModel.SecurityDisabler())
{
    foreach (var link in links)
    {
        var sourceItem = link.GetSourceItem();
        var fieldId = link.SourceFieldID;
        var field = sourceItem.Fields[fieldId];

        sourceItem.Editing.BeginEdit();

        try
        {
            field.Value = field.Value
                .Replace(oldIdWithoutBraces, newIdWithoutBraces)
                .Replace(oldIdForHyperlinks, newIdForHyperlinks);
        }
        catch
        {
            sourceItem.Editing.CancelEdit();
        }
        finally
        {
            sourceItem.Editing.EndEdit();
        }
    }
}

之后,可以删除原来的项目。

item.Recycle();

一些 Sitecore 字段类型(例如图像字段)有一个 path 属性,该属性也应该更新,但将其应用到上面的代码中应该不难。