تعديلات المستودع المتزايدة في الإصدار 1

يوضّح هذا القسم كيفية إرسال تعديلات خلاصاتك الحسّاسة للوقت إلى Google. تتيح لك واجهة برمجة التطبيقات Incremental Updates API تعديل الكيانات وحذفها في خلاصاتك في الوقت الفعلي تقريبًا.

هذه الوظيفة مخصّصة في المقام الأول للتعديلات التي لا يمكنك توقّعها، مثل عمليات الإغلاق بسبب الطوارئ. كقاعدة عامة، يجب أن يكون أي تغيير يتم إرساله من خلال واجهة برمجة التطبيقات Incremental Updates API تغييرًا يجب نشره في مهلة لا تتجاوز أسبوعًا واحدًا. إذا لم يكن التغيير مطلوبًا أن يظهر على الفور، يمكنك استخدام تحديث مجمّع بدلاً من ذلك. تتم معالجة التعديلات المتزايدة في غضون خمس دقائق كحد أقصى.

ضبط إعدادات الجهاز

لتنفيذ التعديلات المتزايدة، اتّبِع الخطوات التالية:

  1. اتّبِع الخطوات الموضّحة في مقالة إنشاء مشروع وإعداده لإنشاء مشروع.
  2. اتّبِع الخطوات الموضّحة في مقالة إعداد حساب خدمة لإنشاء حساب خدمة. يُرجى العِلم أنّه يجب أن تكون "مالكًا" للproject لإضافة دور "محرِّر" لحساب الخدمة.
  3. (اختياري، ولكن يُنصح به) ثبِّت مكتبة Google Client library باللغة التي تختارها لتسهيل استخدام OAuth 2.0 عند الاتصال بواجهة برمجة التطبيقات. وتستخدم نماذج الرموز البرمجية المضمّنة أدناه هذه المكتبات. بخلاف ذلك، عليك معالجة عمليات تبادل الرموز المميّزة يدويًا كما هو موضّح في مقالة استخدام بروتوكول OAuth 2.0 للوصول إلى Google APIs.

نقطة نهاية

لإعلام Google بتعديل، أرسِل طلب HTTP POST إلى Incremental Updates API وأدرِج حمولة التعديلات والإضافات. يحدِّد مخطّط المستودع الذي تستخدمه نقطة النهاية التي يتم إرسال طلبك إليها:

https://actions.googleapis.com/v2/apps/PROJECT_ID/entities/TYPE/ENTITY_ID:push
https://actions.googleapis.com/v2/apps/PROJECT_ID/entities/ENTITY_ID:push

لإزالة عنصر، عليك إرسال طلب HTTP DELETE إلى نقطة النهاية التالية التي تتوافق مع مخطّط المستودع الذي تستخدمه:

https://actions.googleapis.com/v2/apps/PROJECT_ID/entities/TYPE/ENTITY_ID?entity.vertical=FOODORDERING&delete_time=DELETE_TIME
https://actions.googleapis.com/v2/apps/PROJECT_ID/entities/ENTITY_ID?entity.vertical=FOODORDERING&delete_time=DELETE_TIME

في الطلبات أعلاه، استبدِل ما يلي:

  • PROJECT_ID: معرّف مشروع Google Cloud المرتبط بالمشروع الذي أنشأته في مقالة إنشاء مشروع وإعداده.
  • TYPE (مخطّط المستودع في الإصدار 2 فقط): نوع العنصر (موقع @type) للعنصر في خلاصة البيانات التي تريد تعديلها.
  • ENTITY_ID: رقم تعريف الكيان المُدرَج في الحمولة احرص على ترميز رقم تعريف الكيان باستخدام عنوان URL.
  • DELETE_TIME (نقطة النهاية لحذف البيانات فقط): حقل اختياري للإشارة إلى وقت حذف الكيان على أنظمتك (الإعداد التلقائي هو عندتلقّي الطلب). يجب ألا تكون قيمة الوقت في المستقبل. عند إرسال عنصر من خلال طلب متزايد، يستخدم نظام إصدارات الكيانات أيضًا الحقل delete_time في حال طلب حذف. تنسيق هذا القيمة على النحو التالي: yyyy-mm-ddTHH:mm:ssZ

