به‌روزرسانی‌های مکرر محصولات خود را انجام دهید

زیر-API محصولات به شما امکان می‌دهد به‌روزرسانی‌های جزئی برای محصولات موجود خود انجام دهید. این برای تغییر مکرر داده‌ها، مانند قیمت و موجودی، ایده‌آل است زیرا از نیاز به ارسال مجدد کل محصول برای یک تغییر کوچک جلوگیری می‌کند. با این حال، شما باید مرتباً محصولات را دوباره وارد کنید تا مطمئن شوید که تمام داده‌های محصول همگام‌سازی شده‌اند.

این راهنما نحوه استفاده از متد productinputs.patch برای به‌روزرسانی محصولات شما را پوشش می‌دهد.

پیش‌نیازها

قبل از اینکه بتوانید یک محصول را به‌روزرسانی کنید، به موارد زیر نیاز دارید:

جزئیات خاص محصول را به‌روزرسانی کنید

برای تغییر چند جزئیات از یک محصول، مانند قیمت یا موجودی آن، بدون ارسال مجدد تمام اطلاعات آن، از متد productInputs.patch استفاده کنید.

می‌توانید فیلدهایی را که می‌خواهید تغییر دهید در پارامتر updateMask مشخص کنید. updateMask لیستی از فیلدهایی است که می‌خواهید به‌روزرسانی شوند و با کاما از هم جدا شده‌اند. متد patch به شرح زیر عمل می‌کند:

  • فیلدهای موجود در updateMask و body: این فیلدها با مقادیر جدید به‌روزرسانی می‌شوند.
  • فیلدها در updateMask هستند اما در body نیستند: این فیلدها از ورودی محصول حذف شده‌اند.
  • فیلدهایی که در updateMask نیستند: این فیلدها بدون تغییر باقی می‌مانند.
  • پارامتر updateMask حذف شده است: تمام فیلدهای ارائه شده در بدنه درخواست به‌روزرسانی می‌شوند. فیلدهایی که در بدنه درخواست ارائه نشده‌اند از ورودی محصول حذف نمی‌شوند.

در اینجا مثالی از داده‌های محصول قبل از به‌روزرسانی آورده شده است:

{
  "name": "accounts/{ACCOUNT_ID}/productInputs/en~US~SKU12345",
  "product": "accounts/{ACCOUNT_ID}/products/en~US~SKU12345",
  "offerId": "SKU12345",
  "contentLanguage": "en",
  "feedLabel": "US",
  "productAttributes": {
    "title": "Classic Cotton T-Shirt",
    "description": "A comfortable, durable, and stylish t-shirt made from 100% cotton.",
    "link": "https://www.example.com/p/SKU12345",
    "availability": "IN_STOCK",
    "price": {
      "amountMicros": "15990000",
      "currencyCode": "USD"
    },
    "condition": "NEW",
    "gtins": [
      "9780007350896"
    ],
    "imageLink": "https://www.example.com/image/SKU12345"
  }
}

این مثال title و availability یک محصول را به‌روزرسانی و imageLink آن را حذف می‌کند. description و price در updateMask نیستند و بدون تغییر باقی می‌مانند.

PATCH https://merchantapi.googleapis.com/products/v1/accounts/{ACCOUNT_ID}/productInputs/en~US~SKU12345?updateMask=productAttributes.title,productAttributes.availability,productAttributes.imageLink&dataSource=accounts/{ACCOUNT_ID}/dataSources/{DATASOURCE_ID}
{
 "productAttributes": {
   "title": "Classic Cotton T-Shirt - New Edition",
   "availability": "OUT_OF_STOCK",
    "description": "A comfortable T-shirt from premium cotton, newer edition.",
    "price": {
      "amountMicros": "9990000",
      "currencyCode": "USD"
    }
 }
}

یک فراخوانی موفق، منبع ProductInput به‌روزرسانی‌شده را برمی‌گرداند. title و availability به‌روزرسانی می‌شوند و imageLink حذف می‌شود زیرا در updateMask بود اما در بدنه درخواست وجود نداشت. description و price بدون تغییر باقی می‌مانند زیرا در updateMask فهرست نشده بودند.

