Динамический ремаркетинг

При динамическом ремаркетинге содержимое объявлений меняется в зависимости от того, какие товары пользователь раньше смотрел на вашем сайте. AdWords API позволяет работать с объектами Feed, FeedMapping и FeedItem, на основе которых осуществляется динамический ремаркетинг в контекстно-медийной сети. В этом руководстве вы найдете два примера, показывающие, как использовать фиды для обновления объявлений с динамическим ремаркетингом.

Требования

Предполагается, что вы уже настроили фиды динамических медийных объявлений в веб-интерфейсе AdWords и получили соответствующие идентификаторы фидов.

Alternatively, you could use the API to create a Feed, FeedMapping, and FeedItems for use with your Dynamic Remarketing ads. Список необходимых атрибутов и идентификаторов полей меток-заполнителей для каждого типа фида можно найти на этой странице.

Сценарий 1: добавление и удаление данных о недвижимости

Допустим, вы создали объявления с динамическим ремаркетингом для своего сайта недвижимости. В каталоге постоянно появляются новые предложения, а проданные объекты недвижимости удаляются. Вам нужно, чтобы объявления отражали эти изменения и всегда оставались актуальными.

Шаг 1: получите информацию о настройках ваших данных

Чтобы управлять данными о недвижимости, необходимо получить объект FeedMapping для фида (Feed) и тип метки-заполнителя для категории "Недвижимость". В объекте FeedMapping вы найдете FeedAttribute, соответствующий каждому полю метки-заполнителя в вашем фиде (Feed). В приведенном ниже коде определен метод, извлекающий FeedMapping и составляющий карту ключей fieldId для значений feedAttributeId.

/**
 * Returns a map from placeholder field ID to feed attribute ID for the given
 * combination of feed ID and placeholder type.
 */
public static Map<Integer, Long> getPlaceholderToAttributeMap(Long feedId,
    Integer placeholderType, AdWordsSession session, AdWordsServices adWordsServices)
    throws ApiException, RemoteException {
  Selector selector = new SelectorBuilder()
    .fields("AttributeFieldMappings")
    .equals("FeedId", feedId.toString())
    .equals("Status", FeedMappingStatus.ENABLED.getValue())
    .equals("PlaceholderType", placeholderType.toString())
    .build();

  // Get the FeedMappingService.
  FeedMappingServiceInterface feedMappingService =
    adWordsServices.get(session, FeedMappingServiceInterface.class);

  // Submit the 'get' request.
  FeedMapping feedMapping = feedMappingService.get(selector).getEntries(0);

  // Build a map from placeholder field ID to feed attribute ID from the FeedMapping.
  Map<Integer, Long> fieldMap = Maps.newHashMap();
  for(AttributeFieldMapping attributeFieldMapping :
      feedMapping.getAttributeFieldMappings()) {
    fieldMap.put(attributeFieldMapping.getFieldId(),
        attributeFieldMapping.getFeedAttributeId());
  }
  return fieldMap;
}

Шаг 2: создайте операции для добавления новых данных о недвижимости

Теперь нужно создать операции, добавляющие новые данные о недвижимости. Это довольно просто:

  1. Получите идентификаторы полей меток-заполнителей и соответствующие им идентификаторы атрибутов фида, используя метод utility.
  2. Для каждого атрибута (идентификатор, название, URL изображения и т. д.) создайте FeedItemAttributeValue, где feedAttributeId – идентификатор для соответствующего поля метки-заполнителя.
  3. В FeedItemAttributeValue укажите нужное значение для поля метки-заполнителя атрибута. Например, для идентификатора задайте поле stringValue, так как поле LISTING_ID принадлежит к типу STRING.
  4. Настроив все объекты FeedItemAttributeValue, создайте новый объект FeedItem и в качестве feedId укажите идентификатор вашего фида (Feed), а в качестве attributeValues – коллекцию FeedItemAttributeValue.
  5. Создайте новый объект FeedItemOperation с оператором ADD и операндом FeedItem.
Long feedId = Long.valueOf("INSERT_FEED_ID_HERE");

List<FeedItemOperation> newFeedItemOperations = Lists.newArrayList();

// First, get the mapping from placeholder field ID to feed attribute ID.
// Note that 16 is the placeholder type ID for the Real Estate vertical.
Map<Integer, Long> fieldMap = getPlaceholderToAttributeMap(feedId,
  16, session, adWordsServices);

