تتيح لك واجهة برمجة التطبيقات الفرعية "المنتجات" إجراء تعديلات جزئية على منتجاتك الحالية. هذه الطريقة مثالية للبيانات التي تتغيّر بشكل متكرر، مثل السعر ومدى التوفّر، لأنّها تتجنّب الحاجة إلى إعادة إرسال المنتج بأكمله عند إجراء تغيير بسيط. ومع ذلك، عليك إعادة إدراج المنتجات بانتظام للتأكّد من مزامنة جميع بيانات المنتجات.
يشرح هذا الدليل كيفية استخدام طريقة productinputs.patch
لتعديل منتجاتك.
المتطلبات الأساسية
قبل أن تتمكّن من تعديل منتج، يجب أن يتوفّر لديك ما يلي:
- منتج حالي تريد تعديله للتعرّف على كيفية إنشاء منتجات، يُرجى الاطّلاع على دليل إضافة المنتجات وإدارتها.
name
مصدر البيانات الذي ينتمي إليه إدخال المنتج (على سبيل المثال،accounts/12345/dataSources/67890
). للتعرّف على كيفية العثور على هذا المعرّف، راجِع دليل إدارة مصادر بيانات واجهة برمجة التطبيقات لعمليات تحميل المنتجات.
تعديل تفاصيل منتج معيّن
لتغيير بعض تفاصيل المنتج، مثل سعره أو مدى توفّره، بدون إعادة إرسال جميع معلوماته، استخدِم طريقة productInputs.patch
.
يمكنك تحديد الحقول التي تريد تغييرها في المَعلمة updateMask
. updateMask
هي قائمة مفصولة بفواصل للحقول التي تريد تعديلها. يتصرف
patch
على النحو التالي:
- الحقول في
updateMask
والنص الأساسي: يتم تعديل هذه الحقول باستخدام القيم الجديدة. - الحقول في
updateMask
ولكن ليس في النص: يتم حذف هذه الحقول من مدخلات المنتج. - الحقول غير المتوفّرة في
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"
],
}
}
تعرض نماذج الرموز البرمجية التالية كيفية تعديل منتج.
Java
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);
}
}
PHP
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();
Python
"""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
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
البيانات قبل تطبيق أي من القواعد. ويؤدي ذلك إلى سلوك متّسق بين إدراج المنتجات وتعديلها.
في ما يلي كيفية معالجة التعديل:
تعديل الإدخال: يؤدي طلبك
patch
إلى تعديلProductInput
المحدّد المرتبط بمصدر البيانات الذي قدّمته.المعالجة والدمج: بعد تعديل الإدخال، تبدأ عملية المعالجة:
- قواعد الخلاصة ومصادر البيانات التكميلية: إنّ القواعد التي تم إعدادها في المصدر الأساسي للمنتج تجمع بين
ProductInput
من المصادر الأساسية والتكميلية. يمكن أن تغيّر هذه القواعد السمات أو تستنتج سمات جديدة. لمزيد من المعلومات حول إعداد القواعد، يُرجى الاطّلاع على المقالة https://support.google.com/merchants/answer/14994083. - مصادر البيانات الأخرى: يتم أيضًا دمج البيانات من مصادر أخرى (مثل التحسينات التلقائية) مع بيانات مصدر البيانات الأساسي.
- التحقّق من الصحة: يتم التحقّق من صحة البيانات المدمجة استنادًا إلى مواصفات بيانات المنتج وسياسات التسوّق في Google.
- قواعد الخلاصة ومصادر البيانات التكميلية: إنّ القواعد التي تم إعدادها في المصدر الأساسي للمنتج تجمع بين
المنتج النهائي: نتيجة مسار المعالجة هذا هي المورد النهائي المعالَج
Product
الذي يمكن عرضه باستخدامproducts.get
أوproducts.list
. وهذه هي أيضًا نسخة المنتج التي تظهر في Merchant Center والمؤهّلة للظهور في وجهات مختلفة.
بسبب هذه العملية المتعدّدة الخطوات، يحدث تأخير، يستغرق عادةً بضع دقائق، بين وقت إرسال طلب تعديل ووقت ظهور التغييرات في مرجع Product
النهائي الذي يمكنك استرداده باستخدام products.get
.
مثال: تعديل منتج باستخدام إدخال أساسي واحد
هذه هي حالة الاستخدام الأكثر شيوعًا. يتوفّر منتج في مصدر بيانات أساسي واحد، وتريد تعديل بعض سماته.
- الحالة الأولية: يتوفّر المنتج
en~US~SKU12345
في مصدر البيانات الأساسي مع السمتَينtitle: "Classic T-Shirt"
وprice: 15.99 USD
. - طلب التعديل: يمكنك إرسال طلب
patch
لتعديلprice
إلى14.99 USD
وضبطavailability
علىout of stock
. - جارٍ المعالجة:
- تم تعديل
ProductInput
الخاص بـSKU12345
.
- تم تعديل
- المنتج النهائي: يتضمّن الإصدار النهائي من
Product
الآنtitle: "Classic T-Shirt"
وprice: 14.99 USD
وavailability: "out of stock"
.
مثال: تعديل منتج باستخدام بيانات وقواعد تكميلية
يوضّح هذا المثال كيف يمكن أن تؤثّر قواعد الخلاصة في عملية تعديل، ما يؤدي إلى تطبيق بعض التغييرات وتجاهل تغييرات أخرى.
- الحالة الأولية:
- المدخلات الأساسية: يحتوي
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."
.
- المدخلات الأساسية: يحتوي
- طلب تعديل: يمكنك إرسال طلب
patch
لتعديل مصدر البيانات الأساسي، مع ضبطtitle
على"Fantastic T-Shirt"
وdescription
على"A fantastic short-sleeve t-shirt."
. - جارٍ المعالجة:
- يتم تعديل
ProductInput
في مصدر البيانات الأساسي ليحتوي علىtitle: "Fantastic T-Shirt"
وdescription: "A fantastic short-sleeve t-shirt."
. - يتم تشغيل مسار المعالجة.
- بالنسبة إلى
title
، تنصّ قاعدة الخلاصة على أنّ القيمة من مصدر البيانات التكميلي (Awesome T-Shirt
) لها الأولوية، ما يؤدي إلى إلغاء التعديل. - بالنسبة إلى
description
، بما أنّه لا توجد قاعدة إلغاء، يتم استخدام القيمة المعدَّلة من الإدخال الأساسي (A fantastic short-sleeve t-shirt.
).
- يتم تعديل
- المنتج النهائي: يبقى عنوان
Product
النهائي هوAwesome T-Shirt
(تم تجاهل التعديل الذي أجريته)، ولكن أصبح الوصف الآنA fantastic short-sleeve t-shirt.
(تم تطبيق التعديل الذي أجريته).
الاختيار بين التعديلات ومصادر البيانات التكميلية
يمكنك تعديل بيانات المنتجات باستخدام productinputs.patch
أو عن طريق إدراج بيانات في مصادر بيانات إضافية. ويعتمد الخيار الأفضل على استراتيجية إدارة البيانات التي تتّبعها.
لتجنُّب نتائج غير متوقّعة، ننصحك بعدم استخدام كل من productinputs.patch
ومصادر البيانات التكميلية لإدارة بيانات المنتج نفسها.
في ما يلي مقارنة مفصّلة:
الميزة | productinputs.patch (الإشعارات) |
مصادر البيانات التكميلية |
---|---|---|
الأفضل لـ: | التغييرات السريعة والمتكررة والجزئية على البيانات الحالية (مثل السعر ومدى التوفّر) | تراكب البيانات المنفصلة منطقيًا، أو إدارة السمات المختلفة بواسطة أنظمة مختلفة، أو عمليات إلغاء معقّدة مستندة إلى قواعد |
آلية العمل | تعديل ProductInput حالي في مكانه |
تنشئ هذه السمة ProductInput جديدًا ومنفصلاً في مصدر بيانات تكميلي. |
دقة البيانات | تعمل على حقول معيّنة من ProductInput واحد. |
تعمل على ProductInput بالكامل ضمن المصدر التكميلي. |
الثبات | تستمر التغييرات إلى أن يتم استبدال ProductInput نفسه بـ insert كامل أو patch آخر. |
يتم التحكّم في استمرار ظهور الإشعارات من خلال قواعد الخلاصة. يمكن أن تلغي البيانات الأساسية إلى أجل غير مسمى إذا كانت القواعد تمنحها الأولوية. |
التفاعل مع القواعد | يمكن استخدامها بدون قواعد الخلاصة لأنّها تعدّل مصدر بيانات حالي وProductInput . |
يتطلّب إعداد قاعدة بشكل صريح في المصدر الأساسي لربط المصدر التكميلي. |
إعداد مصدر البيانات | تعمل على مصدر بيانات حالي. ليست هناك حاجة إلى مصادر جديدة. | يتطلّب ذلك إنشاء مصادر بيانات تكميلية منفصلة وإدارتها وربطها باستخدام قواعد الخلاصات. |