{
  "name": "accounts/{ACCOUNT_ID}/productInputs/en~US~SKU12345",
  "product": "accounts/{ACCOUNT_ID}/products/en~US~SKU12345",
  "offerId": "SKU12345",
  "contentLanguage": "en",
  "feedLabel": "US",
  "productAttributes": {
    "title": "Classic Cotton T-Shirt - New Edition",
    "description": "A comfortable, durable, and stylish t-shirt made from 100% cotton.",
    "link": "https://www.example.com/p/SKU12345",
    "availability": "OUT_OF_STOCK",
    "price": {
      "amountMicros": "15990000",
      "currencyCode": "USD"
    },
    "condition": "NEW",
    "gtins": [
      "9780007350896"
    ],
  }
}

نمونه‌های کد زیر نحوه به‌روزرسانی یک محصول را نشان می‌دهند.

جاوا

import com.google.api.gax.core.FixedCredentialsProvider;
import com.google.auth.oauth2.GoogleCredentials;
import com.google.protobuf.FieldMask;
import com.google.shopping.merchant.datasources.v1.DataSourceName;
import com.google.shopping.merchant.products.v1.Availability;
import com.google.shopping.merchant.products.v1.Condition;
import com.google.shopping.merchant.products.v1.ProductAttributes;
import com.google.shopping.merchant.products.v1.ProductInput;
import com.google.shopping.merchant.products.v1.ProductInputName;
import com.google.shopping.merchant.products.v1.ProductInputsServiceClient;
import com.google.shopping.merchant.products.v1.ProductInputsServiceSettings;
import com.google.shopping.merchant.products.v1.UpdateProductInputRequest;
import com.google.shopping.type.CustomAttribute;
import shopping.merchant.samples.utils.Authenticator;
import shopping.merchant.samples.utils.Config;

/** This class demonstrates how to update a product input */
public class UpdateProductInputSample {

  public static void updateProductInput(Config config, String productId, String dataSourceId)
      throws Exception {

    // Obtains OAuth token based on the user's configuration.
    GoogleCredentials credential = new Authenticator().authenticate();

    // Creates service settings using the credentials retrieved above.
    ProductInputsServiceSettings productInputsServiceSettings =
        ProductInputsServiceSettings.newBuilder()
            .setCredentialsProvider(FixedCredentialsProvider.create(credential))
            .build();

    // Creates product name to identify product.
    String name =
        ProductInputName.newBuilder()
            .setAccount(config.getAccountId().toString())
            .setProductinput(productId)
            .build()
            .toString();

    // Just productAttributes and customAttributes can be updated
    FieldMask fieldMask =
        FieldMask.newBuilder()
            .addPaths("product_attributes.title")
            .addPaths("product_attributes.description")
            .addPaths("product_attributes.link")
            .addPaths("product_attributes.image_link")
            .addPaths("product_attributes.availability")
            .addPaths("product_attributes.condition")
            .addPaths("product_attributes.gtins")
            .addPaths("custom_attributes.mycustomattribute")
            .build();

    // Calls the API and catches and prints any network failures/errors.
    try (ProductInputsServiceClient productInputsServiceClient =
        ProductInputsServiceClient.create(productInputsServiceSettings)) {

      ProductAttributes attributes =
          ProductAttributes.newBuilder()
              .setTitle("A Tale of Two Cities")
              .setDescription("A classic novel about the French Revolution")
              .setLink("https://exampleWebsite.com/tale-of-two-cities.html")
              .setImageLink("https://exampleWebsite.com/tale-of-two-cities.jpg")
              .setAvailability(Availability.IN_STOCK)
              .setCondition(Condition.NEW)
              .addGtins("9780007350896")
              .build();

      // The datasource can be either a primary or supplemental datasource.
      String dataSource =
          DataSourceName.newBuilder()
              .setAccount(config.getAccountId().toString())
              .setDatasource(dataSourceId)
              .build()
              .toString();

      UpdateProductInputRequest request =
          UpdateProductInputRequest.newBuilder()
              .setUpdateMask(fieldMask)
              // You can only update product attributes and custom_attributes
              .setDataSource(dataSource)
              .setProductInput(
                  ProductInput.newBuilder()
                      .setName(name)
                      .setProductAttributes(attributes)
                      .addCustomAttributes(
                          CustomAttribute.newBuilder()
                              .setName("mycustomattribute")
                              .setValue("Example value")
                              .build())
                      .build())
              .build();

      System.out.println("Sending update ProductInput request");
      ProductInput response = productInputsServiceClient.updateProductInput(request);
      System.out.println("Updated ProductInput Name below");
      // The last part of the product name will be the product ID assigned to a product by Google.
      // Product ID has the format `contentLanguage~feedLabel~offerId`
      System.out.println(response.getName());
      System.out.println("Updated Product below");
      System.out.println(response);
    } catch (Exception e) {
      System.out.println(e);
    }
  }