FeedItemAttributeValue listingId = new FeedItemAttributeValue();
listingId.setFeedAttributeId(fieldMap.get(1));
listingId.setStringValue("ABC123DEF");

FeedItemAttributeValue listingName = new FeedItemAttributeValue();
listingName.setFeedAttributeId(fieldMap.get(2));
listingName.setStringValue("Two bedroom with magnificent views");

FeedItemAttributeValue finalUrl = new FeedItemAttributeValue();
finalUrl.setFeedAttributeId(fieldMap.get(12));
finalUrl.setStringValues(new String[] {"http://www.example.com/listings/"});

// Insert additional attributes here, such as address, city, description, etc.

FeedItemAttributeValue imageUrl = new FeedItemAttributeValue();
imageUrl.setFeedAttributeId(fieldMap.get(8));
imageUrl.setStringValue("http://www.example.com/listings/images?listing_id=ABC123DEF");

FeedItemAttributeValue contextualKeywords = new FeedItemAttributeValue();
contextualKeywords.setFeedAttributeId(fieldMap.get(11));
contextualKeywords.setStringValues(
    new String[] {"beach community", "ocean view", "two bedroom"});

// Create the FeedItem, specifying the Feed ID and the attributes created above.
FeedItem feedItem = new FeedItem();
feedItem.setFeedId(feedId);
feedItem.setAttributeValues(new FeedItemAttributeValue[]{
    listingId,
    listingName,
    finalUrl,
    // Include additional attributes...
    imageUrl,
    contextualKeywords});

// Create an operation to add each FeedItem.
FeedItemOperation feedItemOperation = new FeedItemOperation();
feedItemOperation.setOperator(Operator.ADD);
feedItemOperation.setOperand(feedItem);
newFeedItemOperations.add(feedItemOperation);

// Repeat the above for additional new listings.

Шаг 3: создайте операции для удаления данных о проданных объектах недвижимости

Удалить данные о проданных объектах недвижимости ещё проще. Все, что вам для этого понадобится, – feedId и feedItemId каждого проданного объекта.

Если у вас нет feedItemId для проданного объекта недвижимости, можно получить объекты FeedItem, которые содержат идентификаторы feedItemId, с помощью метода FeedItemService.get.

В общих чертах процесс выглядит так:

  1. Создайте новый объект FeedItem и задайте для feedId идентификатор вашего фида (Feed), а для feedItemId – идентификатор объекта недвижимости.
  2. Создайте новый объект FeedItemOperation с оператором REMOVE и операндом FeedItem.
Long feedId = Long.valueOf("INSERT_FEED_ID_HERE");

List<Long> feedItemIds = Lists.newArrayList(
    // feed item ID 1,
    // feed item ID 2,
    // ...
    );

List<FeedItemOperation> removeFeedItemOperations = Lists.newArrayList();
for(Long feedItemId : feedItemIds) {
  // When removing you can simply specify the feedId and the feedItemId.
  FeedItem feedItemToRemove = new FeedItem();

  feedItemToRemove.setFeedId(feedId);
  feedItemToRemove.setFeedItemId(feedItemId);

  FeedItemOperation removeOperation = new FeedItemOperation();
  removeOperation.setOperator(Operator.REMOVE);
  removeOperation.setOperand(feedItemToRemove);

  removeFeedItemOperations.add(removeOperation);
}

Шаг 4: передайте операции добавления и удаления

Чтобы применить изменения, передайте обе коллекции FeedItemOperation, которые вы создали ранее, методу FeedItemService.mutate.

// Get the FeedItemService
FeedItemServiceInterface feedItemService =
    adWordsServices.get(session, FeedItemServiceInterface.class);

// Combine the lists of operations.
List<FeedItemOperation> allOperations = Lists.newArrayList(newFeedItemOperations);
allOperations.addAll(removeFeedItemOperations);

// Pass the collection of FeedItemOperations to the mutate method.
FeedItemReturnValue itemsUpdateReturnValue =
    feedItemService.mutate(allOperations.toArray(new FeedItemOperation[allOperations.size()]));

System.out.printf("Updated %d items%n", itemsUpdateReturnValue.getValue().length);

Сценарий 2: обновление цен на авиабилеты

