以编程方式更改当前使用的电子商务产品 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();
嘿嘿,
我们经常创建(在电子商务模块中)具有相同名称的产品(例如: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();