  public static void main(String[] args) throws Exception {
    Config config = Config.load();
    // An ID assigned to a product by Google. In the format
    // contentLanguage~feedLabel~offerId
    String productId = "en~label~sku123"; // Replace with your product ID.

    // Identifies the data source that will own the product input.
    String dataSourceId = "{INSERT_DATASOURCE_ID}"; // Replace with your datasource ID.

    updateProductInput(config, productId, dataSourceId);
  }
}

پی اچ پی

use Google\ApiCore\ApiException;
use Google\Protobuf\FieldMask;
use Google\Shopping\Merchant\Products\V1\Availability;
use Google\Shopping\Merchant\Products\V1\Condition;
use Google\Shopping\Merchant\Products\V1\ProductAttributes;
use Google\Shopping\Merchant\Products\V1\Client\ProductInputsServiceClient;
use Google\Shopping\Merchant\Products\V1\ProductInput;
use Google\Shopping\Merchant\Products\V1\UpdateProductInputRequest;
use Google\Shopping\Type\CustomAttribute;

/**
 * This class demonstrates how to update a product input.
 */
class UpdateProductInputSample
{
    // An ID assigned to a product by Google. In the format
    // contentLanguage~feedLabel~offerId
    // Please ensure this product ID exists for the update to succeed.
    private const PRODUCT_ID = "online~en~label~sku123";

    // Identifies the data source that will own the product input.
    // Please ensure this data source ID exists.
    private const DATASOURCE_ID = "<INSERT_DATASOURCE_ID>";

    /**
     * Helper function to construct the full product input resource name.
     *
     * @param string $accountId The merchant account ID.
     * @param string $productInputId The product input ID (e.g., "online~en~label~sku123").
     * @return string The full product input resource name.
     */
    private static function getProductInputName(string $accountId, string $productInputId): string
    {
        return sprintf("accounts/%s/productInputs/%s", $accountId, $productInputId);
    }

    /**
     * Helper function to construct the full data source resource name.
     *
     * @param string $accountId The merchant account ID.
     * @param string $dataSourceId The data source ID.
     * @return string The full data source resource name.
     */
    private static function getDataSourceName(string $accountId, string $dataSourceId): string
    {
        return sprintf("accounts/%s/dataSources/%s", $accountId, $dataSourceId);
    }

