زیر-API محصولات به شما امکان میدهد بهروزرسانیهای جزئی برای محصولات موجود خود انجام دهید. این برای تغییر مکرر دادهها، مانند قیمت و موجودی، ایدهآل است زیرا از نیاز به ارسال مجدد کل محصول برای یک تغییر کوچک جلوگیری میکند. با این حال، شما باید مرتباً محصولات را دوباره وارد کنید تا مطمئن شوید که تمام دادههای محصول همگامسازی شدهاند.
This guide covers how to use the productinputs.patch method to update your products.
پیشنیازها
Before you can update a product, you need the following:
- An existing product to update. To learn how to create products, see the Add and manage products guide.
-
nameمنبع دادهای که ورودی محصول به آن تعلق دارد (برای مثال،accounts/12345/dataSources/67890). برای یادگیری نحوهی یافتن این مورد، به راهنمای مدیریت منابع دادهی API برای آپلودهای محصول مراجعه کنید.
جزئیات خاص محصول را بهروزرسانی کنید
To change a few details of a product, like its price or availability, without resubmitting all its information, use the productInputs.patch method.
You can specify which fields you're changing in the updateMask parameter. The updateMask is a comma-separated list of the fields you want to update. The patch method behaves as follows:
- Fields in
updateMaskand body: These fields are updated with the new values. - Fields in
updateMaskbut not in body: These fields are deleted from the product input. - Fields not in
updateMask: These fields are left unchanged. -
updateMaskparameter omitted: All fields provided in the request body are updated. Fields not provided in the request body are not deleted from the product input.
Here's an example of product data before an update:
{
"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"
}
}
This example updates the title and availability of a product and deletes its imageLink . The description and price are not in the updateMask and will remain unchanged.
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"
],
}
}
The following code samples show how to update a product.
جاوا
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"
}
}'
بهروزرسانی با استفاده از ویژگیهای سفارشی
You can update both standard and custom attributes in a single call. To update a custom attribute, prefix its name with customAttributes in the updateMask .
This example performs several actions in one request:
- ویژگی استاندارد
titleرا مستقیماً بهروزرسانی میکند. - Updates an existing custom attribute (
myCustomAttrToBeUpdated). - Inserts a new custom attribute (
myCustomAttrToBeInserted). - Deletes an existing custom attribute (
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"
}
]
}
A successful request returns the updated ProductInput reflecting all the specified changes.
درک بهروزرسانیهای ویژگیهای سفارشی
شما میتوانید از فیلد customAttributes برای بهروزرسانی ویژگیهایی که خودتان تعریف کردهاید استفاده کنید. این ویژگیها با مشخصات استاندارد مطابقت ندارند و به عنوان ویژگیهای سفارشی در محصول نهایی ذخیره میشوند.
نحوه پردازش بهروزرسانیهای محصول
وقتی درخواست patch ارسال میکنید، بهروزرسانی قبل از اعمال هر یک از قوانین، روی دادههای خاص ProductInput اعمال میشود. این امر منجر به رفتار ثابت بین درج و بهروزرسانی محصولات میشود.
نحوه پردازش بهروزرسانی شما به این صورت است:
Update Input: Your
patchrequest modifies the specificProductInputassociated with the data source you provided.Processing and Merging: After the input is updated, the processing begins:
- قوانین تغذیه و منابع داده تکمیلی: قوانینی که روی منبع اصلی محصول پیکربندی شدهاند،
ProductInputاز منابع اصلی و تکمیلی ترکیب میکنند. این قوانین میتوانند ویژگیها را تغییر دهند یا ویژگیهای جدیدی ایجاد کنند. برای کسب اطلاعات بیشتر در مورد تنظیم قوانین، به بخش «تنظیم قوانین ویژگی» مراجعه کنید. - Other data sources: Data from other sources (for example automatic improvements) are also merged together with the primary data source input.
- Validation: The merged data is validated against the Product data specification and Google's shopping policies.
- قوانین تغذیه و منابع داده تکمیلی: قوانینی که روی منبع اصلی محصول پیکربندی شدهاند،
محصول نهایی: نتیجه این خط لوله، منبع
Productنهایی و پردازششده است که میتواند با استفاده ازproducts.getیاproducts.listبازگردانده شود. این همچنین نسخهای از محصول است که در مرکز فروشندگان نشان داده میشود و واجد شرایط نمایش در مقاصد مختلف است.
به دلیل این فرآیند چند مرحلهای، بین ارسال درخواست بهروزرسانی و اعمال تغییرات در منبع نهایی Product که میتوانید با products.get بازیابی کنید، تأخیری، معمولاً چند دقیقهای، وجود دارد.
Example: Updating a product with a single primary input
This is the most common use case. A product exists in a single primary data source, and you want to update some of its attributes.
- Initial State: A product
en~US~SKU12345exists in your primary data source withtitle: "Classic T-Shirt"andprice: 15.99 USD. - Update Request: You send a
patchrequest to updatepriceto14.99 USDand setavailabilitytoout of stock. - پردازش:
-
ProductInputبرایSKU12345بهروزرسانی شده است.
-
- Final Product: The final
Productnow hastitle: "Classic T-Shirt",price: 14.99 USD, andavailability: "out of stock".
Example: Updating a product with supplemental data and rules
This example shows how feed rules can affect an update, causing some changes to be applied while others are overridden.
- حالت اولیه:
- Primary Input:
en~US~SKU12345hastitle: "Great T-Shirt"anddescription: "A great short-sleeve t-shirt.". - Supplemental Input: The same product has an entry in a supplemental data source with
title: "Awesome T-Shirt"anddescription: "An awesome short-sleeve t-shirt.". - Feed Rule: A rule is set to take the
titlefrom the supplemental data source. There is no rule fordescription. - Result: The final processed
Producthastitle: "Awesome T-Shirt"anddescription: "A great short-sleeve t-shirt.".
- Primary Input:
- Update Request: You send a
patchrequest to update the primary data source, settingtitleto"Fantastic T-Shirt"anddescriptionto"A fantastic short-sleeve t-shirt.". - پردازش:
- The
ProductInputin the primary data source is updated to havetitle: "Fantastic T-Shirt"anddescription: "A fantastic short-sleeve t-shirt.". - خط لوله پردازش اجرا میشود.
- For the
title, the feed rule dictates that the value from the supplemental data source (Awesome T-Shirt) takes precedence, overriding your update. - For the
description, since there is no overriding rule, the updated value from the primary input (A fantastic short-sleeve t-shirt.) is used.
- The
- Final Product: The final
Product's title remainsAwesome T-Shirt(your update was overridden), but its description is nowA fantastic short-sleeve t-shirt.(your update was applied).
Choose between updates and supplemental data sources
You can modify product data using either productinputs.patch or by inserting data into supplemental data sources. The best choice depends on your data management strategy.
To avoid unpredictable outcomes, we recommend that you don't use both productinputs.patch and supplemental data sources to manage the same product data for the same product.
در اینجا یک مقایسه دقیق وجود دارد:
| ویژگی | productinputs.patch (بهروزرسانیها) | منابع داده تکمیلی |
|---|---|---|
| بهترین برای | Quick, frequent, partial changes to existing data (eg, price, availability). | Layering logically separate data, managing different attributes by different systems, or complex rule-based overrides. |
| مکانیسم | یک ورودی ProductInput موجود را اصلاح میکند. | Creates a new, separate ProductInput in a supplemental data source. |
| جزئیات دادهها | Operates on specific fields of a single ProductInput . | Operates on the entire ProductInput within the supplemental source. |
| پشتکار | Changes persist until the same ProductInput is overwritten by a full insert or another patch . | Persistence is controlled by feed rules. Can override primary data indefinitely if rules prioritize it. |
| تعامل قوانین | Can be used without the feed rules as it updates an existing data source & ProductInput . | Requires explicitly setting up a rule on the primary source to link the supplemental source. |
| تنظیم منبع داده | Operates on an existing data source. No new sources needed. | Requires creating and managing separate supplemental data sources and linking them using feed rules. |