以编程方式更改当前使用的电子商务产品 URL

Programmatically change eCommerce product's currently used URL

嘿嘿,

我们经常创建(在电子商务模块中)具有相同名称的产品(例如:Red T-Shirt 的 SKU 123,另一个 Red T-Shirt 的 SKU 4500)导致 URL个产品相同(例如:"/red-t-shirt"

您可能知道的问题是您不能拥有两个具有相同 URL(或相同 附加 URLs 的产品- 这会导致在您尝试保存具有相同名称的产品之一时抛出异常(并且将在 Sitefinity UI 中显示为未定义的错误)。

创建这些产品后,我想搜索具有相同 URL 的其他产品,这样我就可以将其 URL 更改为其他产品(例如新的 Red T-Shirt会自动得到"/red-t-shirt",旧的会换成别的)

我也想对额外的 URL 做同样的事情。 目前我正在使用 SQL 来完成这两项工作,但我想改用 C# 来完成。这就是我的 SQL 的样子 - 我只是不知道它如何转换为 C#。

-- Change URLs in sf_url_data, the 'additional URLs'
SELECT *
FROM dbo.sf_url_data
WHERE 
    (url LIKE '%/red-t-shirt%') 
AND 
    (content_id IN
        (SELECT id
        FROM dbo.sf_ec_product
        WHERE (sku <> 4500))) -- 4500 is the new PLU that we want to keep as /red-t-shirt

--
-- Change URLs in sf_ec_product, the default URL
SELECT *
FROM dbo.sf_ec_product
WHERE 
    (id IN
        (SELECT content_id
        FROM dbo.sf_url_data
        WHERE (url LIKE '%/red-t-shirt%')))

请注意,我必须先更改额外的 URL,因为我使用 sf_ec_product 的实际 URL 来为额外的 select 做(参见子查询).


编辑:我正在寻找一种解决方案,应该(我假设)使用 Sitefinity CatalogManager class,如下所述: https://docs.sitefinity.com/for-developers-modify-products

找到答案了。 应该 有效。

CatalogManager catalogManager = CatalogManager.GetManager();

// Get the old unused product
Product oldProduct = catalogManager.GetProduct(oldProduct.Sku, ContentLifecycleStatus.Live);

// Set the english and french URLs to something new
oldProduct.UrlName.SetString(enCulture, "new-english-url");
oldProduct.UrlName.SetString(frCulture, "new-french-url");

// Delete associated non-default URLs
List<ProductUrlData> urls = oldProduct.Urls.Where(u => !u.IsDefault).ToList();
if (urls.Count > 1)
{
    oldProduct.Urls.ClearUrls(true);
    for (int i = urls.Count - 1; i >= 0; i--)
    {
        catalogManager.Provider.Delete(urls[i]);
    }
}

// Recompile the URLs and save changes
catalogManager.Provider.RecompileItemUrls(oldProduct);
catalogManager.SaveChanges();