    /**
     * Updates an existing product input in your Merchant Center account.
     *
     * @param array $config The configuration array containing the account ID.
     * @param string $productId The ID of the product input to update.
     * @param string $dataSourceId The ID of the data source.
     */
    public static function updateProductInput(
        array $config,
        string $productId,
        string $dataSourceId
    ): void {
        // Gets the OAuth credentials to make the request.
        $credentials = Authentication::useServiceAccountOrTokenFile();

        // Creates options config containing credentials for the client to use.
        $options = ['credentials' => $credentials];

        // Creates a ProductInputsServiceClient.
        $productInputsServiceClient = new ProductInputsServiceClient($options);

        // Construct the full resource name of the product input to be updated.
        $name = self::getProductInputName($config['accountId'], $productId);

        // Define the FieldMask to specify which fields to update.
        // Only 'attributes' and 'custom_attributes' can be specified in the
        // FieldMask for product input updates.
        $fieldMask = new FieldMask([
            'paths' => [
                "product_attributes.title",
                "product_attributes.description",
                "product_attributes.link",
                "product_attributes.image_link",
                "product_attributes.availability",
                "product_attributes.condition",
                "product_attributes.gtin",
                "custom_attributes.mycustomattribute" // Path for a specific custom attribute
            ]
        ]);

        // Calls the API and handles any network failures or errors.
        try {
            // Define the new attributes for the product.
            $attributes = new ProductAttributes([
                'title' => 'A Tale of Two Cities 3',
                'description' => 'A classic novel about the French Revolution',
                'link' => 'https://exampleWebsite.com/tale-of-two-cities.html',
                'image_link' => 'https://exampleWebsite.com/tale-of-two-cities.jpg',
                'availability' => Availability::IN_STOCK,
                'condition' => Condition::PBNEW,
                'gtins' => ['9780007350896'] // GTIN is a repeated field.
            ]);

            // Construct the full data source name.
            // This specifies the data source context for the update.
            $dataSource = self::getDataSourceName($config['accountId'], $dataSourceId);

            // Create the ProductInput object with the desired updates.
            // The 'name' field must match the product input being updated.
            $productInput = new ProductInput([
                'name' => $name,
                'product_attributes' => $attributes,
                'custom_attributes' => [ // Provide the list of custom attributes.
                    new CustomAttribute([
                        'name' => 'mycustomattribute',
                        'value' => 'Example value'
                    ])
                ]
            ]);

            // Create the UpdateProductInputRequest.
            $request = new UpdateProductInputRequest([
                'update_mask' => $fieldMask,
                'data_source' => $dataSource,
                'product_input' => $productInput
            ]);

            print "Sending update ProductInput request\n";
            // Make the API call to update the product input.
            $response = $productInputsServiceClient->updateProductInput($request);

            print "Updated ProductInput Name below\n";
            // The name of the updated product input.
            // The last part of the product name is the product ID (e.g., contentLanguage~feedLabel~offerId).
            print $response->getName() . "\n";
            print "Updated Product below\n";
            // Print the full updated product input object.
            print_r($response);

        } catch (ApiException $e) {
            printf("ApiException caught: %s\n", $e->getMessage());
        }
    }

    /**
     * Executes the UpdateProductInput sample.
     */
    public function callSample(): void
    {
        $config = Config::generateConfig();
        $productId = self::PRODUCT_ID;
        $dataSourceId = self::DATASOURCE_ID;

        self::updateProductInput($config, $productId, $dataSourceId);
    }
}

// Run the script.
$sample = new UpdateProductInputSample();
$sample->callSample();

پایتون

"""A module to update a product input."""

from examples.authentication import configuration
from examples.authentication import generate_user_credentials
from google.protobuf import field_mask_pb2
from google.shopping.merchant_products_v1 import Availability
from google.shopping.merchant_products_v1 import Condition
from google.shopping.merchant_products_v1 import ProductAttributes
from google.shopping.merchant_products_v1 import ProductInput
from google.shopping.merchant_products_v1 import ProductInputsServiceClient
from google.shopping.merchant_products_v1 import UpdateProductInputRequest
from google.shopping.type import CustomAttribute


# Fetches the Merchant Center account ID from the authentication examples.
# This ID is needed to construct resource names for the API.
_ACCOUNT_ID = configuration.Configuration().read_merchant_info()