على سبيل المثال، لديك مشروع يحمل رقم تعريف "معرّف مقدّم الخدمة" يستخدم مخطّط المستودع الإعلاني من الإصدار 2. تريد إجراء تغييرات على المطعم الذي يتضمن نوع ملف شخصي للمطعم هو "قسم القائمة" ومعرّف ملف شخصي هو "قسم القائمة_122". ستكون نقطة نهاية تعديلات بياناتك على النحو التالي:

https://actions.googleapis.com/v2/apps/delivery-provider-id/entities/MenuSection/menuSection_122:push

لإزالة هذا الكيان نفسه، عليك إجراء طلب HTTP DELETE API هذا:

https://actions.googleapis.com/v2/apps/delivery-provider-id/entities/MenuSection/menuSection_122?entity.vertical=FOODORDERING

طلبات وضع الحماية

بالنسبة إلى طلبات وضع المحاكاة، اتّبِع الإرشادات الواردة في نقطة النهاية أعلاه، ولكن قدِّم الطلبات إلى /v2/sandbox/apps/ بدلاً من /v2/apps/. على سبيل المثال، يتمّ تنظيم طلب حذف في مساحة الاختبار لمخطّط المستودع الإعلاني في الإصدار 2 على النحو التالي:

https://actions.googleapis.com/v2/sandbox/apps/PROJECT_ID/entities/TYPE/ENTITY_ID?entity.vertical=FOODORDERING&delete_time=DELETE_TIME

التعديلات والإضافات

يجب أن تتضمّن خلاصات الدفعات اليومية أيضًا أي تغييرات تم إرسالها من خلال واجهة برمجة التطبيقات هذه. وبخلاف ذلك، ستحلّ تعديلات المجموعة محلّ التغييرات المتزايدة.

الحمولة

يجب أن يتضمّن كل طلب POST مَعلمات الطلب بالإضافة إلى الحمولة بتنسيق JSON التي تحتوي على البيانات المنظَّمة لأيّ نوع كيان مُدرَج في مخطّط المستودع.

يجب أن يظهر تنسيق JSON بالشكل نفسه في خلاصة الدفعة، مع اختلافات التالية:

  • يجب ألا يتجاوز حجم محتوى الحمولة 5 ميغابايت. على غرار الخلاصات المُجمَّعة، ننصحك بإزالة المسافات البيضاء من أجل تكييف المزيد من البيانات.
  • المغلف على النحو التالي:
{
  "entity": {
    "data":"ENTITY_DATA",
    "vertical":"FOODORDERING"
  },
  "update_time":"UPDATE_TIMESTAMP"
}

في الحمولة أعلاه، استبدِل ما يلي:

  • ENTITY_DATA: عنصر بتنسيق JSON مُسلسل كسلسلة يجب تمرير عنصر JSON-LD كسلسلة في الحقل data.
  • UPDATE_TIMESTAMP (اختياري): الطابع الزمني الذي تم فيه تعديل العنصر في أنظمتك. يجب ألا تكون قيمة الوقت في المستقبل. الطابع الزمني التلقائي هو وقت استلام Google للطلب. عند إرسال عنصر من خلال طلب تصاعدي، يستخدم نظام إصدارات الكيانات أيضًا الحقل update_time في حال طلب الإضافة أو التعديل.

تعديل عنصر

المثال 1: تعديل مطعم

لنفترض أنّك بحاجة إلى تعديل رقم هاتف مطعم بشكل عاجل. يحتوي التعديل على ملف JSON للمطعم بأكمله.

لنفترض أنّ لديك خلاصة دفعية بالشكل التالي:

{
  "@type": "Restaurant",
  "@id": "restaurant12345",
  "name": "Some Restaurant",
  "url": "https://www.provider.com/somerestaurant",
  "telephone": "+16501234567",
  "streetAddress": "345 Spear St",
  "addressLocality": "San Francisco",
  "addressRegion": "CA",
  "postalCode": "94105",
  "addressCountry": "US",
  "latitude": 37.472842,
  "longitude": -122.217144
}

