لإنشاء إضافات المواقع الجغرافية على "إعلانات Google"، عليك إنشاء ملف تجاري وملئه بعناوين جميع المواقع الجغرافية لنشاطك التجاري. وبعد ذلك، اربط الملف التجاري بخلاصة إضافات المواقع لإنشاء إضافات المواقع.
الملف التجاري على Google
الملف التجاري هو المستودع المركزي لمواقع نشاطك التجاري في جميع منتجات Google. ولا داعي للقلق بشأن مزامنة المواقع الجغرافية في ملفك التجاري وإضافات المواقع الجغرافية في "إعلانات Google". ما عليك سوى إجراء إعداد لمرة واحدة لعناصر الخلاصة المطلوبة لك. سيحافظ إعلانات Google تلقائيًا على مزامنة إضافات المواقع مع أحدث البيانات من ملفك التجاري.
تتوفّر طريقتان لإنشاء مواقع جغرافية في "الملف التجاري".
- يمكنك استخدام واجهة مستخدم الملف التجاري لإنشاء مواقعك الجغرافية. إذا اتبعت هذا الأسلوب، يمكنك الانتقال مباشرةً إلى ربط المواقع بإعلاناتك باستخدام إعلانات Google API.
- يمكنك استخدام واجهة برمجة تطبيقات الملف التجاري لإنشاء مواقع جغرافية للنشاط التجاري آليًا.
العمل مع واجهة برمجة تطبيقات الملف التجاري
لبدء استخدام Business Profile API، انتقِل إلى صفحتها الرئيسية. نوصي باستخدام حسابات الأنشطة التجارية بدلاً من الحسابات الشخصية للمواقع المرتبطة ببرنامج إعلانات Google. وباستخدام حساب نشاط تجاري، يمكنك مشاركة إمكانية الوصول مع مستخدمين آخرين بدون الحاجة إلى مشاركة تفاصيل حسابك الشخصي.
لإنشاء مواقع جغرافية للنشاط التجاري برمجيًا باستخدام Business Profile API،
ابدأ من خلال تنزيل مكتبة العميل. اتبع دليل الإعداد الأساسي لإنشاء بيانات اعتماد OAuth للعمل مع واجهة برمجة تطبيقات الملف التجاري.
استخدِم واجهة برمجة تطبيقات الملف التجاري لإدراج جميع الحسابات التي تملكها أو لديك حقوق الإدارة فيها. اختَر الحساب الذي تريد استخدامه.
استخدِم واجهة برمجة تطبيقات الملف التجاري من أجل إنشاء المواقع الجغرافية.
إنشاء خلاصة إضافات مواقع جديدة مرتبطة بملفك التجاري
لإنشاء خلاصة إضافات مواقع جديدة، ابدأ بإنشاء كائن
Feed
. عليك تنفيذ عملية FeedService.MutateFeeds
create
لإنشاء الخلاصة. يتم عرض مقتطف الشفرة أدناه.
لغة Java
// Creates a feed that will sync to the Business Profile account. Do not add FeedAttributes to // this object as Google Ads will add them automatically because this will be a system generated // feed. Feed.Builder businessProfileFeed = Feed.newBuilder() .setName("Business Profile feed #" + getPrintableDateTime()) // Configures the location feed populated from Business Profile Locations. .setPlacesLocationFeedData(placesLocationFeedData) // Since this feed's feed items will be managed by Google, // you must set its origin to GOOGLE. .setOrigin(FeedOrigin.GOOGLE); FeedOperation operation = FeedOperation.newBuilder().setCreate(businessProfileFeed).build();
C#
private static string CreateBusinessProfileFeed(GoogleAdsClient client, long customerId, string businessProfileEmailAddress, string businessAccountId, string businessProfileAccessToken) { // Optional: Delete all existing location extension feeds. This is an optional step, // and is required for this code example to run correctly more than once. // 1. Google Ads only allows one location extension feed per email address. // 2. A Google Ads account cannot have a location extension feed and an affiliate // location extension feed at the same time. DeleteLocationExtensionFeeds(client, customerId); // Get the FeedServiceClient. FeedServiceClient feedService = client.GetService(Services.V13.FeedService); // Creates a feed that will sync to the Business Profile account specified by // businessProfileEmailAddress. Do not add FeedAttributes to this object as Google Ads // will add them automatically because this will be a system generated feed. Feed businessProfileFeed = new Feed() { Name = "Business Profile feed #" + ExampleUtilities.GetRandomString(), PlacesLocationFeedData = new PlacesLocationFeedData() { EmailAddress = businessProfileEmailAddress, // If the EmailAddress is for a Business Profile manager instead of the // Business Profile account owner, then set BusinessAccountId to the Google+ // Page ID of a location for which the manager has access. This information is // available through the Business Profile API. See // https://developers.google.com/my-business/reference/rest/v4/accounts.locations#locationkey // for details. BusinessAccountId = string.IsNullOrEmpty(businessAccountId) ? null : businessAccountId, // Used to filter Business Profile listings by labels. If entries exist in // label_filters, only listings that have at least one of the labels set are // candidates to be synchronized into FeedItems. If no entries exist in // label_filters, then all listings are candidates for syncing. LabelFilters = { "Stores in New York" }, // Sets the authentication info to be able to connect Google Ads to the // Business Profile account. OauthInfo = new OAuthInfo() { HttpMethod = "GET", HttpRequestUrl = GOOGLE_ADS_SCOPE, HttpAuthorizationHeader = $"Bearer {businessProfileAccessToken}" }, }, // Since this feed's feed items will be managed by Google, // you must set its origin to GOOGLE. Origin = FeedOrigin.Google }; FeedOperation operation = new FeedOperation() { Create = businessProfileFeed }; // Adds the feed. MutateFeedsResponse response = feedService.MutateFeeds(customerId.ToString(), new[] { operation }); // Displays the results. string businessProfileFeedResourceName = response.Results[0].ResourceName; Console.WriteLine($"Business Profile feed created with resource name: " + $"{businessProfileFeedResourceName}."); return businessProfileFeedResourceName; }
لغة PHP
private static function createFeed( GoogleAdsClient $googleAdsClient, int $customerId, string $businessProfileEmail, string $businessProfileAccessToken, string $businessAccountIdentifier ) { $businessProfileFeed = new Feed([ 'name' => 'Business Profile feed #' . Helper::getPrintableDatetime(), 'origin' => FeedOrigin::GOOGLE, 'places_location_feed_data' => new PlacesLocationFeedData([ 'email_address' => $businessProfileEmail, 'business_account_id' => $businessAccountIdentifier, // Used to filter Business Profile listings by labels. If entries exist in // label_filters, only listings that have at least one of the labels set are // candidates to be synchronized into FeedItems. If no entries exist in // label_filters, then all listings are candidates for syncing. 'label_filters' => ['Stores in New York'], // Sets the authentication info to be able to connect Google Ads to the Business // Profile account. 'oauth_info' => new OAuthInfo([ 'http_method' => 'GET', 'http_request_url' => self::GOOGLE_ADS_SCOPE, 'http_authorization_header' => 'Bearer ' . $businessProfileAccessToken ]) ]) ]); // Creates a feed operation. $feedOperation = new FeedOperation(); $feedOperation->setCreate($businessProfileFeed); // Issues a mutate request to add the feed and print its information. // Since it is a system generated feed, Google Ads will automatically: // 1. Set up the feed attributes on the feed. // 2. Set up a feed mapping that associates the feed attributes of the feed with the // placeholder fields of the LOCATION placeholder type. $feedServiceClient = $googleAdsClient->getFeedServiceClient(); $response = $feedServiceClient->mutateFeeds( $customerId, [$feedOperation] ); $businessProfileFeedResourceName = $response->getResults()[0]->getResourceName(); printf( "Business Profile feed created with resource name: '%s'.%s", $businessProfileFeedResourceName, PHP_EOL ); return $businessProfileFeedResourceName; }
لغة Python
feed_operation = client.get_type("FeedOperation") business_profile_feed = feed_operation.create business_profile_feed.name = f"Business Profile Feed #{uuid4()}" # Configure the location feed populated from Business Profile Locations. business_profile_feed.places_location_feed_data.email_address = ( business_profile_email ) if business_account_id is not None: business_profile_feed.places_location_feed_data.business_account_id = ( business_account_id ) # Used to filter Business Profile listings by labels. If entries exist in # label_filters, only listings that have at least one of the labels set are # candidates to be synchronized into FeedItems. If no entries exist in # label_filters, then all listings are candidates for syncing. business_profile_feed.places_location_feed_data.label_filters.append( "Stores in New York" ) # Set the authentication info to be able to connect Google Ads to the # Business Profile account. business_profile_feed.places_location_feed_data.oauth_info.http_method = ( "GET" ) business_profile_feed.places_location_feed_data.oauth_info.http_request_url = ( DEFAULT_OAUTH2_SCOPE ) business_profile_feed.places_location_feed_data.oauth_info.http_authorization_header = ( f"Bearer {business_profile_access_token}" ) # Since this feed's feed items will be managed by Google, you must set its # origin to GOOGLE. business_profile_feed.origin = client.enums.FeedOriginEnum.GOOGLE # Optional: Delete all existing location extension feeds. This is an # optional step, and is required for this code example to run correctly # more than once; Google Ads only allows one location extension feed # per email address, and a Google Ads account cannot have a location # extension feed and an affiliate location extension feed at the same # time. delete_location_extension_feeds(client, customer_id) # Add the feed. Since it is a system generated feed, Google Ads will # automatically: # 1. Set up the FeedAttributes on the feed. # 2. Set up a FeedMapping that associates the FeedAttributes of the feed # with the placeholder fields of the LOCATION placeholder type. feed_response = feed_service.mutate_feeds( customer_id=customer_id, operations=[feed_operation] ) feed_resource_name = feed_response.results[0].resource_name print( "Business Profile feed created with resource name " f"'{feed_resource_name}'." )
Ruby
def create_feed( client, customer_id, business_profile_email_address, business_profile_access_token, business_account_identifier) # Creates a feed operation. operation = client.operation.create_resource.feed do |feed| feed.name = "Business Profile feed #{(Time.new.to_f * 1000).to_i}" feed.origin = :GOOGLE feed.places_location_feed_data = client.resource.places_location_feed_data do |data| data.email_address = business_profile_email_address data.business_account_id = business_account_identifier data.label_filters << "Stores in New York" data.oauth_info = client.resource.o_auth_info do |oauth| oauth.http_method = "GET" oauth.http_request_url = "https://www.googleapis.com/auth/adwords" oauth.http_authorization_header = "Bearer #{business_profile_access_token}" end end end # Issues a mutate request to add the feed and print its information. # Since it is a system generated feed, Google Ads will automatically: # 1. Set up the feed attributes on the feed. # 2. Set up a feed mapping that associates the feed attributes of the feed with the # placeholder fields of the LOCATION placeholder type. response = client.service.feed.mutate_feeds( customer_id: customer_id, operations: [operation], ) # Prints out the Business Profile feed resource name. business_profile_feed_resource_name = response.results.first.resource_name puts "Business Profile feed created with resource name: #{business_profile_feed_resource_name}" business_profile_feed_resource_name end
Perl
# Create a feed that will sync to the Business Profile account specified by # $business_profile_email. Do not add FeedAttributes to this object as Google Ads # will add them automatically because this will be a system generated feed. my $business_profile_feed = Google::Ads::GoogleAds::V13::Resources::Feed->new( { name => "Business Profile feed #" . uniqid(), # Configure the location feed populated from Business Profile Locations. placesLocationFeedData => Google::Ads::GoogleAds::V13::Resources::PlacesLocationFeedData->new({ emailAddress => $business_profile_email, businessAccountId => $business_profile_account_id, # Used to filter Business Profile listings by labels. If entries exist in # label_filters, only listings that have at least one of the labels set are # candidates to be synchronized into FeedItems. If no entries exist in # label_filters, then all listings are candidates for syncing. labelFilters => ["Stores in New York"], # Set the authentication info to be able to connect Google Ads to the # Business Profile account. oauthInfo => Google::Ads::GoogleAds::V13::Resources::OAuthInfo->new({ httpMethod => "GET", httpRequestUrl => Google::Ads::GoogleAds::Constants::DEFAULT_OAUTH2_SCOPE, httpAuthorizationHeader => "Bearer " . $business_profile_access_token })} ), # Since this feed's feed items will be managed by Google, you must set its # origin to GOOGLE. origin => GOOGLE });
يلزمك ملء الحقول التالية التي تخص خلاصات إضافات المواقع:
السمة | مطلوب | الوصف |
---|---|---|
origin |
متوافق | بما أن خلاصة إضافات المواقع يتم إنشاؤها من قِبل النظام، عليك ضبط الحقل origin على GOOGLE .
|
attributes |
لا | لا تحدِّد أي سمة attributes
للخلاصة. وستُنشئ "إعلانات Google" هذه الإعلانات تلقائيًا لك لأنها خلاصة من إنشاء النظام.
|
places_location_feed_data |
متوافق | إنّ ضبط السمة places_location_feed_data
على كائن PlacesLocationFeedData
في خلاصتك يطلب من "إعلانات Google" إجراء ما يلي:
|
سمات PlacesLocationFeedData
السمة | مطلوب | الوصف |
---|---|---|
email_address |
متوافق | عنوان البريد الإلكتروني لمالك النشاط التجاري أو أحد مديريه يجب أن يتطابق هذا مع عنوان البريد الإلكتروني المقدَّم في
oauth_info . |
oauth_info |
نعم | معلومات OAuth2 التي تمنح حسابك على "إعلانات Google" حق الوصول إلى ملفك التجاري. إذا لم تكن على دراية ببروتوكول OAuth2، يمكنك الاطّلاع على دليل المصادقة أولاً. |
business_account_id |
لا | رقم تعريف الحساب للنشاط التجاري المُدار الذي سيتم استخدام مواقعه الجغرافية.
إذا كنت تستخدم واجهة برمجة تطبيقات الملف التجاري، يمكنك الحصول على هذا المعرّف من الجزء account_id من name في
Account . ويمكنك أيضًا نسخ الجزء LOCATION_GROUP_ID من القسم معلومات مجموعة المواقع الجغرافية في مجموعة المواقع الجغرافية المحدّدة.
|
business_name_filter |
لا | اسم النشاط التجاري المطلوب مزامنته مع "إعلانات Google". |
category_filters |
لا | فئات بطاقات البيانات المراد مزامنتها مع إعلانات Google. |
label_filters |
لا | تصنيفات بطاقات البيانات المراد مزامنتها مع إعلانات Google. |
oauth_info لـ PlacesLocationFeedData
السمة | القيمة | الوصف |
---|---|---|
http_method |
GET |
طريقة HTTP للحصول على معلومات التفويض. |
http_request_url |
https://www.googleapis.com/auth/adwords |
نطاق OAuth الذي تستخدمه واجهة برمجة التطبيقات مع "إعلانات Google" لتفويض طلباتك إلى ملف تجاري. |
http_authorization_header |
Bearer OAUTH_ACCESS_TOKEN |
عنوان التفويض الذي يحتوي على رمز دخول OAuth المميز الذي يمنح
حسابك على "إعلانات Google" إذنًا بالقراءة من حسابك على
ملفك التجاري. بدلاً من OAUTH_ACCESS_TOKEN ، يمكنك استبدال رمز دخول تم إنشاؤه من بيانات اعتماد OAuth بـ http_request_url لـ PlacesLocationFeedData ونطاق يطابق http_request_url . |
يُرجى الانتظار إلى أن تصبح الخلاصة جاهزة.
بعد إنشاء Feed
، سينشئ "إعلانات Google" سمتَي الخلاصة وFeedMapping
. وبعد ذلك، ستتم
تعبئة محتوى الخلاصة من خلال إنشاء
كائنات FeedItem
التي تتوافق مع المواقع الجغرافية
في الملف التجاري.
عليك الانتظار حتى يتم إنشاء FeedMapping
للتأكّد من إعداد الخلاصة بشكل صحيح ومن إمكانية استخدامها في الخطوات التالية. ويمكن تنفيذ ذلك من خلال محاولة استرداد
FeedMapping
للخلاصة ذات الصلة التي تتضمّن
placeholder_type
ما يعادل
LOCATION
.
لغة Java
try (FeedServiceClient feedServiceClient = googleAdsClient.getLatestVersion().createFeedServiceClient()) { // Adds the feed. Since it is a system generated feed, Google Ads will automatically: // 1. Set up the FeedAttributes on the feed. // 2. Set up a FeedMapping that associates the FeedAttributes of the feed // with the placeholder fields of the LOCATION placeholder type. MutateFeedsResponse response = feedServiceClient.mutateFeeds(Long.toString(customerId), ImmutableList.of(operation)); String businessProfileFeedResourceName = response.getResults(0).getResourceName(); System.out.printf( "Business Profile feed created with resource name: %s%n", businessProfileFeedResourceName);
C#
private static FeedMapping GetBusinessProfileFeedMapping(GoogleAdsClient client, long customerId, string businessProfileFeedResourceName) { // Get the GoogleAdsService. GoogleAdsServiceClient googleAdsService = client.GetService( Services.V13.GoogleAdsService); // Create the query. string query = $"SELECT feed_mapping.resource_name, feed_mapping.status FROM " + $"feed_mapping WHERE feed_mapping.feed = '{businessProfileFeedResourceName}' and " + $"feed_mapping.status = ENABLED and feed_mapping.placeholder_type = LOCATION" + $" LIMIT 1"; // Issue a search request. PagedEnumerable<SearchGoogleAdsResponse, GoogleAdsRow> result = googleAdsService.Search(customerId.ToString(), query); // Display the results. GoogleAdsRow googleAdsRow = result.FirstOrDefault(); return (googleAdsRow == null) ? null : googleAdsRow.FeedMapping; }
لغة PHP
// Issues a mutate request to add the feed and print its information. // Since it is a system generated feed, Google Ads will automatically: // 1. Set up the feed attributes on the feed. // 2. Set up a feed mapping that associates the feed attributes of the feed with the // placeholder fields of the LOCATION placeholder type. $feedServiceClient = $googleAdsClient->getFeedServiceClient(); $response = $feedServiceClient->mutateFeeds( $customerId, [$feedOperation] ); $businessProfileFeedResourceName = $response->getResults()[0]->getResourceName(); printf( "Business Profile feed created with resource name: '%s'.%s", $businessProfileFeedResourceName, PHP_EOL ); return $businessProfileFeedResourceName;
لغة Python
# Add the feed. Since it is a system generated feed, Google Ads will # automatically: # 1. Set up the FeedAttributes on the feed. # 2. Set up a FeedMapping that associates the FeedAttributes of the feed # with the placeholder fields of the LOCATION placeholder type. feed_response = feed_service.mutate_feeds( customer_id=customer_id, operations=[feed_operation] ) feed_resource_name = feed_response.results[0].resource_name print( "Business Profile feed created with resource name " f"'{feed_resource_name}'." )
Ruby
# Issues a mutate request to add the feed and print its information. # Since it is a system generated feed, Google Ads will automatically: # 1. Set up the feed attributes on the feed. # 2. Set up a feed mapping that associates the feed attributes of the feed with the # placeholder fields of the LOCATION placeholder type. response = client.service.feed.mutate_feeds( customer_id: customer_id, operations: [operation], ) # Prints out the Business Profile feed resource name. business_profile_feed_resource_name = response.results.first.resource_name puts "Business Profile feed created with resource name: #{business_profile_feed_resource_name}" business_profile_feed_resource_name
Perl
# Add the feed. Since it is a system generated feed, Google Ads will automatically: # 1. Set up the FeedAttributes on the feed. # 2. Set up a FeedMapping that associates the FeedAttributes of the feed with the # placeholder fields of the LOCATION placeholder type. my $feeds_response = $api_client->FeedService()->mutate({ customerId => $customer_id, operations => [$feed_operation]}); my $feed_resource_name = $feeds_response->{results}[0]{resourceName}; printf "Business Profile feed created with resource name: '%s'.\n", $feed_resource_name;
إذا لم تكن FeedMapping
متاحة حتى الآن، يمكنك إعادة محاولة
إجراء المكالمات باستخدام سياسة تراجع أسي إلى أن تصبح
Feed
جاهزة.
لغة Java
try (CustomerFeedServiceClient customerFeedServiceClient = googleAdsClient.getLatestVersion().createCustomerFeedServiceClient()) { // After the completion of the Feed ADD operation above the added feed will not be available // for usage in a CustomerFeed until the sync between the Google Ads and Business Profile // accounts // completes. The loop below will retry adding the CustomerFeed up to ten times with an // exponential back-off policy. String addedCustomerFeed = null; int numberOfAttempts = 0; do { numberOfAttempts++; try { MutateCustomerFeedsResponse customerFeedsResponse = customerFeedServiceClient.mutateCustomerFeeds( Long.toString(customerId), ImmutableList.of(customerFeedOperation)); addedCustomerFeed = customerFeedsResponse.getResults(0).getResourceName(); System.out.printf("Customer feed created with resource name: %s%n", addedCustomerFeed); } catch (GoogleAdsException gae) { // Waits using exponential backoff policy. long sleepSeconds = (long) Math.scalb(5, numberOfAttempts); // Exits the loop early if sleepSeconds grows too large in the event that // MAX_CUSTOMER_FEED_ADD_ATTEMPTS is set too high. if (sleepSeconds > (long) Math.scalb(5, 10)) { break; } System.out.printf( "Attempt #%d to add the CustomerFeed was not successful. " + "Waiting %d seconds before trying again.%n", numberOfAttempts, sleepSeconds); Thread.sleep(sleepSeconds * 1000); } } while (numberOfAttempts < MAX_CUSTOMER_FEED_ADD_ATTEMPTS && addedCustomerFeed == null);
C#
private static void WaitForBusinessProfileFeedToBeReady(GoogleAdsClient client, long customerId, string businessProfileFeedResourceName) { int numAttempts = 0; while (numAttempts < MAX_FEEDMAPPING_RETRIEVAL_ATTEMPTS) { // Once you create a feed, Google's servers will setup the feed by creating feed // attributes and feedmapping. Once the feedmapping is created, it is ready to be // used for creating customer feed. // This process is asynchronous, so we wait until the feed mapping is created, // peforming exponential backoff. FeedMapping feedMapping = GetBusinessProfileFeedMapping(client, customerId, businessProfileFeedResourceName); if (feedMapping == null) { numAttempts++; int sleepSeconds = (int)(5 * Math.Pow(2, numAttempts)); Console.WriteLine($"Checked: #{numAttempts} time(s). Business Profile feed " + $"is not ready yet. Waiting {sleepSeconds} seconds before trying again."); Thread.Sleep(sleepSeconds * 1000); } else { Console.WriteLine($"Business Profile Feed {businessProfileFeedResourceName} " + $"is now ready."); return; } } throw new RpcException(new Status(StatusCode.DeadlineExceeded, $"Business Profile Feed is not ready after {MAX_FEEDMAPPING_RETRIEVAL_ATTEMPTS} " + $"retries.")); }
لغة PHP
// After the completion of the feed ADD operation above the added feed will not be available // for usage in a customer feed until the sync between the Google Ads and Business Profile // accounts completes. The loop below will retry adding the customer feed up to ten times // with an exponential back-off policy. $numberOfAttempts = 0; $addedCustomerFeed = null; $customerFeedServiceClient = $googleAdsClient->getCustomerFeedServiceClient(); do { $numberOfAttempts++; try { // Issues a mutate request to add a customer feed and print its information if the // request succeeded. $addedCustomerFeed = $customerFeedServiceClient->mutateCustomerFeeds( $customerId, [$customerFeedOperation] ); printf( "Customer feed created with resource name: '%s'.%s", $addedCustomerFeed->getResults()[0]->getResourceName(), PHP_EOL ); } catch (GoogleAdsException $googleAdsException) { // Waits using exponential backoff policy. $sleepSeconds = self::POLL_FREQUENCY_SECONDS * pow(2, $numberOfAttempts); // Exits the loop early if $sleepSeconds grows too large in the event that // MAX_CUSTOMER_FEED_ADD_ATTEMPTS is set too high. if ( $sleepSeconds > self::POLL_FREQUENCY_SECONDS * pow(2, self::MAX_CUSTOMER_FEED_ADD_ATTEMPTS) ) { break; } printf( "Attempt #%d to add the customer feed was not successful." . " Waiting %d seconds before trying again.%s", $numberOfAttempts, $sleepSeconds, PHP_EOL ); sleep($sleepSeconds); } } while ( $numberOfAttempts < self::MAX_CUSTOMER_FEED_ADD_ATTEMPTS && is_null($addedCustomerFeed) );
لغة Python
# Create a CustomerFeed operation and configure the CustomerFeed to # associate the feed with this customer for the LOCATION placeholder # type. # OPTIONAL: Create a CampaignFeed to specify which FeedItems to use at # the Campaign level. # OPTIONAL: Create an AdGroupFeed for even more fine grained control # over which feed items are used at the AdGroup level. customer_feed_operation = client.get_type("CustomerFeedOperation") customer_feed = customer_feed_operation.create customer_feed.feed = feed_resource_name customer_feed.placeholder_types.append( client.enums.PlaceholderTypeEnum.LOCATION ) # The function string "IDENTITY(true)" will enable this feed. true_operand = client.get_type("Operand") true_operand.constant_operand.boolean_value = True customer_feed.matching_function.left_operands.append(true_operand) customer_feed.matching_function.function_string = "IDENTITY(true)" customer_feed.matching_function.operator = ( client.enums.MatchingFunctionOperatorEnum.IDENTITY ) customer_feed_response = customer_feed_service.mutate_customer_feeds( customer_id=customer_id, operations=[customer_feed_operation] ) print( "Customer feed created with resource name " f"'{customer_feed_response.results[0].resource_name}'." )
Ruby
# After the completion of the feed ADD operation above the added feed will # not be available for usage in a customer feed until the sync between the # Google Ads and Business Profile accounts completes. The loop below will # retry adding the customer feed up to ten times with an exponential back-off # policy. number_of_attempts = 0 added_customer_feed = nil customer_feed_service_client = client.service.customer_feed loop do number_of_attempts += 1 begin # Issues a mutate request to add a customer feed and print its information # if the request succeeded. response = customer_feed_service_client.mutate_customer_feeds( customer_id: customer_id, operations: [operation] ) puts "Customer feed created with resource name: " \ "#{response.results.first.resource_name}" rescue Google::Ads::GoogleAds::Errors::GoogleAdsError => e # Waits using exponential backoff policy sleep_seconds = POLL_FREQUENCY_SECONDS * (2 ** number_of_attempts) puts "Attempt #{number_of_attempts} to add the customer feed was " \ "not successful. Waiting #{sleep_seconds} seconds before trying again." sleep sleep_seconds end break if number_of_attempts >= MAX_CUSTOMER_FEED_ADD_ATTEMPTS || added_customer_feed end
Perl
# After the completion of the Feed ADD operation above the added feed will not be available # for usage in a CustomerFeed until the sync between the Google Ads and Business Profile # accounts completes. The loop below will retry adding the CustomerFeed up to ten times with an # exponential back-off policy. my $customer_feed_service = $api_client->CustomerFeedService(); my $customer_feed_resource_name = undef; my $number_of_attempts = 0; while ($number_of_attempts < MAX_CUSTOMER_FEED_ADD_ATTEMPTS) { $number_of_attempts++; my $customer_feeds_response = eval { $customer_feed_service->mutate({ customerId => $customer_id, operations => [$customer_feed_operation], }); }; if ($@) { # Wait using exponential backoff policy. my $sleep_seconds = 5 * (2**$number_of_attempts); # Exit the loop early if $sleep_seconds grows too large in the event that # MAX_CUSTOMER_FEED_ADD_ATTEMPTS is set too high. if ($sleep_seconds > 5 * (2**10)) { last; } printf "Attempt #%d to add the CustomerFeed was not successful. " . "Waiting %d seconds before trying again.\n", $number_of_attempts, $sleep_seconds; sleep($sleep_seconds); } else { $customer_feed_resource_name = $customer_feeds_response->{results}[0]{resourceName}; printf "Customer feed created with resource name: '%s'.\n", $customer_feed_resource_name; last; } }
ربط الخلاصة بالعميل
بعد أن تصبح الخلاصة جاهزة، يمكنك ربطها بأحد العملاء من خلال إنشاء
CustomerFeed
. وبعد ذلك، يمكنك تنفيذ عملية CustomerFeedService.MutateCustomerFeeds
create
لإكمال عملية الربط.
يجب ضبط حقول CustomerFeed
التالية.
السمة | القيمة | الوصف |
---|---|---|
feed |
اسم مورد الخلاصة. | اسم مورد الخلاصة التي تم إنشاؤها في الخطوة السابقة. |
placeholder_types |
LOCATION |
تشير هذه الخلاصة إلى أن هذه الخلاصة تملأ إضافات المواقع ضمن العميل المرتبط. |
matching_function |
IDENTITY(true) لوضع علامة على الخلاصة تشير إلى أنّها مفعّلة،
وIDENTITY(false) لوضع علامة على هذه الخلاصة على أنّها غير مفعّلة. اطّلِع على استراتيجيات الفلترة لمزيد من التفاصيل.
|
لغة Java
// Adds a CustomerFeed that associates the feed with this customer for // the LOCATION placeholder type. CustomerFeed customerFeed = CustomerFeed.newBuilder() .setFeed(businessProfileFeedResourceName) .addPlaceholderTypes(PlaceholderType.LOCATION) // Creates a matching function that will always evaluate to true. .setMatchingFunction( MatchingFunction.newBuilder() .addLeftOperands( Operand.newBuilder() .setConstantOperand( ConstantOperand.newBuilder().setBooleanValue(true).build()) .build()) .setFunctionString("IDENTITY(true)") .setOperator(MatchingFunctionOperator.IDENTITY) .build()) .build(); CustomerFeedOperation customerFeedOperation = CustomerFeedOperation.newBuilder().setCreate(customerFeed).build();
C#
private static void CreateCustomerFeed(GoogleAdsClient client, long customerId, string businessProfileFeedResourceName) { // Get the CustomerFeedService. CustomerFeedServiceClient customerFeedService = client.GetService( Services.V13.CustomerFeedService); // Adds a CustomerFeed that associates the feed with this customer for // the LOCATION placeholder type. CustomerFeed customerFeed = new CustomerFeed() { Feed = businessProfileFeedResourceName, PlaceholderTypes = { PlaceholderType.Location }, MatchingFunction = new MatchingFunction() { LeftOperands = { new Operand() { ConstantOperand = new ConstantOperand() { BooleanValue = true } } }, // Specify the function string as IDENTITY(true) to mark this feed as enabled. FunctionString = "IDENTITY(true)", Operator = MatchingFunctionOperator.Identity }, }; CustomerFeedOperation operation = new CustomerFeedOperation() { Create = customerFeed }; MutateCustomerFeedsResponse customerFeedsResponse = customerFeedService.MutateCustomerFeeds( customerId.ToString(), new[] { operation }); // Displays the result. string addedCustomerFeed = customerFeedsResponse.Results[0].ResourceName; Console.WriteLine($"Customer feed created with resource name: {addedCustomerFeed}."); return; }
لغة PHP
private static function createCustomerFeed( GoogleAdsClient $googleAdsClient, int $customerId, string $businessProfileFeedResourceName ) { // Creates a customer feed that associates the feed with this customer for the LOCATION // placeholder type. $customerFeed = new CustomerFeed([ 'feed' => $businessProfileFeedResourceName, 'placeholder_types' => [PlaceholderType::LOCATION], // Creates a matching function that will always evaluate to true. 'matching_function' => new MatchingFunction([ 'left_operands' => [new Operand([ 'constant_operand' => new ConstantOperand(['boolean_value' => true]) ])], 'function_string' => 'IDENTITY(true)', 'operator' => MatchingFunctionOperator::IDENTITY ]) ]); // Creates a customer feed operation. $customerFeedOperation = new CustomerFeedOperation(); $customerFeedOperation->setCreate($customerFeed); // After the completion of the feed ADD operation above the added feed will not be available // for usage in a customer feed until the sync between the Google Ads and Business Profile // accounts completes. The loop below will retry adding the customer feed up to ten times // with an exponential back-off policy. $numberOfAttempts = 0; $addedCustomerFeed = null; $customerFeedServiceClient = $googleAdsClient->getCustomerFeedServiceClient(); do { $numberOfAttempts++; try { // Issues a mutate request to add a customer feed and print its information if the // request succeeded. $addedCustomerFeed = $customerFeedServiceClient->mutateCustomerFeeds( $customerId, [$customerFeedOperation] ); printf( "Customer feed created with resource name: '%s'.%s", $addedCustomerFeed->getResults()[0]->getResourceName(), PHP_EOL ); } catch (GoogleAdsException $googleAdsException) { // Waits using exponential backoff policy. $sleepSeconds = self::POLL_FREQUENCY_SECONDS * pow(2, $numberOfAttempts); // Exits the loop early if $sleepSeconds grows too large in the event that // MAX_CUSTOMER_FEED_ADD_ATTEMPTS is set too high. if ( $sleepSeconds > self::POLL_FREQUENCY_SECONDS * pow(2, self::MAX_CUSTOMER_FEED_ADD_ATTEMPTS) ) { break; } printf( "Attempt #%d to add the customer feed was not successful." . " Waiting %d seconds before trying again.%s", $numberOfAttempts, $sleepSeconds, PHP_EOL ); sleep($sleepSeconds); } } while ( $numberOfAttempts < self::MAX_CUSTOMER_FEED_ADD_ATTEMPTS && is_null($addedCustomerFeed) ); if (is_null($addedCustomerFeed)) { throw new \RuntimeException( 'Could not create the customer feed after ' . self::MAX_CUSTOMER_FEED_ADD_ATTEMPTS . ' attempts. Please retry the customer feed ADD operation later.' ); } }
لغة Python
# After the completion of the Feed ADD operation above the added feed # will not be available for usage in a CustomerFeed until the sync # between the Google Ads and Business Profile accounts completes. # This process is asynchronous, so we wait until the feed mapping is # created, performing exponential backoff. customer_feed_resource_name = None number_of_attempts = 0 while number_of_attempts < MAX_CUSTOMER_FEED_ADD_ATTEMPTS: feed_mapping = get_business_profile_feed_mapping( client, customer_id, feed_resource_name ) if feed_mapping is None: number_of_attempts += 1 sleep_seconds = 5 * (2 ** number_of_attempts) print( f"Attempt #{number_of_attempts} was not successful. " f"Waiting {sleep_seconds}s before trying again." ) time.sleep(sleep_seconds) else: customer_feed_resource_name = feed_mapping.resource_name print(f"Business Profile feed {feed_resource_name} is now ready.") break
Ruby
def create_customer_feed( client, customer_id, business_profile_feed_resource_name) # Creates a customer feed operation. operation = client.operation.create_resource.customer_feed do |cf| cf.feed = business_profile_feed_resource_name cf.placeholder_types << :LOCATION cf.matching_function = client.resource.matching_function do |m| m.left_operands << client.resource.operand do |op| op.constant_operand = client.resource.constant_operand do |co| co.boolean_value = true end end m.function_string = "IDENTITY(true)" m.operator = :IDENTITY end end # After the completion of the feed ADD operation above the added feed will # not be available for usage in a customer feed until the sync between the # Google Ads and Business Profile accounts completes. The loop below will # retry adding the customer feed up to ten times with an exponential back-off # policy. number_of_attempts = 0 added_customer_feed = nil customer_feed_service_client = client.service.customer_feed loop do number_of_attempts += 1 begin # Issues a mutate request to add a customer feed and print its information # if the request succeeded. response = customer_feed_service_client.mutate_customer_feeds( customer_id: customer_id, operations: [operation] ) puts "Customer feed created with resource name: " \ "#{response.results.first.resource_name}" rescue Google::Ads::GoogleAds::Errors::GoogleAdsError => e # Waits using exponential backoff policy sleep_seconds = POLL_FREQUENCY_SECONDS * (2 ** number_of_attempts) puts "Attempt #{number_of_attempts} to add the customer feed was " \ "not successful. Waiting #{sleep_seconds} seconds before trying again." sleep sleep_seconds end break if number_of_attempts >= MAX_CUSTOMER_FEED_ADD_ATTEMPTS || added_customer_feed end if added_customer_feed.nil? raise "Could not create the customer feed after #{MAX_CUSTOMER_FEED_ADD_ATTEMPTS} " \ "attempts. Please retry the customer feed ADD operation later." end end
Perl
# Add a CustomerFeed that associates the feed with this customer for the LOCATION # placeholder type. my $customer_feed = Google::Ads::GoogleAds::V13::Resources::CustomerFeed->new( { feed => $feed_resource_name, placeholderTypes => LOCATION, # Create a matching function that will always evaluate to true. matchingFunction => Google::Ads::GoogleAds::V13::Common::MatchingFunction->new({ leftOperands => [ Google::Ads::GoogleAds::V13::Common::Operand->new({ constantOperand => Google::Ads::GoogleAds::V13::Common::ConstantOperand->new({ booleanValue => "true" })}) ], functionString => "IDENTITY(true)", operator => IDENTITY })});