def update_product_input(account_id: str, product_id: str, data_source_id: str):
  """Updates an existing product input for a specific account.

  Args:
    account_id: The Merchant Center account ID.
    product_id: The ID of the product input to update. This ID is assigned by
      Google and has the format `contentLanguage~feedLabel~offerId`.
    data_source_id: The ID of the data source that owns the product input.
  """

  # Obtains OAuth credentials for authentication.
  credentials = generate_user_credentials.main()

  # Creates a ProductInputsServiceClient instance.
  client = ProductInputsServiceClient(credentials=credentials)

  # Constructs the full resource name for the product input.
  # Format: accounts/{account}/productInputs/{productinput}
  name = f"accounts/{account_id}/productInputs/{product_id}"

  # Defines the FieldMask to specify which fields of the product input
  # are being updated. Only 'attributes' and 'custom_attributes' can be updated.
  field_mask = field_mask_pb2.FieldMask(
      paths=[
          "product_attributes.title",
          "product_attributes.description",
          "product_attributes.link",
          "product_attributes.image_link",
          "product_attributes.availability",
          "product_attributes.condition",
          "product_attributes.gtins",
          "custom_attributes.mycustomattribute",
      ]
  )

  # Prepares the new attribute values for the product.
  attributes = ProductAttributes(
      title="A Tale of Two Cities updated",
      description="A classic novel about the French Revolution",
      link="https://exampleWebsite.com/tale-of-two-cities.html",
      image_link="https://exampleWebsite.com/tale-of-two-cities.jpg",
      availability=Availability.IN_STOCK,
      condition=Condition.NEW,
      gtins=["9780007350896"],  # GTIN is a repeated field.
  )

  # Constructs the full resource name for the data source.
  # The data source can be primary or supplemental.
  # Format: accounts/{account}/dataSources/{datasource}
  data_source = f"accounts/{account_id}/dataSources/{data_source_id}"

  # Prepares the ProductInput object with the updated information.
  product_input_data = ProductInput(
      name=name,
      product_attributes=attributes,
      custom_attributes=[
          CustomAttribute(
              name="mycustomattribute", value="Example value"
          )
      ],
  )

  # Creates the UpdateProductInputRequest.
  request = UpdateProductInputRequest(
      update_mask=field_mask,
      data_source=data_source,
      product_input=product_input_data,
  )

  # Sends the update request to the API.
  try:
    print("Sending update ProductInput request")
    response = client.update_product_input(request=request)
    print("Updated ProductInput Name below")
    # The response includes the name of the updated product input.
    # The last part of the product name is the product ID assigned by Google.
    print(response.name)
    print("Updated Product below")
    print(response)
  except RuntimeError as e:
    # Catches and prints any errors that occur during the API call.
    print(e)


if __name__ == "__main__":
  # The ID of the product to be updated.
  # This ID is assigned by Google and typically follows the format:
  # contentLanguage~feedLabel~offerId
  # Replace with an actual product ID from your Merchant Center account.
  product_id_to_update = "online~en~label~sku123"

  # The ID of the data source that will own the updated product input.
  # Replace with an actual data source ID from your Merchant Center account.
  data_source_id_for_update = "<INSERT_DATA_SOURCE_ID>"

  update_product_input(
      _ACCOUNT_ID, product_id_to_update, data_source_id_for_update
  )

حلقه

curl --location --request PATCH 'https://merchantapi.googleapis.com/products/v1/accounts/{ACCOUNT_ID}/productInputs/en~US~SKU12345?updateMask=productAttributes.title,productAttributes.description&dataSource=accounts/{ACCOUNT_ID}/dataSources/{DATASOURCE_ID}' \
--header 'Authorization: Bearer <API_TOKEN>' \
--header 'Content-Type: application/json' \
--data '{
   "productAttributes": {
       "title": "A Tale of Two Cities",
       "description": "A classic novel about the French Revolution"
   }
}'

به‌روزرسانی با استفاده از ویژگی‌های سفارشی

شما می‌توانید هر دو ویژگی استاندارد و سفارشی را در یک فراخوانی واحد به‌روزرسانی کنید. برای به‌روزرسانی یک ویژگی سفارشی، نام آن را با customAttributes در updateMask بنویسید.

این مثال چندین عمل را در یک درخواست انجام می‌دهد:

  • ویژگی استاندارد title را مستقیماً به‌روزرسانی می‌کند.
  • یک ویژگی سفارشی موجود ( myCustomAttrToBeUpdated ) را به‌روزرسانی می‌کند.
  • یک ویژگی سفارشی جدید ( myCustomAttrToBeInserted ) درج می‌کند.
  • یک ویژگی سفارشی موجود ( myCustomAttrToBeDeleted ) را حذف می‌کند.
PATCH https://merchantapi.googleapis.com/products/v1/accounts/{ACCOUNT_ID}/productInputs/en~US~SKU12345?updateMask=productAttributes.title,customAttributes.myCustomAttrToBeInserted,customAttributes.myCustomAttrToBeUpdated,customAttributes.myCustomAttrToBeDeleted&dataSource=accounts/{ACCOUNT_ID}/dataSources/{DATASOURCE_ID}
{
  "productAttributes": {
    "title": "ProductTitle Updated"
  },
  "customAttributes": [
    {
      "name": "description",
      "value": "A newly updated description."
    },
    {
      "name": "myCustomAttrToBeUpdated",
      "value": "myCustomAttrToBeUpdated updated value"
    },
    {
      "name": "myCustomAttrToBeInserted",
      "value": "new from update"
    }
  ]
}