سيكون التعديل المتزايد من خلال HTTP POST على النحو التالي:

POST v2/apps/provider-project/entities/Restaurant/restaurant12345:push
Host: actions.googleapis.com
Content-Type: application/ld+json
{
  "entity": {
    "data": {
      "@type": "Restaurant",
      "@id": "restaurant12345",
      "name": "Some Restaurant",
      "url": "https://www.provider.com/somerestaurant",
      "telephone": "+16501235555",
      "streetAddress": "345 Spear St",
      "addressLocality": "San Francisco",
      "addressRegion": "CA",
      "postalCode": "94105",
      "addressCountry": "US",
      "latitude": 37.472842,
      "longitude": -122.217144
    },
    "vertical": "FOODORDERING"
  }
}

المثال 2: تعديل سعر عنصر في القائمة

لنفترض أنّك بحاجة إلى تغيير سعر أحد عناصر القائمة. كما هو موضّح في المثال 1، يجب أن يحتوي التعديل على ملف JSON للكيان بأكمله من المستوى الأعلى (القائمة)، وأن تستخدم الخلاصة مخطّط المستودع الإعلاني من الإصدار 1.

لنفترض أنّ لديك خلاصة دفعية بالشكل التالي:

{
  "@type": "MenuItemOffer",
  "@id": "menuitemoffer6680262",
  "sku": "offer-cola",
  "menuItemId": "menuitem896532",
  "price": 3.00,
  "priceCurrency": "USD"
}

سيكون التعديل المتزايد عبر POST على النحو التالي:

POST v2/apps/provider-project/entities/MenuItemOffer/menuitemoffer6680262:push
Host: actions.googleapis.com
Content-Type: application/ld+json
{
  "entity": {
    "data": {
      "@type": "MenuItemOffer",
      "@id": "menuitemoffer6680262",
      "sku": "offer-cola",
      "menuItemId": "menuitem896532",
      "price": 1.00,
      "priceCurrency": "USD"
    },
    "vertical": "FOODORDERING"
  }
}

إضافة كيان

لإضافة كيانات، تجنَّب استخدام تعديلات المستودع. بدلاً من ذلك، استخدِم عملية الخلاصات المجمّعة كما هو موضّح في مخطّط المستودع في الإصدار 2.

إزالة عنصر

لإزالة الكيانات ذات المستوى الأعلى، استخدِم نقطة نهاية معدَّلة قليلاً، واستخدِم HTTP DELETE بدلاً من HTTP POST في الطلب.

لا تستخدِم HTTP DELETE لإزالة عنصر فرعي ضمن عنصر من المستوى الأعلى، مثل عنصر قائمة ضمن قائمة. بدلاً من ذلك، تعامل مع إزالة الكيانات الفرعية على أنّها تعديل لكيان من المستوى الأعلى يتم فيه إزالة الكيان الفرعي من القائمة أو المَعلمة ذات الصلة.

المثال 1: حذف عنصر من المستوى الأعلى

لنفترض أنّك تريد حذف مطعم في خلاصة تستخدِم schema v1 للمستودع. يجب أيضًا حذف خدماته وقوائمه.

إليك عيّنة لنقطة نهاية لكيان قائمة الطعام الذي يحمل رقم التعريف "https://www.provider.com/restaurant/menu/nr":

DELETE v2/apps/delivery-provider-id/entities/https%3A%2F%2Fwww.provider.com%2Frestaurant%2Fmenu%2Fnr?entity.vertical=FOODORDERING
Host: actions.googleapis.com

نموذج لنقطة نهاية لكيان مطعم يحمل رقم التعريف "https://www.provider.com/restaurant/nr":

DELETE v2/apps/delivery-provider-id/entities/https%3A%2F%2Fwww.provider.com%2Frestaurant%2Fnr?entity.vertical=FOODORDERING
Host: actions.googleapis.com

نموذج لنقطة نهاية لكيان خدمة يحمل رقم التعريف "https://www.provider.com/restaurant/service/nr":