Допустим, вы рекламируете сайт бронирования авиабилетов и хотите обновлять цену на некоторые рейсы и удалять ее для других. Чтобы в объявлениях с динамическим ремаркетингом отображалась правильная цена для каждого авиарейса, ее необходимо обновлять в соответствующем объекте FeedItem.

Шаг 1: создайте операции, обновляющие цены

Процесс похож на создание новых объектов FeedItem, только в этом случае вам достаточно указать лишь FeedItemAttributeValue – идентификаторы полей меток-заполнителей будут взяты из списка полей для категории "Авиабилеты".

Выполните следующие действия:

  1. Получите идентификаторы полей меток-заполнителей и соответствующие им идентификаторы атрибутов фида, используя метод utility.
  2. Для каждого атрибута (идентификатор, название, URL изображения и т. д.) создайте FeedItemAttributeValue, где feedAttributeId – идентификатор для соответствующего поля метки-заполнителя.
  3. В FeedItemAttributeValue укажите нужное значение для поля метки-заполнителя атрибута.
  4. Когда все объекты FeedItemAttributeValue будут готовы, создайте новый объект FeedItem, указав для feedId идентификатор вашего фида (Feed), для feedItemId – идентификатор элемента фида, а для attributeValues – коллекцию объектов FeedItemAttributeValue.
  5. Создайте новый объект FeedItemOperation с оператором SET и операндом FeedItem.
Long feedId = Long.valueOf("INSERT_FEED_ID_HERE");

List<FeedItemOperation> updateFeedItemOperations = Lists.newArrayList();

// First, get the mapping from placeholder field ID to feed attribute ID.
// Note that 13 is the placeholder type ID for the Flights vertical.
Map<Integer, Long> fieldMap = getPlaceholderToAttributeMap(feedId,
  13, session, adWordsServices);

// Update the sale price on the first flight
Long newSalePriceFeedItemId = Long.valueOf("INSERT_FEED_ITEM_ID");
FeedItemAttributeValue salePrice = new FeedItemAttributeValue();
salePrice.setFeedAttributeId(fieldMap.get(12));
salePrice.setStringValue("1,309.89 USD");

FeedItem feedItemForNewSalePrice = new FeedItem();
feedItemForNewSalePrice.setFeedId(feedId);
feedItemForNewSalePrice.setFeedItemId(newSalePriceFeedItemId);
feedItemForNewSalePrice.setAttributeValues(new FeedItemAttributeValue[] {salePrice});

// Clear the sale price on the second flight, and update its regular price
Long removedSalePriceFeedItemId = Long.valueOf("INSERT_FEED_ITEM_ID");
FeedItemAttributeValue removedSalePrice = new FeedItemAttributeValue();
removedSalePrice.setFeedAttributeId(fieldMap.get(12));

FeedItemAttributeValue newFlightPrice = new FeedItemAttributeValue();
newFlightPrice.setFeedAttributeId(fieldMap.get(6));
newFlightPrice.setStringValue("499.99 USD");

FeedItem feedItemForRemovedSalePrice = new FeedItem();
feedItemForRemovedSalePrice.setFeedId(feedId);
feedItemForRemovedSalePrice.setFeedItemId(removedSalePriceFeedItemId);
feedItemForRemovedSalePrice.setAttributeValues(
    new FeedItemAttributeValue[] {removedSalePrice, newFlightPrice});

// Create the FeedItemOperations to update the FeedItems.
for(FeedItem feedItemToUpdate : new FeedItem[]{ feedItemForNewSalePrice,
                                                feedItemForRemovedSalePrice}) {
  FeedItemOperation updateFeedItemOperation = new FeedItemOperation();
  updateFeedItemOperation.setOperator(Operator.SET);
  updateFeedItemOperation.setOperand(feedItemToUpdate);

  updateFeedItemOperations.add(updateFeedItemOperation);
}

Шаг 2: передайте операции обновления

Чтобы применить изменения, передайте коллекцию FeedItemOperation, которую вы создали ранее, методу FeedItemService.mutate.

Отчеты

Чтобы получать статистику по эффективности объявлений с динамическим ремаркетингом, используйте те же отчеты, что и для любой другой кампании в контекстно-медийной сети.

Дополнительная информация

В этом руководстве рассматриваются лишь два примера – для категорий "Недвижимость" и "Авиабилеты". Идентификаторы типов и полей меток-заполнителей для других категорий можно найти здесь.

Оставить отзыв о...

Текущей странице
Нужна помощь? Обратитесь в службу поддержки.