یک درخواست موفق، ورودی ProductInput به‌روزرسانی‌شده را برمی‌گرداند که تمام تغییرات مشخص‌شده را منعکس می‌کند.

درک به‌روزرسانی‌های ویژگی‌های سفارشی

شما می‌توانید از فیلد customAttributes برای به‌روزرسانی ویژگی‌هایی که خودتان تعریف کرده‌اید استفاده کنید. این ویژگی‌ها با مشخصات استاندارد مطابقت ندارند و به عنوان ویژگی‌های سفارشی در محصول نهایی ذخیره می‌شوند.

نحوه پردازش به‌روزرسانی‌های محصول

وقتی درخواست patch ارسال می‌کنید، به‌روزرسانی قبل از اعمال هر یک از قوانین، روی داده‌های خاص ProductInput اعمال می‌شود. این امر منجر به رفتار ثابت بین درج و به‌روزرسانی محصولات می‌شود.

نحوه پردازش به‌روزرسانی شما به این صورت است:

  1. به‌روزرسانی ورودی: درخواست patch شما، ورودی ProductInput مرتبط با منبع داده‌ای که ارائه کرده‌اید را تغییر می‌دهد.

  2. پردازش و ادغام: پس از به‌روزرسانی ورودی، پردازش آغاز می‌شود:

    • قوانین تغذیه و منابع داده تکمیلی: قوانینی که روی منبع اصلی محصول پیکربندی شده‌اند، ProductInput از منابع اصلی و تکمیلی ترکیب می‌کنند. این قوانین می‌توانند ویژگی‌ها را تغییر دهند یا ویژگی‌های جدیدی ایجاد کنند. برای کسب اطلاعات بیشتر در مورد تنظیم قوانین، به بخش «تنظیم قوانین ویژگی» مراجعه کنید.
    • منابع داده دیگر: داده‌های منابع دیگر (برای مثال بهبودهای خودکار) نیز با ورودی منبع داده اصلی ادغام می‌شوند.
    • اعتبارسنجی: داده‌های ادغام‌شده بر اساس مشخصات داده‌های محصول و سیاست‌های خرید گوگل اعتبارسنجی می‌شوند.
  3. محصول نهایی: نتیجه این خط لوله، منبع Product نهایی و پردازش‌شده است که می‌تواند با استفاده از products.get یا products.list بازگردانده شود. این همچنین نسخه‌ای از محصول است که در مرکز فروشندگان نشان داده می‌شود و واجد شرایط نمایش در مقاصد مختلف است.

به دلیل این فرآیند چند مرحله‌ای، بین ارسال درخواست به‌روزرسانی و اعمال تغییرات در منبع نهایی Product که می‌توانید با products.get بازیابی کنید، تأخیری، معمولاً چند دقیقه‌ای، وجود دارد.

مثال: به‌روزرسانی یک محصول با یک ورودی اصلی

این رایج‌ترین مورد استفاده است. یک محصول در یک منبع داده اصلی وجود دارد و شما می‌خواهید برخی از ویژگی‌های آن را به‌روزرسانی کنید.

  1. وضعیت اولیه: محصولی en~US~SKU12345 در منبع داده اصلی شما با title: "Classic T-Shirt" و price: 15.99 USD وجود دارد.
  2. درخواست به‌روزرسانی: شما یک درخواست patch برای به‌روزرسانی price به 14.99 USD ارسال می‌کنید و availability روی out of stock تنظیم می‌کنید.
  3. پردازش:
    • ProductInput برای SKU12345 به‌روزرسانی شده است.
  4. محصول نهایی: Product نهایی اکنون title: "Classic T-Shirt" ، price: 14.99 USD و availability: "out of stock" دارد.

مثال: به‌روزرسانی یک محصول با داده‌ها و قوانین تکمیلی