DELETE v2/apps/delivery-provider-id/entities/https%3A%2F%2Fwww.provider.com%2Frestaurant%2Fservice%2Fnr?entity.vertical=FOODORDERING
Host: actions.googleapis.com
}

المثال 2: إزالة الكيانات الفرعية

لإزالة كيان فرعي من كيان من المستوى الأعلى، عليك إرسال الكيان من المستوى الأعلى مع إزالة الكيان الفرعي من الحقل المقابل. يفترض المثال التالي أنّ الخلاصة تستخدِم مخطّط المستودع الإعلاني للإصدار 1.

على سبيل المثال، لإزالة منطقة نطاق خدمة، عدِّل الخدمة باستخدام منطقة نطاق الخدمة المُزالة من قائمة areaServed.

POST v2/apps/delivery-provider-id/entities/https%3A%2F%2Fwww.provider.com%2Frestaurant%2Fservice%2Fnr:push
Host: actions.googleapis.com
Content-Type: application/ld+json
{
  "entity": {
    // Note: "data" is not serialized as a string in our example for readability.
    "data": {
      "@type": "Service",
      "provider": {
        "@type": "Restaurant",
        "@id": "https://www.provider.com/restaurant/nr"
      },
      "areaServed": [
        {
          "@type": "GeoCircle",
          "geoMidpoint": {
            "@type": "GeoCoordinates",
            "latitude": "42.362757",
            "longitude": "-71.087109"
          },
          "geoRadius": "10000"
        }
        // area2 is removed.
      ]
      ...
    },
    "vertical": "FOODORDERING"
  }
}

رموز استجابة واجهة برمجة التطبيقات

لا يعني إجراء طلب ناجح أنّ الخلاصة صالحة أو صحيحة، بل يعني فقط أنّه تم إرسال طلب إلى واجهة برمجة التطبيقات. تتلقّى الطلبات الناجحة رمز استجابة HTTP‏ 200، بالإضافة إلى نص استجابة فارغ:

{}

في حال حدوث أخطاء، لن يكون رمز استجابة HTTP هو 200، وسيشير نص الاستجابة إلى المشكلة التي حدثت.

على سبيل المثال، إذا ضبط المستخدم القيمة "عمودي" في المظروف على FAKE_VERTICAL، ستتلقّى الرسالة أدناه:

{
  "error": {
    "code": 400,
    "message": "Invalid value at 'entity.vertical' (TYPE_ENUM), \"FAKE_VERTICAL\"",
    "status": "INVALID_ARGUMENT",
    "details": [
      {
        "@type": "type.googleapis.com/google.rpc.BadRequest",
        "fieldViolations": [
          {
            "field": "entity.vertical",
            "description": "Invalid value at 'entity.vertical' (TYPE_ENUM), \"FAKE_VERTICAL\""
          }
        ]
      }
    ]
  }
}

عيّنة تعليمات برمجية

في ما يلي بعض النماذج عن كيفية استخدام واجهة برمجة التطبيقات Incremental Updates API بلغات مختلفة. تستخدِم هذه النماذج مكتبات Google Auth، وتفترض أنّ الخلاصة تستخدِم مخطّط المستودع الإعلاني في الإصدار 1. للحصول على حلول بديلة، يُرجى الرجوع إلى مقالة استخدام OAuth 2.0 لتطبيقات الخادم إلى الخادم.

تعديل الكيانات

Node.jsPythonJava

يستخدم هذا الرمز البرمجي مكتبة مصادقة Google لنظام التشغيل Node.js.

const {auth} = require('google-auth-library')
const request = require('request');
// The service account client secret file downloaded from the Google Cloud Console
const serviceAccountJson = require('./service-account.json')
// entity.json is a file that contains the entity data in json format
const entity = require('./entity.json')

const ENTITY_ID = 'restaurant/http://www.provider.com/somerestaurant'
const PROJECT_ID = 'your-project-id'

/**
 * Get the authorization token using a service account.
 */
