تتيح لك واجهة برمجة التطبيقات الفرعية "مصادر البيانات" إنشاء مصادر البيانات وإدارتها خصيصًا لتحميل المنتجات من خلال واجهة برمجة التطبيقات. يجب تحديد مصدر بيانات واحد على الأقل لتتمكّن من تقديم تفاصيل المنتجات إلى Merchant Center.
يستعرض هذا الدليل حالات الاستخدام الشائعة لإدارة مصادر البيانات المستندة إلى واجهة برمجة التطبيقات. للحصول على معلومات حول تحميل المنتجات باستخدام مصادر البيانات هذه، يُرجى الاطّلاع على دليل إضافة المنتجات وإدارتها. يمكنك أيضًا إدارة مصادر بياناتك من خلال واجهة مستخدم Merchant Center. لمزيد من المعلومات، يُرجى الاطّلاع على مقالة إدارة مصادر البيانات.
اعتبارات خاصة
عند العمل مع مصادر البيانات في Merchant API، يجب مراعاة ما يلي:
القواعد: تتيح واجهة برمجة التطبيقات الفرعية لمصادر البيانات استخدام القواعد التلقائية لربط مصادر البيانات التكميلية بمصادر البيانات الأساسية. يمكنك إدارة ترتيب مصادر البيانات التكميلية ضمن القاعدة التلقائية. لا تتيح واجهة برمجة التطبيقات هذه إنشاء القواعد المخصّصة المعقّدة وإدارتها بشكل مباشر. يمكنك إدارة ذلك باستخدام واجهة مستخدم Merchant Center.
مصادر البيانات التكميلية للحسابات بامتيازات متقدّمة: لا تتيح واجهة برمجة التطبيقات استخدام مصادر البيانات التكميلية والقواعد للحسابات بامتيازات متقدّمة (متعدّدة العملاء). يمكنك إدارة مصادر البيانات التكميلية و القواعد باستخدام واجهة مستخدم Merchant Center فقط.
إنشاء مصدر بيانات أساسي للمنتجات
عندما تريد إنشاء
PrimaryProductDataSource
يمكنه قبول المنتجات بأي تصنيف ولغة، لا تحدّد feedLabel
وcontentLanguage. يسهّل هذا الإعداد عملية الإدارة على التجّار الذين لا يحتاجون إلى قواعد أو إعدادات مختلفة لبلدان أو لغات مستهدَفة مختلفة، لأنّه يتيح لهم إدارة معرّف مصدر بيانات واحد فقط.
بخلاف ذلك، يمكنك إنشاء مصدر بيانات وحصره على تصنيف ولغة محدّدَين. إذا كنت تخطّط لاستخدام قواعد مصدر البيانات أو إعدادات أخرى (مثل استهداف البلد) تنطبق على مجموعات معيّنة من التصنيفات واللغات، حدِّد السمتَين feedLabel وcontentLanguage.
لمزيد من المعلومات حول استراتيجيات مصادر البيانات، يُرجى الاطّلاع على اختيار استراتيجية مصدر البيانات.
يُرجى العِلم أنّ مصدر البيانات feedLabel ليس له أي تأثير في البلد المستهدف. على سبيل المثال، استخدام US كتصنيف لا يستهدف تلقائيًا المستخدمين في الولايات المتحدة. للتحكّم في أماكن عرض منتجاتك وأهليتها، يتم تحديد البلدان المستهدفة على النحو التالي:
- على مستوى مصدر البيانات: يمكنك ضبط البلدان المستهدفة التلقائية في
primary product data sourceباستخدام الحقلcountries. وتنطبق هذه القواعد على كل المنتجات في مصدر البيانات هذا. - على مستوى المنتج (على الإنترنت): بالنسبة إلى طرق التسويق على الإنترنت، حدِّد البلدان المستهدفة للسلع الفردية باستخدام حقل
shippingفيproduct attributes. - على مستوى الحساب (محلي): بالنسبة إلى طرق التسويق المحلية، يتم تحديد البلدان المستهدفة تلقائيًا من المتاجر المرتبطة بحسابك على Merchant Center.
لمزيد من المعلومات حول استهداف بلدان معيّنة، يُرجى الاطّلاع على المقالة إضافة منتجات تستهدف بلدانًا معيّنة.
تتوفّر جميع مصادر البيانات التي تم إنشاؤها حديثًا تلقائيًا لجميع الوجهات المفعَّلة في الحساب. لمزيد من المعلومات، يُرجى الاطّلاع على الوجهات. يوفّر هذا النهج تجربة موحّدة ومتكاملة، ما يدعم استراتيجية القنوات المتعدّدة.
استهداف البلد
يمكنك ضبط البلدان المستهدفة بطريقتَين:
ما مِن بلدان تلقائية (استهداف مرن): إذا أنشأت مصدر البيانات باستخدام عنصر
primaryProductDataSourceفارغ (كما هو موضّح في المثال الأول أدناه)، لن يستهدف مصدر البيانات نفسه أي بلدان تلقائية. تعتمد طريقة تحديد البلدان على طريقة التسويق التي تستخدمها:- المتجر على الإنترنت: يمكنك تحديد البلدان المستهدفة لكل منتج
على حدة باستخدام السمة
shippingفي بيانات المنتج. - المتاجر المحلية: يتم تحديد البلدان المستهدفة تلقائيًا من المتاجر الفعلية المرتبطة بحسابك على Merchant Center، لذا ليس عليك تحديد معلومات الشحن.
- المتجر على الإنترنت: يمكنك تحديد البلدان المستهدفة لكل منتج
على حدة باستخدام السمة
البلدان التلقائية (الاستهداف على مستوى مصدر البيانات): يمكنك تحديد البلدان المستهدَفة التلقائية بشكل صريح باستخدام الحقل
countries(كما هو موضّح في المثال الثاني أدناه). تستهدف كل المنتجات التي تم تحميلها إلى مصدر البيانات هذا هذه البلدان تلقائيًا.
الاقتراحات
- مصدر بيانات واحد يستهدف بلدانًا ثابتة: إذا كانت جميع المنتجات في مصدر البيانات تستهدف البلد نفسه أو مجموعة البلدان نفسها، اضبط حقل
countriesفي مصدر البيانات. - مصدر بيانات واحد يستهدف بلدانًا مختلفة: إذا كنت تدير مصدر بيانات واحدًا يحتوي على منتجات موزّعة في بلدان مختلفة، يمكنك حذف السمة
countriesمن مصدر البيانات وضبطها على مستوى المنتج باستخدام السمةshipping. مصادر بيانات متعدّدة خاصة بكل بلد: إذا كنت تفضّل عزل المنتجات أو قواعد النشاط التجاري حسب المنطقة، أنشِئ مصادر بيانات أساسية منفصلة لكل بلد (أو مجموعة من البلدان) واضبط حقل
countriesفي كل مصدر بيانات. وعلى الرغم من أنّ إدارة معرّفات مصادر بيانات متعددة تتطلّب جهدًا إضافيًا، يتيح لك ذلك ضبط قواعد مختلفة لمصادر البيانات لكل بلد.
مصدر بيانات لأي تصنيف ولغة
عند إدراج المنتجات في مصدر البيانات هذا باستخدام طريقة
products.insert،
تقبل واجهة برمجة التطبيقات أي مجموعة من feedLabel وcontentLanguage
يتم تقديمها ضمن بيانات المنتج نفسه. يعمل مصدر البيانات كحاوية واحدة للمنتجات التي تستهدف مجموعات متعددة من اللغات والتصنيفات المختلفة. إذا كان لديك إعداد بسيط لا يستخدم قواعد معقّدة لمصادر البيانات، ننصحك بحذف الحقلَين feedLabel وcontentLanguage.
القيود والاعتبارات
- يمكن إنشاء مصدر بيانات متوافق مع أي تصنيف ولغة فقط
لمصادر البيانات الأساسية التي تستخدم
API. - يمكن ربط مصادر البيانات هذه بمصادر بيانات تكميلية عامة أو مستهدَفة. تتم المطابقة أثناء المعالجة استنادًا إلى السمتَين
feedLabelوcontentLanguageالخاصتَين بالمنتج الفردي.
أمثلة
في ما يلي مثال على إنشاء مصدر بيانات لأي تصنيف ولغة بدون بلد تلقائي:
POST https://merchantapi.googleapis.com/datasources/v1/accounts/{ACCOUNT_ID}/dataSources
{
"displayName": "My API Primary Product Source (No Default Countries)",
"primaryProductDataSource": {}
}
يعرض الطلب الناجح مورد DataSource التالي:
{
"name": "accounts/{ACCOUNT_ID}/dataSources/{DATASOURCE_ID}",
"dataSourceId": "{DATASOURCE_ID}",
"displayName": "My API Primary Product Source (No Default Countries)",
"primaryProductDataSource": {},
"input": "API"
}
في ما يلي مثال على إنشاء مصدر بيانات لأي تصنيف ولغة مع بلد تلقائي (بريطانيا العظمى):
POST https://merchantapi.googleapis.com/datasources/v1/accounts/{ACCOUNT_ID}/dataSources
{
"displayName": "My API Primary Product Source (GB Default)",
"primaryProductDataSource": {
"countries": ["GB"]
}
}
يعرض الطلب الناجح مورد DataSource التالي:
{
"name": "accounts/{ACCOUNT_ID}/dataSources/{DATASOURCE_ID}",
"dataSourceId": "{DATASOURCE_ID}",
"displayName": "My API Primary Product Source (GB Default)",
"primaryProductDataSource": {
"countries": [
"GB"
]
},
"input": "API"
}
استخدِم name لمصدر البيانات الذي تم إنشاؤه حديثًا للإشارة إليه عند
إدراج المنتجات باستخدام واجهة برمجة التطبيقات الفرعية Products.
تعرض عيّنات التعليمات البرمجية التالية كيفية إنشاء
PrimaryProductDataSource
بدون ضبط الحقول feedLabel وcontentLanguage وcountries.
جافا
import com.google.api.gax.core.FixedCredentialsProvider;
import com.google.auth.oauth2.GoogleCredentials;
import com.google.shopping.merchant.datasources.v1.CreateDataSourceRequest;
import com.google.shopping.merchant.datasources.v1.DataSource;
import com.google.shopping.merchant.datasources.v1.DataSourcesServiceClient;
import com.google.shopping.merchant.datasources.v1.DataSourcesServiceSettings;
import com.google.shopping.merchant.datasources.v1.PrimaryProductDataSource;
import shopping.merchant.samples.utils.Authenticator;
import shopping.merchant.samples.utils.Config;
/**
* This class demonstrates how to create a primary product data source for all `feedLabel` and
* `contentLanguage` combinations.
*/
public class CreatePrimaryProductDataSourceMultipleLanguagesSample {
private static String getParent(String merchantId) {
return String.format("accounts/%s", merchantId);
}
public static String createDataSource(Config config, String displayName) throws Exception {
GoogleCredentials credential = new Authenticator().authenticate();
DataSourcesServiceSettings dataSourcesServiceSettings =
DataSourcesServiceSettings.newBuilder()
.setCredentialsProvider(FixedCredentialsProvider.create(credential))
.build();
String parent = getParent(config.getAccountId().toString());
// The type of data that this datasource will receive.
PrimaryProductDataSource primaryProductDataSource =
PrimaryProductDataSource.newBuilder()
.addCountries("GB")
.build();
try (DataSourcesServiceClient dataSourcesServiceClient =
DataSourcesServiceClient.create(dataSourcesServiceSettings)) {
CreateDataSourceRequest request =
CreateDataSourceRequest.newBuilder()
.setParent(parent)
.setDataSource(
DataSource.newBuilder()
.setDisplayName(displayName)
.setPrimaryProductDataSource(primaryProductDataSource)
.build())
.build();
System.out.println("Sending Create PrimaryProduct DataSource request");
DataSource response = dataSourcesServiceClient.createDataSource(request);
System.out.println("Created DataSource Name below");
System.out.println(response.getName());
return response.getName();
} catch (Exception e) {
System.out.println(e);
System.exit(1);
// Null is necessary to satisfy the compiler as we're not returning a String on failure.
return null;
}
}
public static void main(String[] args) throws Exception {
Config config = Config.load();
// The displayed data source name in the Merchant Center UI.
String displayName = "Primary Product Data Multiple Languages";
createDataSource(config, displayName);
}
}
PHP
use Google\ApiCore\ApiException;
use Google\Shopping\Merchant\DataSources\V1\Client\DataSourcesServiceClient;
use Google\Shopping\Merchant\DataSources\V1\CreateDataSourceRequest;
use Google\Shopping\Merchant\DataSources\V1\DataSource;
use Google\Shopping\Merchant\DataSources\V1\PrimaryProductDataSource;
/**
* This class demonstrates how to create a primary product datasource for all `feedLabel` and
* `contentLanguage` combinations.
*/
class CreatePrimaryProductDataSourceMultipleLanguagesSample
{
/**
* Creates a primary product data source.
*
* @param int $merchantId The Merchant Center account ID.
* @param string $displayName The displayed data source name in the Merchant Center UI.
*
* @return string The name of the newly created data source.
*/
public function createDataSource(int $merchantId, string $displayName): string
{
// 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 client.
$dataSourcesServiceClient = new DataSourcesServiceClient($options);
$parent = sprintf('accounts/%s', $merchantId);
// The type of data that this datasource will receive.
$primaryProductDataSource = (new PrimaryProductDataSource())
->setCountries(['GB']);
// Calls the API and catches and prints any network failures/errors.
try {
$response = $dataSourcesServiceClient->createDataSource(
(new CreateDataSourceRequest())
->setParent($parent)
->setDataSource(
(new DataSource())
->setDisplayName($displayName)
->setPrimaryProductDataSource($primaryProductDataSource)
)
);
printf('Created DataSource Name below:' . PHP_EOL);
printf('%s' . PHP_EOL, $response->getName());
return $response->getName();
} catch (ApiException $ex) {
printf('Call failed with message: %s' . PHP_EOL, $ex->getMessage());
exit(1);
}
}
// Helper to execute the sample.
public function callSample(): void
{
$config = Config::generateConfig();
// The Merchant Center Account ID.
$merchantId = $config['accountId'];
// The displayed datasource name in the Merchant Center UI.
$displayName = 'Primary Product Data Multiple Languages';
self::createDataSource($merchantId, $displayName);
}
}
$sample = new CreatePrimaryProductDataSourceMultipleLanguagesSample();
$sample->callSample();
Python
from examples.authentication import configuration
from examples.authentication import generate_user_credentials
from google.shopping.merchant_datasources_v1 import CreateDataSourceRequest
from google.shopping.merchant_datasources_v1 import DataSource
from google.shopping.merchant_datasources_v1 import DataSourcesServiceClient
from google.shopping.merchant_datasources_v1 import PrimaryProductDataSource
_ACCOUNT = configuration.Configuration().read_merchant_info()
_PARENT = f"accounts/{_ACCOUNT}"
def create_primary_product_data_source_multiple_languages():
"""Creates a `DataSource` resource."""
# Gets OAuth Credentials.
credentials = generate_user_credentials.main()
# Creates a client.
client = DataSourcesServiceClient(credentials=credentials)
# Creates a PrimaryProductDataSource.
primary_datasource = PrimaryProductDataSource()
primary_datasource.countries = ["GB"]
# Creates a DataSource and populates its attributes.
data_source = DataSource()
data_source.display_name = "Example Multiple Languages Primary DataSource"
data_source.primary_product_data_source = primary_datasource
# Creates the request.
request = CreateDataSourceRequest(parent=_PARENT, data_source=data_source)
# Makes the request and catches and prints any error messages.
try:
response = client.create_data_source(request=request)
print(f"DataSource successfully created: {response}")
except RuntimeError as e:
print("DataSource creation failed")
print(e)
if __name__ == "__main__":
create_primary_product_data_source_multiple_languages()
cURL
curl -X POST \
"https://merchantapi.googleapis.com/datasources/v1/accounts/{ACCOUNT_ID}/dataSources" \
-H "Authorization: Bearer {API_TOKEN}" \
-H "Content-Type: application/json" \
-d '{
"displayName": "Primary Product Data Multiple Languages",
"primaryProductDataSource": {
"countries": ["GB"]
}
}'
مصدر بيانات لتصنيف ولغة معيّنين
لإنشاء مصدر بيانات يقبل فقط المنتجات التي تتضمّن تصنيفًا ولغة محدّدَين، اضبط الحقلَين feedLabel وcontentLanguage باستخدام الطريقة dataSources.create:
POST https://merchantapi.googleapis.com/datasources/v1/accounts/{ACCOUNT_ID}/dataSources
{
"displayName": "My API Primary Product Source (US-en)",
"primaryProductDataSource": {
"feedLabel": "US",
"contentLanguage": "en",
"countries": ["US"]
}
}
يعرض الطلب الناجح مورد DataSource الذي تم إنشاؤه حديثًا. يمكنك
استخدام name لمصدر البيانات الذي تم إنشاؤه حديثًا للإشارة إلى مصدر البيانات هذا عند
إدراج المنتجات باستخدام واجهة Products sub-API.
{
"name": "accounts/{ACCOUNT_ID}/dataSources/{DATASOURCE_ID}",
"dataSourceId": "{DATASOURCE_ID}",
"displayName": "My API Primary Product Source (US-en)",
"primaryProductDataSource": {
"feedLabel": "US",
"contentLanguage": "en",
"countries": ["US"]
},
"input": "API"
}
توضّح عيّنات التعليمات البرمجية التالية كيفية إنشاء مصدر بيانات يقبل فقط المنتجات التي تتطابق مع تصنيف ولغة معيّنين.
جافا
import com.google.api.gax.core.FixedCredentialsProvider;
import com.google.auth.oauth2.GoogleCredentials;
import com.google.shopping.merchant.datasources.v1.CreateDataSourceRequest;
import com.google.shopping.merchant.datasources.v1.DataSource;
import com.google.shopping.merchant.datasources.v1.DataSourcesServiceClient;
import com.google.shopping.merchant.datasources.v1.DataSourcesServiceSettings;
import com.google.shopping.merchant.datasources.v1.PrimaryProductDataSource;
import com.google.shopping.type.Destination.DestinationEnum;
import shopping.merchant.samples.utils.Authenticator;
import shopping.merchant.samples.utils.Config;
/**
* This class demonstrates how to create a primary product datasource for the "en" and "GB"
* `feedLabel` and `contentLanguage` combination.
*/
public class CreatePrimaryProductDataSourceSample {
private static String getParent(String merchantId) {
return String.format("accounts/%s", merchantId);
}
public static String createDataSource(Config config, String displayName) throws Exception {
GoogleCredentials credential = new Authenticator().authenticate();
DataSourcesServiceSettings dataSourcesServiceSettings =
DataSourcesServiceSettings.newBuilder()
.setCredentialsProvider(FixedCredentialsProvider.create(credential))
.build();
String parent = getParent(config.getAccountId().toString());
// The type of data that this datasource will receive.
PrimaryProductDataSource primaryProductDataSource =
PrimaryProductDataSource.newBuilder()
.addCountries("GB")
.setContentLanguage("en")
.setFeedLabel("GB")
// The destinations do not necessarily have to be explicitly listed in which case the
// default enabled destinations will be used.
.addDestinations(
PrimaryProductDataSource.Destination.newBuilder()
.setDestination(DestinationEnum.FREE_LISTINGS)
.setState(PrimaryProductDataSource.Destination.State.ENABLED)
.build())
.addDestinations(
PrimaryProductDataSource.Destination.newBuilder()
.setDestination(DestinationEnum.SHOPPING_ADS)
.setState(PrimaryProductDataSource.Destination.State.DISABLED)
.build())
.build();
try (DataSourcesServiceClient dataSourcesServiceClient =
DataSourcesServiceClient.create(dataSourcesServiceSettings)) {
CreateDataSourceRequest request =
CreateDataSourceRequest.newBuilder()
.setParent(parent)
.setDataSource(
DataSource.newBuilder()
.setDisplayName(displayName)
.setPrimaryProductDataSource(primaryProductDataSource)
.build())
.build();
System.out.println("Sending Create PrimaryProduct DataSource request");
DataSource response = dataSourcesServiceClient.createDataSource(request);
System.out.println("Created DataSource Name below");
System.out.println(response.getName());
return response.getName();
}
}
public static void main(String[] args) throws Exception {
Config config = Config.load();
// The displayed datasource name in the Merchant Center UI.
String displayName = "British Primary Product Data";
createDataSource(config, displayName);
}
}
PHP
use Google\ApiCore\ApiException;
use Google\Shopping\Merchant\DataSources\V1\Client\DataSourcesServiceClient;
use Google\Shopping\Merchant\DataSources\V1\CreateDataSourceRequest;
use Google\Shopping\Merchant\DataSources\V1\DataSource;
use Google\Shopping\Merchant\DataSources\V1\PrimaryProductDataSource;
use Google\Shopping\Type\Destination\DestinationEnum;
/**
* This class demonstrates how to create a primary product datasource for the "en" and "GB"
* `feedLabel` and `contentLanguage` combination.
*/
class CreatePrimaryProductDataSourceSample
{
/**
* A helper function to create the parent string for DataSource resources.
*
* @param string $accountId The Merchant Center account ID.
* @return string The parent resource name in the format `accounts/{account_id}`.
*/
private static function getParent(string $accountId): string
{
return sprintf("accounts/%s", $accountId);
}
/**
* Creates a new primary product data source.
*
* @param array $config The configuration array containing the account ID.
* @param string $displayName The display name for the new data source.
* @return void
*/
public static function createDataSourceSample(array $config, string $displayName): 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 DataSourcesServiceClient.
$dataSourcesServiceClient = new DataSourcesServiceClient($options);
// Constructs the parent resource name from the account ID.
$parent = self::getParent($config['accountId']);
// Defines the primary product data source specific settings.
$primaryProductDataSource = new PrimaryProductDataSource([
'countries' => ['GB'],
'content_language' => 'en',
'feed_label' => 'GB',
// The destinations do not necessarily have to be explicitly listed in which case the
// default enabled destinations will be used.
'destinations' => [
new PrimaryProductDataSource\Destination([
'destination' => DestinationEnum::FREE_LISTINGS,
'state' => PrimaryProductDataSource\Destination\State::ENABLED
]),
new PrimaryProductDataSource\Destination([
'destination' => DestinationEnum::SHOPPING_ADS,
'state' => PrimaryProductDataSource\Destination\State::DISABLED
])
]
]);
// Creates the DataSource object.
$dataSource = new DataSource([
'display_name' => $displayName,
'primary_product_data_source' => $primaryProductDataSource
]);
// Prepares the request message to create the data source.
$request = new CreateDataSourceRequest([
'parent' => $parent,
'data_source' => $dataSource
]);
// Calls the API and catches and prints any network failures/errors.
try {
print "Sending Create PrimaryProduct DataSource request\n";
// Issues the create data source request.
$response = $dataSourcesServiceClient->createDataSource($request);
print("Created DataSource below\n");
print($response->serializeToJsonString() . PHP_EOL);
} catch (ApiException $e) {
printf("ApiException was thrown: %s\n", $e->getMessage());
}
}
/**
* Helper to execute the sample.
*
* @return void
*/
public function callSample(): void
{
$config = Config::generateConfig();
// The displayed datasource name in the Merchant Center UI.
$displayName = "British Primary Product Data";
self::createDataSourceSample($config, $displayName);
}
}
// Run the script.
$sample = new CreatePrimaryProductDataSourceSample();
$sample->callSample();
Python
"""Sample for creating a primary product data source."""
from examples.authentication import configuration
from examples.authentication import generate_user_credentials
from google.shopping.merchant_datasources_v1 import CreateDataSourceRequest
from google.shopping.merchant_datasources_v1 import DataSource
from google.shopping.merchant_datasources_v1 import DataSourcesServiceClient
from google.shopping.merchant_datasources_v1 import PrimaryProductDataSource
# Used for setting the destination type, e.g., FREE_LISTINGS.
from google.shopping.type import types as merchant_api_types
def create_primary_product_data_source(
account_id: str, display_name: str
) -> str:
"""Creates a primary product data source for the 'en' language and 'GB' region, targeting specific destinations.
Args:
account_id: The Merchant Center account ID.
display_name: The user-visible name for the new data source in Merchant
Center.
Returns:
The resource name of the newly created data source.
"""
# Obtains OAuth 2.0 credentials for API authentication.
credentials = generate_user_credentials.main()
# Initializes the DataSourcesServiceClient with the obtained credentials.
client = DataSourcesServiceClient(credentials=credentials)
# Configures the PrimaryProductDataSource.
# This section defines the core properties of the product data feed.
primary_product_data_source = PrimaryProductDataSource()
# Sets the target countries for this data source.
primary_product_data_source.countries = ["GB"]
# Sets the content language for the products.
primary_product_data_source.content_language = "en"
# Sets the feed label, often matching the country or language.
primary_product_data_source.feed_label = "GB"
# Defines the destinations for this data source and their states.
# If destinations are not explicitly listed, defaults will be used.
# Configure Free Listings destination (enabled).
destination_free_listings = PrimaryProductDataSource.Destination()
destination_free_listings.destination = (
merchant_api_types.Destination.DestinationEnum.FREE_LISTINGS
)
destination_free_listings.state = (
PrimaryProductDataSource.Destination.State.ENABLED
)
# Configure Shopping Ads destination (disabled).
destination_shopping_ads = PrimaryProductDataSource.Destination()
destination_shopping_ads.destination = (
merchant_api_types.Destination.DestinationEnum.SHOPPING_ADS
)
destination_shopping_ads.state = (
PrimaryProductDataSource.Destination.State.DISABLED
)
primary_product_data_source.destinations = [
destination_free_listings,
destination_shopping_ads,
]
# Assembles the DataSource object.
data_source = DataSource()
data_source.display_name = display_name
data_source.primary_product_data_source = primary_product_data_source
# Constructs the parent resource name format for Data Source operations.
parent = f"accounts/{account_id}"
# Prepares the CreateDataSourceRequest.
# This request includes the parent account and the data source configuration.
request = CreateDataSourceRequest(parent=parent, data_source=data_source)
try:
# Executes the API call to create the data source.
print("Sending Create PrimaryProduct DataSource request")
response = client.create_data_source(request=request)
# Confirms creation and prints the new data source's name.
print("Created DataSource Name below")
print(response)
return response.name
except RuntimeError as e:
# Handles any errors encountered during the API request.
print(e)
raise
if __name__ == "__main__":
# Fetches the Merchant Center account ID from the configuration file.
# This ID is essential for constructing the 'parent' resource path
# required by the API.
merchant_account_id = configuration.Configuration().read_merchant_info()
# Sets the desired display name for the data source in Merchant Center.
datasource_display_name = "British Primary Product Data"
# Calls the function to create the data source.
create_primary_product_data_source(
merchant_account_id, datasource_display_name
)
cURL
curl -X POST \
"https://merchantapi.googleapis.com/datasources/v1/accounts/{ACCOUNT_ID}/dataSources" \
-H "Authorization: Bearer {API_TOKEN}" \
-H "Content-Type: application/json" \
-d '{
"displayName": "British Primary Product Data",
"primaryProductDataSource": {
"countries": ["GB"],
"contentLanguage": "en",
"feedLabel": "GB",
"destinations": [
{
"destination": "FREE_LISTINGS",
"state": "ENABLED"
},
{
"destination": "SHOPPING_ADS",
"state": "DISABLED"
}
]
}
}'
إنشاء مصدر بيانات تكميلي في واجهة برمجة التطبيقات وربطه بمصدر بيانات أساسي
تتيح لك مصادر البيانات التكميلية تقديم بيانات منتجات إضافية تكمّل مصادر البيانات الأساسية.
الخطوة 1: إنشاء مصدر بيانات تكميلي لواجهة برمجة التطبيقات
أنشِئ مصدر بيانات تكميليًا باستخدام
dataSources.create.
إذا أردت أن يكون مصدر البيانات التكميلي قابلاً للتطبيق على أي مصدر بيانات أساسي، يمكنك حذف feedLabel وcontentLanguage. لاستهداف مصادر البيانات الأساسية التي تتضمّن إعدادات مطابقة، يجب تحديد feedLabel وcontentLanguage.
اقتراحات بشأن مصادر البيانات التكميلية
- إتاحة أي تصنيف ولغة: يمكنك إنشاء مصادر بيانات تكميلية لإتاحة أي تصنيف ولغة أو استهداف تصنيفات ولغات معيّنة.
- مرونة الربط: يمكن ربط مصدر بيانات أساسي بمصادر بيانات تكميلية، بغض النظر عمّا إذا كان مصدر البيانات الأساسي يستهدف تصنيفًا ولغة معيّنين أم لا. يُرجى العِلم أنّ مصادر البيانات التكميلية
لا تستهدف أي تصنيف أو لغة. تتم المطابقة أثناء المعالجة استنادًا إلى السمتَين
feedLabelوcontentLanguageالخاصتَين بالمنتج. - تخزين أسماء مصادر البيانات لاستخدامها في المستقبل: بعد إنشاء مصادر البيانات التكميلية، خزِّن أسماءها في قاعدة بياناتك المحلية للرجوع إليها مباشرةً في طلبات البيانات المستقبلية من واجهة برمجة التطبيقات.
POST https://merchantapi.googleapis.com/datasources/v1/accounts/{ACCOUNT_ID}/dataSources
{
"displayName": "My API Supplemental Source",
"supplementalProductDataSource": {}
}
يؤدي ذلك إلى عرض مورد DataSource التكميلي الذي تم إنشاؤه حديثًا. يُرجى ملاحظة
name (الذي يتضمّن dataSourceId).
{
"name": "accounts/{ACCOUNT_ID}/dataSources/{SUPPLEMENTAL_DATASOURCE_ID}",
"dataSourceId": "{SUPPLEMENTAL_DATASOURCE_ID}",
"displayName": "My API Supplemental Source",
"supplementalProductDataSource": {},
"input": "API"
}
توضّح عيّنات التعليمات البرمجية التالية كيفية إنشاء مصدر إضافي لبيانات المنتج
بدون ضبط الحقلَين feedLabel وcontentLanguage.
جافا
import com.google.api.gax.core.FixedCredentialsProvider;
import com.google.auth.oauth2.GoogleCredentials;
import com.google.shopping.merchant.datasources.v1.CreateDataSourceRequest;
import com.google.shopping.merchant.datasources.v1.DataSource;
import com.google.shopping.merchant.datasources.v1.DataSourcesServiceClient;
import com.google.shopping.merchant.datasources.v1.DataSourcesServiceSettings;
import com.google.shopping.merchant.datasources.v1.SupplementalProductDataSource;
import shopping.merchant.samples.utils.Authenticator;
import shopping.merchant.samples.utils.Config;
/**
* This class demonstrates how to create a Supplemental product datasource all `feedLabel` and
* `contentLanguage` combinations. This works only for API supplemental feeds.
*/
public class CreateSupplementalProductDataSourceMultipleLanguagesSample {
private static String getParent(String merchantId) {
return String.format("accounts/%s", merchantId);
}
public static String createDataSource(Config config, String displayName) throws Exception {
GoogleCredentials credential = new Authenticator().authenticate();
DataSourcesServiceSettings dataSourcesServiceSettings =
DataSourcesServiceSettings.newBuilder()
.setCredentialsProvider(FixedCredentialsProvider.create(credential))
.build();
String parent = getParent(config.getAccountId().toString());
try (DataSourcesServiceClient dataSourcesServiceClient =
DataSourcesServiceClient.create(dataSourcesServiceSettings)) {
CreateDataSourceRequest request =
CreateDataSourceRequest.newBuilder()
.setParent(parent)
.setDataSource(
DataSource.newBuilder()
.setDisplayName(displayName)
.setSupplementalProductDataSource(
SupplementalProductDataSource.newBuilder().build())
.build())
.build();
System.out.println("Sending create SupplementalProduct DataSource request");
DataSource response = dataSourcesServiceClient.createDataSource(request);
System.out.println("Created DataSource Name below");
System.out.println(response.getName());
return response.getName();
} catch (Exception e) {
System.out.println(e);
System.exit(1);
return null; // Necessary to satisfy the compiler as we're not returning a
// String on failure.
}
}
public static void main(String[] args) throws Exception {
Config config = Config.load();
// The displayed data source name in the Merchant Center UI.
String displayName = "Supplemental API Product Data Multiple Languages";
createDataSource(config, displayName);
}
}
PHP
use Google\ApiCore\ApiException;
use Google\Shopping\Merchant\DataSources\V1\Client\DataSourcesServiceClient;
use Google\Shopping\Merchant\DataSources\V1\CreateDataSourceRequest;
use Google\Shopping\Merchant\DataSources\V1\DataSource;
use Google\Shopping\Merchant\DataSources\V1\SupplementalProductDataSource;
/**
* Class to demonstrate creating a Supplemental product datasource for all
* `feedLabel` and `contentLanguage` combinations. This works only for API
* supplemental feeds.
*/
class CreateSupplementalProductDataSourceMultipleLanguagesSample
{
/**
* Creates a DataSource.
*
* @param int $merchantId The Merchant Center Account ID.
* @param string $displayName The display name of the data source.
* @return string The name of the newly created data source.
*/
public function createDataSource(int $merchantId, string $displayName): string
{
// 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 client.
$dataSourcesServiceClient = new DataSourcesServiceClient($options);
$parent = sprintf('accounts/%s', $merchantId);
// Creates the data source.
$dataSource = (new DataSource())
->setDisplayName($displayName)
->setSupplementalProductDataSource(new SupplementalProductDataSource());
// Creates the request.
$request = (new CreateDataSourceRequest())
->setParent($parent)
->setDataSource($dataSource);
print('Sending create SupplementalProduct DataSource request' . PHP_EOL);
// Calls the API and catches and prints any network failures/errors.
try {
$response = $dataSourcesServiceClient->createDataSource($request);
print('Created DataSource Name below' . PHP_EOL);
print($response->getName() . PHP_EOL);
return $response->getName();
} catch (ApiException $ex) {
print('Call failed with message: ' . $ex->getMessage() . PHP_EOL);
return '';
}
}
// Helper to execute the sample.
public function callSample(): void
{
$config = Config::generateConfig();
// The Merchant Center Account ID.
$merchantId = $config['accountId'];
// The displayed datasource name in the Merchant Center UI.
$displayName = 'Supplemental API Product Data Multiple Languages';
self::createDataSource($merchantId, $displayName);
}
}
$sample = new CreateSupplementalProductDataSourceMultipleLanguagesSample();
$sample->callSample();
Python
from examples.authentication import configuration
from examples.authentication import generate_user_credentials
from google.shopping import merchant_datasources_v1
_ACCOUNT = configuration.Configuration().read_merchant_info()
_PARENT = f"accounts/{_ACCOUNT}"
def create_supplemental_product_data_source_multiple_languages():
"""Creates a `DataSource` resource."""
# Gets OAuth Credentials.
credentials = generate_user_credentials.main()
# Creates a client.
client = merchant_datasources_v1.DataSourcesServiceClient(
credentials=credentials
)
# Creates a SupplementalProductDataSource.
supplemental_datasource = (
merchant_datasources_v1.SupplementalProductDataSource()
)
# Creates a DataSource and populates its attributes.
data_source = merchant_datasources_v1.DataSource()
data_source.display_name = (
"Example Multiple Languages Supplemental DataSource"
)
data_source.supplemental_product_data_source = supplemental_datasource
# Creates the request.
request = merchant_datasources_v1.CreateDataSourceRequest(
parent=_PARENT, data_source=data_source
)
# Makes the request and catches and prints any error messages.
try:
response = client.create_data_source(request=request)
print(f"DataSource successfully created: {response}")
except RuntimeError as e:
print("DataSource creation failed")
print(e)
if __name__ == "__main__":
create_supplemental_product_data_source_multiple_languages()
cURL
curl -X POST \
"https://merchantapi.googleapis.com/datasources/v1/accounts/{ACCOUNT_ID}/dataSources" \
-H "Authorization: Bearer {API_TOKEN}" \
-H "Content-Type: application/json" \
-d '{
"displayName": "Supplemental API Product Data Multiple Languages",
"supplementalProductDataSource": {}
}'
الخطوة 2: ربط مصدر البيانات التكميلي بمصدر بيانات أساسي
عدِّل مصدر البيانات الأساسي لربطه بمصدر البيانات التكميلي الذي تم إنشاؤه حديثًا. يمكنك تحقيق ذلك من خلال تعديل defaultRule
PrimaryProductDataSource
باستخدام الطريقة
dataSources.patch.
تحدّد قائمة takeFromDataSources في defaultRule ترتيب الأسبقية. يتم الحصول على السمات من مصدر البيانات الأول في القائمة الذي يوفّرها. يشير الاختصار self إلى مصدر البيانات الأساسي نفسه.
توضّح الأمثلة التالية إعداد القاعدة التلقائية التي تأخذ البيانات أولاً من مصدر البيانات الأساسي، وإذا لم تكن السمة متاحة هناك، تأخذ السمة من المصدر التكميلي.
PATCH https://merchantapi.googleapis.com/datasources/v1/accounts/{ACCOUNT_ID}/dataSources/{PRIMARY_DATASOURCE_ID}?updateMask=primaryProductDataSource.defaultRule
{
"name": "accounts/{ACCOUNT_ID}/dataSources/{PRIMARY_DATASOURCE_ID}",
"primaryProductDataSource": {
"defaultRule": {
"takeFromDataSources": [
{
"self": true
},
{
"supplementalDataSourceName": "accounts/{ACCOUNT_ID}/dataSources/{SUPPLEMENTAL_DATASOURCE_ID}"
}
]
}
}
}
يعرض الطلب الناجح مورد DataSource الأساسي المعدَّل.
{
"name": "accounts/{ACCOUNT_ID}/dataSources/{PRIMARY_DATASOURCE_ID}",
"dataSourceId": "{PRIMARY_DATASOURCE_ID}",
"displayName": "My API Primary Product Source",
"primaryProductDataSource": {
"countries": [
"US",
"GB",
"DE"
],
"defaultRule": {
"takeFromDataSources": [
{
"self": true
},
{
"supplementalDataSourceName": "accounts/{ACCOUNT_ID}/dataSources/{SUPPLEMENTAL_DATASOURCE_ID}"
}
]
}
},
"input": "API"
}
توضّح عيّنات التعليمات البرمجية التالية كيفية ربط مصدر بيانات تكميلي بمصدر البيانات الأساسي.
جافا
import shopping.merchant.samples.datasources.v1.UpdateDataSourceSample;
import shopping.merchant.samples.utils.Config;
/**
* This class demonstrates how to add supplemental DataSources to the primary DataSource's default
* rule.
*/
public class AddSupplementalDataSourceToPrimaryDataSourceSample {
public static void addSupplementalDataSourceToPrimaryDataSource(
Config config,
String primaryDataSourceName,
String firstSupplementalDataSourceName,
String secondSupplementalDataSourceName)
throws Exception {
// Update the primary DataSource's default rule to include both supplemental feeds.
UpdateDataSourceSample updateDatasource = new UpdateDataSourceSample();
updateDatasource.updateDataSource(
config,
primaryDataSourceName,
firstSupplementalDataSourceName,
secondSupplementalDataSourceName);
}
public static void main(String[] args) throws Exception {
Config config = Config.load();
// The names of the primary and supplemental datasources.
String primaryDataSourceName = "accounts/{account_id}/dataSources/{datasource_id}";
String firstSupplementalDataSourceName = "accounts/{account_id}/dataSources/{datasource_id}";
String secondSupplementalDataSourceName = "accounts/{account_id}/dataSources/{datasource_id}";
addSupplementalDataSourceToPrimaryDataSource(
config,
primaryDataSourceName,
firstSupplementalDataSourceName,
secondSupplementalDataSourceName);
}
}
cURL
curl -X PATCH \
"https://merchantapi.googleapis.com/datasources/v1/accounts/{ACCOUNT_ID}/dataSources/{PRIMARY_DATASOURCE_ID}?updateMask=primaryProductDataSource.defaultRule" \
-H "Authorization: Bearer {API_TOKEN}" \
-H "Content-Type: application/json" \
-d '{
"name": "accounts/{ACCOUNT_ID}/dataSources/{PRIMARY_DATASOURCE_ID}",
"primaryProductDataSource": {
"defaultRule": {
"takeFromDataSources": [
{
"self": true
},
{
"supplementalDataSourceName": "accounts/{ACCOUNT_ID}/dataSources/{SUPPLEMENTAL_DATASOURCE_ID_1}"
},
{
"supplementalDataSourceName": "accounts/{ACCOUNT_ID}/dataSources/{SUPPLEMENTAL_DATASOURCE_ID_2}"
}
]
}
}
}'
تعديل مصدر بيانات
يمكنك تعديل سمات مصدر بيانات حالي، مثل displayName.
استخدِم الطريقة
dataSources.patch
وحدِّد الحقول المطلوب تعديلها في updateMask.
PATCH https://merchantapi.googleapis.com/datasources/v1/accounts/{ACCOUNT_ID}/dataSources/{DATASOURCE_ID}?updateMask=displayName
{
"name": "accounts/{ACCOUNT_ID}/dataSources/{DATASOURCE_ID}",
"displayName": "Updated API Primary Source Name"
}
يعرض الطلب الناجح مورد DataSource المعدَّل.
{
"name": "accounts/{ACCOUNT_ID}/dataSources/{DATASOURCE_ID}",
"dataSourceId": "{DATASOURCE_ID}",
"displayName": "Updated API Primary Source Name",
"primaryProductDataSource": {
"feedLabel": "US",
"contentLanguage": "en",
"countries": ["US"]
},
"input": "API"
}
تعرض عيّنات التعليمات البرمجية التالية كيفية استخدام طريقة patch لتعديل مصدر بيانات.
جافا
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.DataSource;
import com.google.shopping.merchant.datasources.v1.DataSourceName;
import com.google.shopping.merchant.datasources.v1.DataSourceReference;
import com.google.shopping.merchant.datasources.v1.DataSourcesServiceClient;
import com.google.shopping.merchant.datasources.v1.DataSourcesServiceSettings;
import com.google.shopping.merchant.datasources.v1.PrimaryProductDataSource;
import com.google.shopping.merchant.datasources.v1.PrimaryProductDataSource.DefaultRule;
import com.google.shopping.merchant.datasources.v1.UpdateDataSourceRequest;
import shopping.merchant.samples.utils.Authenticator;
import shopping.merchant.samples.utils.Config;
/**
* This class demonstrates how to update a datasource to change its name in the MC UI. It also
* demonstrates how to update a primary datasource to add supplemental datasources to its default
* rule (https://support.google.com/merchants/answer/7450276).
*/
public class UpdateDataSourceSample {
public static String updateDataSource(Config config, String displayName, String dataSourceId)
throws Exception {
GoogleCredentials credential = new Authenticator().authenticate();
DataSourcesServiceSettings dataSourcesServiceSettings =
DataSourcesServiceSettings.newBuilder()
.setCredentialsProvider(FixedCredentialsProvider.create(credential))
.build();
// Creates datasource name to identify datasource.
String name =
DataSourceName.newBuilder()
.setAccount(config.getAccountId().toString())
.setDatasource(dataSourceId)
.build()
.toString();
DataSource dataSource =
DataSource.newBuilder()
// Update the datasource to have the new display name
.setDisplayName(displayName)
.setName(name)
.build();
FieldMask fieldMask = FieldMask.newBuilder().addPaths("display_name").build();
try (DataSourcesServiceClient dataSourcesServiceClient =
DataSourcesServiceClient.create(dataSourcesServiceSettings)) {
UpdateDataSourceRequest request =
UpdateDataSourceRequest.newBuilder()
.setDataSource(dataSource)
.setUpdateMask(fieldMask)
.build();
System.out.println("Sending Update DataSource request");
DataSource response = dataSourcesServiceClient.updateDataSource(request);
System.out.println("Updated DataSource Name below");
System.out.println(response.getName());
return response.getName();
} catch (Exception e) {
System.out.println(e);
System.exit(1);
return null;
}
}
public String updateDataSource(
Config config,
String primaryDataSourceName,
String firstSupplementalDataSourceName,
String secondSupplementalDataSourceName)
throws Exception {
GoogleCredentials credential = new Authenticator().authenticate();
DataSourcesServiceSettings dataSourcesServiceSettings =
DataSourcesServiceSettings.newBuilder()
.setCredentialsProvider(FixedCredentialsProvider.create(credential))
.build();
// Setting self to 'true' refers to the primary datasource itself.
DataSourceReference dataSourceReferenceSelf =
DataSourceReference.newBuilder().setSelf(true).build();
DataSourceReference firstSupplementalDataSourceReference =
DataSourceReference.newBuilder()
.setSupplementalDataSourceName(firstSupplementalDataSourceName)
.build();
DataSourceReference secondSupplementalDataSourceReference =
DataSourceReference.newBuilder()
.setSupplementalDataSourceName(secondSupplementalDataSourceName)
.build();
// The attributes will first be taken from the primary DataSource.
// Then the first supplemental DataSource if the attribute is not in the primary DataSource
// And finally the second supplemental DataSource if not in the first two DataSources.
// Note that CustomRules could change the behavior of how updates are applied.
DefaultRule defaultRule =
DefaultRule.newBuilder()
.addTakeFromDataSources(dataSourceReferenceSelf)
.addTakeFromDataSources(firstSupplementalDataSourceReference)
.addTakeFromDataSources(secondSupplementalDataSourceReference)
.build();
// The type of data that this datasource will receive.
PrimaryProductDataSource primaryProductDataSource =
PrimaryProductDataSource.newBuilder().setDefaultRule(defaultRule).build();
DataSource dataSource =
DataSource.newBuilder()
// Update the primary datasource to have the default rule datasources in the correct
// order.
.setPrimaryProductDataSource(primaryProductDataSource)
.setName(primaryDataSourceName)
.build();
// The '.' signifies a nested field.
FieldMask fieldMask =
FieldMask.newBuilder().addPaths("primary_product_data_source.default_rule").build();
try (DataSourcesServiceClient dataSourcesServiceClient =
DataSourcesServiceClient.create(dataSourcesServiceSettings)) {
UpdateDataSourceRequest request =
UpdateDataSourceRequest.newBuilder()
.setDataSource(dataSource)
.setUpdateMask(fieldMask)
.build();
System.out.println("Sending Update DataSource request");
DataSource response = dataSourcesServiceClient.updateDataSource(request);
System.out.println("Updated DataSource Name below");
System.out.println(response.getName());
return response.getName();
} catch (Exception e) {
System.out.println(e);
System.exit(1);
return null;
}
}
public static void main(String[] args) throws Exception {
Config config = Config.load();
// The updated displayed datasource name in the Merchant Center UI.
String displayName = "Great Britain Primary Product Data";
// The ID of the datasource to update
String dataSourceId = "11111111"; // Replace with your datasource ID.
updateDataSource(config, displayName, dataSourceId);
}
}
PHP
use Google\ApiCore\ApiException;
use Google\Protobuf\FieldMask;
use Google\Shopping\Merchant\DataSources\V1\Client\DataSourcesServiceClient;
use Google\Shopping\Merchant\DataSources\V1\DataSource;
use Google\Shopping\Merchant\DataSources\V1\UpdateDataSourceRequest;
/**
* Class to demonstrate updating a datasource to change its name in the MC UI.
*/
class UpdateDataSourceSample
{
// ENSURE you fill in the datasource ID for the sample to work.
private const DATASOURCE_ID = 'INSERT_DATASOURCE_ID';
/**
* Updates a DataSource.
*
* @param int $merchantId The Merchant Center Account ID.
* @param string $displayName The new display name of the data source.
* @param string $dataSourceId The data source ID.
* @return string The name of the updated data source.
*/
public function updateDataSource(int $merchantId, string $displayName, string $dataSourceId): string
{
// 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 client.
$dataSourcesServiceClient = new DataSourcesServiceClient($options);
// Creates the data source name.
$name = sprintf('accounts/%s/dataSources/%s', $merchantId, $dataSourceId);
// Creates the data source.
$dataSource = (new DataSource())
->setDisplayName($displayName)
->setName($name);
// Creates a FieldMask to specify which fields to update.
$updateMask = new FieldMask([
'paths' => ['display_name']
]);
// Creates the request.
$request = (new UpdateDataSourceRequest())
->setDataSource($dataSource)
->setUpdateMask($updateMask);
print('Sending Update DataSource request' . PHP_EOL);
// Calls the API and catches and prints any network failures/errors.
try {
$response = $dataSourcesServiceClient->updateDataSource($request);
print('Updated DataSource Name below' . PHP_EOL);
print($response->getName() . PHP_EOL);
return $response->getName();
} catch (ApiException $ex) {
print('Call failed with message: ' . $ex->getMessage() . PHP_EOL);
return '';
}
}
// Helper to execute the sample.
public function callSample(): void
{
$config = Config::generateConfig();
// The Merchant Center Account ID.
$merchantId = $config['accountId'];
// The updated displayed datasource name in the Merchant Center UI.
$displayName = 'new name';
self::updateDataSource($merchantId, $displayName, self::DATASOURCE_ID);
}
}
$sample = new UpdateDataSourceSample();
$sample->callSample();
Python
from examples.authentication import configuration
from examples.authentication import generate_user_credentials
from google.protobuf import field_mask_pb2
from google.shopping import merchant_datasources_v1
# ENSURE you fill in the datasource ID for the sample to
# work.
_ACCOUNT = configuration.Configuration().read_merchant_info()
# An ID automatically assigned to the datasource after creation by Google.
_DATASOURCE = "[INSERT_DATASOURCE_HERE]"
_NAME = f"accounts/{_ACCOUNT}/dataSources/{_DATASOURCE}"
def update_data_source():
"""Updates the specified `DataSource` resource."""
# Gets OAuth Credentials.
credentials = generate_user_credentials.main()
# Creates a client.
client = merchant_datasources_v1.DataSourcesServiceClient(
credentials=credentials
)
# Creates a DataSource and populates its attributes.
data_source = merchant_datasources_v1.DataSource()
data_source.name = _NAME # To identify the data source to update.
data_source.display_name = "Example DataSource 2"
# Sets field mask to include only the fields you want to update.
field_mask = field_mask_pb2.FieldMask(paths=["display_name"])
# Creates the request.
request = merchant_datasources_v1.UpdateDataSourceRequest(
data_source=data_source, update_mask=field_mask
)
# Makes the request and catch and print any error messages.
try:
client.update_data_source(request=request)
print("Update successful")
except RuntimeError as e:
print("Update failed")
print(e)
if __name__ == "__main__":
update_data_source()
cURL
curl -X PATCH \
"https://merchantapi.googleapis.com/datasources/v1/accounts/{ACCOUNT_ID}/dataSources/{DATASOURCE_ID}?updateMask=displayName" \
-H "Authorization: Bearer {API_TOKEN}" \
-H "Content-Type: application/json" \
-d '{
"name": "accounts/{ACCOUNT_ID}/dataSources/{DATASOURCE_ID}",
"displayName": "Updated API Primary Source Name"
}'
حذف مصدر بيانات
لإزالة مصدر بيانات من حسابك على Merchant Center، استخدِم الطريقة
dataSources.delete. إذا كان مصدر بيانات تكميلي مرتبطًا بأي مصدر بيانات أساسي، لن تتمكّن من حذفه إلا بعد إزالة جميع الروابط المؤدية إليه.
DELETE https://merchantapi.googleapis.com/datasources/v1/accounts/{ACCOUNT_ID}/dataSources/{DATASOURCE_ID}
تؤدي عملية الحذف الناجحة إلى عرض ردّ فارغ.
توضّح عيّنات التعليمات البرمجية التالية كيفية استخدام طريقة delete لحذف مصدر بيانات.
جافا
import com.google.api.gax.core.FixedCredentialsProvider;
import com.google.auth.oauth2.GoogleCredentials;
import com.google.shopping.merchant.datasources.v1.DataSourceName;
import com.google.shopping.merchant.datasources.v1.DataSourcesServiceClient;
import com.google.shopping.merchant.datasources.v1.DataSourcesServiceSettings;
import com.google.shopping.merchant.datasources.v1.DeleteDataSourceRequest;
import shopping.merchant.samples.utils.Authenticator;
import shopping.merchant.samples.utils.Config;
/** This class demonstrates how to delete a datasource. */
public class DeleteDataSourceSample {
public static void deleteDataSource(Config config, String dataSourceId) throws Exception {
GoogleCredentials credential = new Authenticator().authenticate();
DataSourcesServiceSettings dataSourcesServiceSettings =
DataSourcesServiceSettings.newBuilder()
.setCredentialsProvider(FixedCredentialsProvider.create(credential))
.build();
String name =
DataSourceName.newBuilder()
.setAccount(config.getAccountId().toString())
.setDatasource(dataSourceId)
.build()
.toString();
try (DataSourcesServiceClient dataSourcesServiceClient =
DataSourcesServiceClient.create(dataSourcesServiceSettings)) {
DeleteDataSourceRequest request = DeleteDataSourceRequest.newBuilder().setName(name).build();
System.out.println("Sending deleteDataSource request");
// Delete works for any datasource type.
// If Type "Supplemental", delete will only work if it's not linked to any primary feed.
// If a link exists and the Type is "Supplemental", you will need to remove the supplemental
// feed from the default and/or custom rule(s) of any primary feed(s) that references it. Then
// retry the delete.
dataSourcesServiceClient.deleteDataSource(request); // No response returned on success.
System.out.println(
"Delete successful, note that it may take a few minutes for the delete to update in"
+ " the system.");
}
}
public static void main(String[] args) throws Exception {
Config config = Config.load();
// An ID automatically assigned to the datasource after creation by Google.
String dataSourceId = "1111111111"; // Replace with your datasource ID.
deleteDataSource(config, dataSourceId);
}
}
PHP
use Google\ApiCore\ApiException;
use Google\Shopping\Merchant\DataSources\V1\Client\DataSourcesServiceClient;
use Google\Shopping\Merchant\DataSources\V1\DeleteDataSourceRequest;
/**
* Class to demonstrate deleting a datasource.
*/
class DeleteDataSourceSample
{
// ENSURE you fill in the datasource ID for the sample to work.
private const DATASOURCE_ID = 'INSERT_DATASOURCE_ID';
/**
* Deletes a DataSource.
*
* @param int $merchantId The Merchant Center Account ID.
* @param string $dataSourceId The data source ID.
*/
public function deleteDataSource(int $merchantId, 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 client.
$dataSourcesServiceClient = new DataSourcesServiceClient($options);
// Creates the data source name.
$name = sprintf('accounts/%s/dataSources/%s', $merchantId, $dataSourceId);
// Creates the request.
$request = (new DeleteDataSourceRequest())
->setName($name);
print('Sending deleteDataSource request' . PHP_EOL);
// Calls the API and catches and prints any network failures/errors.
try {
$dataSourcesServiceClient->deleteDataSource($request);
print('Delete successful, note that it may take a few minutes for the delete to update in the system.' . PHP_EOL);
} catch (ApiException $ex) {
print('Call failed with message: ' . $ex->getMessage() . PHP_EOL);
}
}
// Helper to execute the sample.
public function callSample(): void
{
$config = Config::generateConfig();
// The Merchant Center Account ID.
$merchantId = $config['accountId'];
self::deleteDataSource($merchantId, self::DATASOURCE_ID);
}
}
$sample = new DeleteDataSourceSample();
$sample->callSample();
Python
from examples.authentication import configuration
from examples.authentication import generate_user_credentials
from google.shopping import merchant_datasources_v1
def delete_data_source(account_id: str, datasource_id: str):
"""Deletes the specified `DataSource` resource.
Delete works for any datasource type.
If Type "Supplemental", delete will only work if it's not linked to any
primary feed. If a link exists and the Type is "Supplemental", you will need
to remove the supplemental feed from the default and/or custom rule(s) of any
primary feed(s) that references it. Then retry the delete.
Args:
account_id: The Merchant Center account ID.
datasource_id: The ID of the data source to delete.
"""
# Gets OAuth Credentials.
credentials = generate_user_credentials.main()
# Creates a client.
client = merchant_datasources_v1.DataSourcesServiceClient(
credentials=credentials
)
name = f"accounts/{account_id}/dataSources/{datasource_id}"
# Creates the request.
request = merchant_datasources_v1.DeleteDataSourceRequest(name=name)
# Makes the request and catches and prints any error messages.
try:
# No response is returned on request.
client.delete_data_source(request=request)
print("Deletion successful")
except RuntimeError as e:
print("Deletion failed")
print(e)
raise
if __name__ == "__main__":
# Retrieves the Merchant Center account ID from the configuration file.
merchant_account_id = configuration.Configuration().read_merchant_info()
# ENSURE you fill in the datasource ID for the sample to
# work.
# An ID automatically assigned to the datasource after creation by Google.
target_datasource = "[INSERT_DATASOURCE_HERE]"
delete_data_source(merchant_account_id, target_datasource)
cURL
curl -X DELETE \
"https://merchantapi.googleapis.com/datasources/v1/accounts/{ACCOUNT_ID}/dataSources/{DATASOURCE_ID}" \
-H "Authorization: Bearer {API_TOKEN}" \