این مثال نشان می‌دهد که چگونه قوانین فید می‌توانند بر به‌روزرسانی تأثیر بگذارند و باعث شوند برخی تغییرات اعمال شوند در حالی که برخی دیگر لغو می‌شوند.

  1. حالت اولیه:
    • ورودی اصلی: en~US~SKU12345 دارای title: "Great T-Shirt" و description: "A great short-sleeve t-shirt." .
    • ورودی تکمیلی: همین محصول در منبع داده تکمیلی دارای ورودی با title: "Awesome T-Shirt" و description: "An awesome short-sleeve t-shirt." است.
    • قانون فید: قانونی برای دریافت title از منبع داده تکمیلی تنظیم شده است. هیچ قانونی برای description وجود ندارد.
    • نتیجه: Product نهایی پردازش‌شده دارای title: "Awesome T-Shirt" و description: "A great short-sleeve t-shirt." .
  2. درخواست به‌روزرسانی: شما یک درخواست patch برای به‌روزرسانی منبع داده اصلی ارسال می‌کنید و title روی "Fantastic T-Shirt" و description روی "A fantastic short-sleeve t-shirt." تنظیم می‌کنید.
  3. پردازش:
    • ProductInput در منبع داده اصلی به‌روزرسانی شده و دارای title: "Fantastic T-Shirt" و description: "A fantastic short-sleeve t-shirt." .
    • خط لوله پردازش اجرا می‌شود.
    • برای title ، قانون فید حکم می‌کند که مقدار منبع داده تکمیلی ( Awesome T-Shirt ) اولویت دارد و بر به‌روزرسانی شما ارجحیت دارد.
    • برای description ، از آنجایی که هیچ قانون غالبی وجود ندارد، مقدار به‌روزرسانی‌شده از ورودی اصلی ( A fantastic short-sleeve t-shirt. ) استفاده می‌شود.
  4. محصول نهایی: عنوان Product نهایی همچنان Awesome T-Shirt باقی می‌ماند (به‌روزرسانی شما لغو شد)، اما توضیحات آن اکنون A fantastic short-sleeve t-shirt. است (به‌روزرسانی شما اعمال شد).

بین به‌روزرسانی‌ها و منابع داده تکمیلی یکی را انتخاب کنید

شما می‌توانید داده‌های محصول را با استفاده از productinputs.patch یا با وارد کردن داده‌ها در منابع داده تکمیلی تغییر دهید. بهترین انتخاب به استراتژی مدیریت داده‌های شما بستگی دارد.

برای جلوگیری از نتایج غیرقابل پیش‌بینی، توصیه می‌کنیم از هر دو منبع داده productinputs.patch و supplemental برای مدیریت داده‌های یک محصول استفاده نکنید.

در اینجا یک مقایسه دقیق وجود دارد:

ویژگی productinputs.patch (به‌روزرسانی‌ها) منابع داده تکمیلی
بهترین برای تغییرات سریع، مکرر و جزئی در داده‌های موجود (مثلاً قیمت، موجودی). لایه‌بندی منطقی داده‌های جداگانه، مدیریت ویژگی‌های مختلف توسط سیستم‌های مختلف، یا لغو قوانین پیچیده مبتنی بر قانون.
مکانیسم یک ورودی ProductInput موجود را اصلاح می‌کند. یک ProductInput جدید و جداگانه در یک منبع داده تکمیلی ایجاد می‌کند.
جزئیات داده‌ها روی فیلدهای خاصی از یک ProductInput واحد عمل می‌کند. روی کل ProductInput درون منبع تکمیلی عمل می‌کند.
پشتکار تغییرات تا زمانی که همان ProductInput توسط یک insert کامل یا patch دیگری رونویسی نشود، ادامه می‌یابند. ماندگاری توسط قوانین فید کنترل می‌شود. اگر قوانین اولویت‌بندی کنند، می‌توانند داده‌های اولیه را به طور نامحدود نادیده بگیرند.
تعامل قوانین می‌تواند بدون قوانین فید مورد استفاده قرار گیرد زیرا منبع داده موجود و ProductInput به‌روزرسانی می‌کند. مستلزم تنظیم صریح یک قانون در منبع اصلی برای پیوند دادن منبع تکمیلی است.
تنظیم منبع داده روی یک منبع داده موجود عمل می‌کند. نیازی به منابع جدید نیست. نیاز به ایجاد و مدیریت منابع داده تکمیلی جداگانه و پیوند دادن آنها با استفاده از قوانین فید دارد.