async function getAuthToken() {
  let client = auth.fromJSON(serviceAccountJson)
  client.scopes = ['https://www.googleapis.com/auth/assistant']
  const tokens = await client.authorize()
  return tokens.access_token;
}

/**
 * Send an incremental update to update or add an entity
 */
async function updateEntity(entityId, entity) {
  const token = await getAuthToken()
  request.post({
    headers: {
      'Content-Type': 'application/json',
      'Authorization': `Bearer ${token}`
    },
    url: `https://actions.googleapis.com/v2/apps/${PROJECT_ID}/entities/${encodeURIComponent(entityId)}:push`,
    body: {
      entity: {
        data: JSON.stringify(entity),
        vertical: 'FOODORDERING',
      }
    },
    json: true
  },
  (err, res, body) => {
    if (err) { return console.log(err); }
    console.log(`Response: ${JSON.stringify(res)}`)
  })
}

updateEntity(ENTITY_ID, entity)

تستخدِم هذه التعليمات البرمجية مكتبة مصادقة Google لبرنامج Python.

from google.oauth2 import service_account
from google.auth.transport.requests import AuthorizedSession
import json
import urllib

PROJECT_ID = 'your-project-id'
ENTITY_ID = 'restaurant/http://www.provider.com/somerestaurant'
ENDPOINT = 'https://actions.googleapis.com/v2/apps/%s/entities/%s:push' % (
    PROJECT_ID, urllib.quote(ENTITY_ID, ''))

# service-account.json is the service account client secret file downloaded from the
# Google Cloud Console
credentials = service_account.Credentials.from_service_account_file(
    'service-account.json')

scoped_credentials = credentials.with_scopes(
    ['https://www.googleapis.com/auth/assistant'])

authed_session = AuthorizedSession(scoped_credentials)

# Retrieving the entity
update_file = open("entity.json")  #JSON file containing entity data in json format.
data = update_file.read()

# Populating the entity with wrapper
entity = {}
entity['data'] = data #entity JSON-LD serialized as string
entity['vertical'] = 'FOODORDERING'

request = {}
request['entity'] = entity

response = authed_session.post(ENDPOINT, json=request)

print(response.text) #if successful, will be '{}'

تستخدِم هذه الرموز البرمجية مكتبة مصادقة Google للغة Java.

private static final String PROJECT_ID = "your-project-id";
private static final String ENTITY_ID = "http://www.provider.com/somerestaurant";

/**
 * Get the authorization token using a service account.
 */
private static String getAuthToken() {
  InputStream serviceAccountFile =
      Example.class.getClassLoader().getResourceAsStream("service-account.json");
  ServiceAccountCredentials.Builder credentialsSimpleBuilder =
      ServiceAccountCredentials.fromStream(serviceAccountFile).toBuilder();
  credentialsSimpleBuilder.setScopes(ImmutableList.of("https://www.googleapis.com/auth/assistant"));
  AccessToken accessToken = credentialsSimpleBuilder.build().refreshAccessToken();
  return accessToken.getTokenValue();
}

/**
 * Send an incremental update to update or add an entity.
 * @param entityId The id of the entity to update.
 * @param entity the json of the entity to be updated.
 */
public void updateEntity(String entityId, JSONObject entity) {
  String authToken = getAuthToken();
  String endpoint = String.format(
      "https://actions.googleapis.com/v2/apps/%s/entities/%s:push",
      PROJECT_ID, URLEncoder.encode(entityId, "UTF-8"));
  JSONObject data = new JSONObject();
  data.put("data", entity.toString());
  data.put("vertical", "FOODORDERING");
  JSONObject jsonBody = new JSONObject();
  jsonBody.put("entity", data);
  // Execute POST request
  executePostRequest(endpoint, authToken, jsonBody);
}

إزالة الكيانات

Node.jsPythonJava

يستخدم هذا الرمز البرمجي مكتبة مصادقة Google لنظام التشغيل Node.js.

const {auth} = require('google-auth-library')
const request = require('request');
// The service account client secret file downloaded from the Google Cloud Console
const serviceAccountJson = require('./service-account.json')
// entity.json is a file that contains the entity data in json format
const entity = require('./entity.json')

