SFCC - 帮助将所有产品从 Salesforce Commerce Cloud (Demandware) 导出到 XML 或 CSV

SFCC - Help exporting all Products from Salesforce Commerce Cloud (Demandware) to XML or CSV

我们正在尝试将一家商店从 SFCC 迁移到 Shopify,但我们无法从 Salesforce Commerce Cloud(以前称为 Demandware)导出产品。

我已经查看了 SFCC 的大量文档,但我没有找到简单的产品导出。我想知道我是否误解了他们的术语。

我找到了这个备忘单: https://documentation.b2c.commercecloud.salesforce.com/DOC2/index.jsp?topic=%2Fcom.demandware.dochelp%2FImportExport%2FImportExportObjectCheatsheet.html&resultof=%22%70%72%6f%64%75%63%74%22%20%22%65%78%70%6f%72%74%22%20

它让我指向 "Catalog Object Import/Export" https://documentation.b2c.commercecloud.salesforce.com/DOC2/index.jsp?topic=%2Fcom.demandware.dochelp%2FImportExport%2FCatalogObjectImportExport.html

当我尝试导出我的产品时,我在导出时遗漏了许多产品属性,例如自定义属性。我怎样才能得到这些数据?

请参考B2C Commerce import and export schemas中的sfcc目录架构:

架构将向您解释目录的结构。目录可以有分配的产品或目录可以拥有它们。在 SFCC 中,我们通常有一个拥有产品的主目录。拥有意味着在目录中您拥有产品定义和所有关于产品的相关数据,图像除外。

因此您需要做的是让您的客户导出您要迁移的站点的主目录。这样 activity 不需要编码或在 SFCC 中创造一些工作机会。您可以通过以下步骤从商务管理平台获取:

  • 商家工具 > 产品和目录 > 导入和导出 > 目录导出 - 第 1 步:Select 目录

请注意,Commerce Cloud 中的产品具有属性继承模型。具有多种尺寸或颜色选项(或其他选项)的产品将使用 Master -> Variant 关系。如果变体自身的属性为空,变体将从主产品继承属性值。例如,您经常会看到产品的 name 属性仅为主产品定义。

我每天通过 C# 作业将所有产品导出到 SQL 服务器。代码的重要部分如下。

使用 OCAPI Data ProductSearch,您将首先创建一个请求以查看您总共拥有多少产品。您一次只能获取 200 个产品,因此您必须计算调用 api.

的总次数
var countQuery = "{ \"query\": { \"term_query\": { \"fields\": [\"id\"], \"operator\": \"is_not_null\" }}}";
var countContent = new StringContent(countQuery, Encoding.UTF8, "application/json");
var urlUri = new Uri(url);
var countResponse = await client.PostAsync(urlUri, countContent);
string countResponseString = await countResponse.Content.ReadAsStringAsync();

dynamic countJson = JsonConvert.DeserializeObject(countResponseString);
int records = countJson["total"];
// determine number of times to call api, rounding up.
int calls = (records + (200 - 1)) / 200;

一次循环拉取200个产品。我们每天用它来比较新产品和已删除产品的列表。比较价格变化的产品也很好。或者只是导出用于其他用途。

for (var i = 0; i < calls; i++)
{

    var query = "{ \"query\": { \"term_query\": { \"fields\": [\"id\"], \"operator\": \"is_not_null\" } },\"select\":\"(**)\",\"expand\":[\"all\"], \"start\": " + i * 200 + ", \"count\": 200 }";
    var content = new StringContent(query, Encoding.UTF8, "application/json");
    var response = await client.PostAsync(urlUri, content);
    string responseString = await response.Content.ReadAsStringAsync();

    dynamic json = JsonConvert.DeserializeObject(responseString);

    Console.WriteLine("DW products status: " + i * 200 + " records.");

    foreach (var obj in json.hits)
    {
      // Do stuff (create csv, write to db, etc)
    }
}