const ENTITY_ID = 'restaurant/http://www.provider.com/somerestaurant'
const PROJECT_ID = 'your-project-id'

/**
 * Get the authorization token using a service account.
 */
async function getAuthToken() {
  let client = auth.fromJSON(serviceAccountJson)
  client.scopes = ['https://www.googleapis.com/auth/assistant']
  const tokens = await client.authorize()
  return tokens.access_token;
}

/**
 * Send an incremental update to delete an entity
 */
async function deleteEntity(entityId) {
  const token = await getAuthToken()
  request.delete({
    headers: {
      'Content-Type': 'application/json',
      'Authorization': `Bearer ${token}`
    },
    url: `https://actions.googleapis.com/v2/apps/${PROJECT_ID}/entities/${encodeURIComponent(entityId)}?entity.vertical=FOODORDERING`,
    body: {},
    json: true
  },
  (err, res, body) => {
    if (err) { return console.log(err); }
    console.log(`Response: ${JSON.stringify(res)}`)
  })
}

deleteEntity(ENTITY_ID)

تستخدِم هذه التعليمات البرمجية مكتبة مصادقة Google لبرنامج Python.

from google.oauth2 import service_account
from google.auth.transport.requests import AuthorizedSession
import json
import urllib

# Service config
PROJECT_ID = 'your-project-id'
ENTITY_ID = 'restaurant/http://www.provider.com/somerestaurant'
DELETE_TIME = '2018-04-07T14:30:00-07:00'
ENDPOINT = 'https://actions.googleapis.com/v2/apps/%s/entities/%s?entity.vertical=FOODORDERING&delete_time=%s' % (
    PROJECT_ID, urllib.quote(ENTITY_ID, ''), urllib.quote(DELETE_TIME, ''))

# service-account.json is the service account client secret file downloaded from the
# Google Cloud Console
credentials = service_account.Credentials.from_service_account_file(
    'service-account.json')

scoped_credentials = credentials.with_scopes(
    ['https://www.googleapis.com/auth/assistant'])

authed_session = AuthorizedSession(scoped_credentials)
response = authed_session.delete(ENDPOINT)

print(response.text) #if successful, will be '{}'

تستخدِم هذه الرموز البرمجية مكتبة مصادقة Google للغة Java.

private static final String PROJECT_ID = "your-project-id";
private static final String ENTITY_ID = "restaurant/http://www.provider.com/somerestaurant";

/**
 * Get the authorization token using a service account.
 */
private static String getAuthToken() {
  InputStream serviceAccountFile = Example.class.getClassLoader().getResourceAsStream("service-account.json");
  ServiceAccountCredentials.Builder credentialsSimpleBuilder =
      ServiceAccountCredentials.fromStream(serviceAccountFile).toBuilder();
  credentialsSimpleBuilder.setScopes(ImmutableList.of("https://www.googleapis.com/auth/assistant"));
  AccessToken accessToken = credentialsSimpleBuilder.build().refreshAccessToken();
  return accessToken.getTokenValue();
}

/**
 * Send an incremental update to delete an entity.
 * @param entityId The id of the entity to delete.
 */
public void deleteEntity(String entityId) {
  String authToken = getAuthToken();
  String endpoint = String.format(
      "https://actions.googleapis.com/v2/apps/%s/entities/%s?entity.vertical=FOODORDERING",
      PROJECT_ID, URLEncoder.encode(entityId, "UTF-8"));
  // Execute DELETE request
  System.out.println(executeDeleteRequest(endpoint, authToken));
}

حالات الاستخدام

في ما يلي أمثلة على حالات الاستخدام التي تتضمن تعديلات تدريجية وتعديلات على الخلاصة بالكامل، والمحتوى على مستوى عالٍ في طلب البيانات من واجهة برمجة التطبيقات:

السيناريو عنصر المستوى الأعلى الوصف والتأثيرات
إيقاف خدمة DisabledService

إذا كنت بحاجة إلى إيقاف خدمة لسبب غير متوقَّع

التعديلات المتزايدة: أرسِل عنصر Service في السؤال مع تغيير @type إلى DisabledService، ولكن احتفِظ بالسمات الأخرى كما هي.

الخلاصات الكاملة: احرص على تعديل الكيان من الخلاصات الكاملة لضبط @type على DisabledService قبل عملية الجلب التالية التي تجريها Google، وإلا ستتم إعادة تفعيل الكيان.

سلعة معيّنة غير متوفّرة Menu التعديلات المتزايدة: أرسِل Menu العنصر المحفوظ في offer.inventoryLevel الذي تم ضبطه على 0 لMenuItem المحدّد، مع عدم تغيير جميع البيانات الأخرى.
تغيير في سعر عنصر قائمة Menu التعديلات المتزايدة: أرسِل عنصر Menu المحفوظ في عنصر آخر مع ضبط offer.price على السعر المعدَّل لMenuItem المحدَّد، مع عدم تغيير جميع البيانات الأخرى.

إضافة كيان جديد من المستوى الأعلى

لا تنطبق إلا على الكيانات من الأنواع Menu Restaurant وService.

Menu وRestaurant وService

على سبيل المثال، تحتاج إلى إضافة قائمة طعام جديدة إلى مطعم.

التعديلات المتزايدة: أرسِل عنصر القائمة الجديد مع عنصر المطعم مع تعديل الحقل hasMenu وفقًا لذلك.

حذف العنصر من المستوى الأعلى نهائيًا

لا تنطبق إلا على الكيانات من الأنواع Menu Restaurant وService.

Menu وRestaurant وService

التحديثات المتزايدة: أرسِل طلب حذف صريح.

الخلاصات الكاملة: احرص على إزالة الكيان من الخلاصات الكاملة قبل عملية الجلب التالية التي تجريها Google، وإلا ستتم إعادة إضافة الكيان.

إضافة منطقة تسليم جديدة في Service معيّن Service الخلاصات المتزايدة: أرسِل عنصر Service المعنيّ مع جميع الحقول سليمة، كما تفعل عادةً في الخلاصات الكاملة، مع تحديد منطقة عرض جديدة في areaServed من Service.
تعديل الوقت المقدَّر للوصول في Service Service الخلاصات المتزايدة: أرسِل Service بالطريقة نفسها في الخلاصات، باستثناء تعديل hoursAvailable.deliveryHours وفقًا لذلك.
تعديل أسعار التسليم في Service Service الخلاصات المتزايدة: أرسِل Service كاملاً مع offers.priceSpecification.price معدَّلًا.
تعديل ساعات خدمة التوصيل أو الطعام السفري في Service Service الخلاصات المتزايدة: أرسِل Service بالطريقة نفسها في الخلاصات، باستثناء تعديل hoursAvailable وفقًا لذلك.
Service (تغيير الحد الأدنى لمبلغ الطلب) Service الخلاصات المتزايدة: أرسِل Service كاملاً مع Service.offers.priceSpecification.eligibleTransactionVolume معدَّل
حذف MenuItem نهائيًا Menu الخلاصات المتزايدة: أرسِل Menu بالطريقة نفسها في الخلاصات، ولكن مع إزالة MenuItem هذا من قائمة hasMenuItems.

مستوى الخدمة في ما يتعلق بوقت معالجة المهام المجمّعة والتعديلات المتزايدة

ستتم معالجة الكيانات التي تمت إضافتها من خلال مجموعة أو تعديل متزايد في غضون يوم أو يومَي عمل. سيتمّت معالجة الكيانات التي تمّ تعديلها أو حذفها من خلال مجموعة في غضون ساعتين، في حين سيتمّت معالجة الكيانات التي تمّ تعديلها من خلال تعديل متزايد في غضون 5 دقائق. يتم حذف العنصر القديم بعد 7 أيام.

يمكنك إرسال ما يلي إلى Google:

  • مهام مجمّعة متعددة في اليوم للحفاظ على حداثة المستودع
  • مهمة مجمّعة واحدة في اليوم وواجهات برمجة تطبيقات متزايدة لإبقاء المستودع الإعلاني محدّثًا