Introdução aos serviços de feeds

Este guia é uma introdução aos feeds, que contam com uma forma genérica e flexível para fornecimento e utilização de dados tabulares em uma conta do Google AdWords. As extensões de anúncios, os personalizadores de anúncios e o remarketing dinâmico são exemplos de recursos do Google AdWords que utilizam dados tabulares. Este guia apresenta extensões de sitelinks como um exemplo para explicar de que forma usar os serviços de feeds, mas o processo é análogo para outros tipos de dados tabulares, utilizando diferentes tipos de marcadores de posição, conforme explicado abaixo.

Este guia usa Java para exemplos de código. Para exemplos de código em outras linguagens de programação, consulte a tabela no final deste guia.

Cenário do cliente

Suponhamos que você seja um anunciante que utiliza o Google AdWords para gerar tráfego no seu site. Você quer que seus anúncios sejam exibidos com sitelinks para que os usuários possam chegar às seções do seu site mais rapidamente.

Veja a seguir alguns dos detalhes referentes aos sitelinks que convém mostrar sob seus anúncios:

Nome do sitelink URLs finais do sitelink
Página inicial http://www.example.com
Localizador de lojas http://www.example.com/locations
Itens em promoção http://www.example.com/discounts
Suporte http://www.example.com/support
Produtos http://www.example.com/prods
Sobre nós http://www.example.com/about

Repare que os dados são tabulares, ou seja, cada coluna é uma propriedade do sitelink, e cada linha fornece valores para um sitelink.

Serviços de feeds

Há vários serviços inter-relacionados que podem ser usados para criar e gerenciar feeds.

FeedService
Este serviço é usado para descrever ao Google AdWords a forma dos seus dados tabulares, por exemplo, um nome ou título para seu Feed (tabela), além de tipos e nomes de coluna.
FeedItemService
Este serviço é usado para preencher seu feed com dados. Cada FeedItem representa uma linha na tabela.
FeedMappingService
Este serviço é usado para especificar como o feed será usado, por exemplo, como mapear as colunas da sua tabela usando campos exigidos por um determinado recurso do Google AdWords. Este guia mostra como mapear um feed a ser usado para sitelinks.
CustomerFeedService
Este serviço ativa seu feed em toda a conta de um cliente, por exemplo, em todos os grupos de anúncios e campanhas.
CampaignFeedService
Este serviço ativa seu feed em uma campanha completa, por exemplo, em todos os grupos de anúncios dentro de uma campanha.
AdGroupFeedService
Este serviço ativa seu feed em um determinado grupo de anúncios.

Exemplo de código Java

O exemplo de código abaixo demonstra como adicionar um feed de sitelinks e associá-lo a uma campanha usando a biblioteca cliente Java. Para ver o exemplo de código completo, consulte a tabela ao final deste documento.

Adicionar sitelinks a uma campanha consiste nas seguintes etapas:

  1. Criar o feed.
  2. Preencher o feed.
  3. Mapear o feed para os campos de marcador de posição dos sitelinks.
  4. Associar o feed a um cliente, uma campanha ou um grupo de anúncios.
  5. Programar quando os itens do feed devem ser ativados (opcional).


1. Criar o feed de sitelinks

Nós usamos o FeedService para descrever o formato dos dados a serem enviados. Isso consiste no nome ou título do Feed (tabela) e em um conjunto de FeedAttributes (colunas). Cada FeedAttribute tem um nome (cabeçalho de coluna) e tipo.

No exemplo abaixo, createSiteLinksFeed() usa o FeedService para criar um Feed com FeedAttributes (colunas) adequados para manter os dados tabulares para os sitelinks:

private static void createSiteLinksFeed(AdWordsServices adWordsServices, AdWordsSession session,
    SiteLinksDataHolder siteLinksData, String feedName) throws Exception {
  // Get the FeedService.
  FeedServiceInterface feedService = adWordsServices.get(session, FeedServiceInterface.class);

  // Create attributes.
  FeedAttribute textAttribute = new FeedAttribute();
  textAttribute.setType(FeedAttributeType.STRING);
  textAttribute.setName("Link Text");
  FeedAttribute finalUrlAttribute = new FeedAttribute();
  finalUrlAttribute.setType(FeedAttributeType.URL_LIST);
  finalUrlAttribute.setName("Link Final URLs");
  FeedAttribute line1Attribute = new FeedAttribute();
  line1Attribute.setType(FeedAttributeType.STRING);
  line1Attribute.setName("Line 1 Description");
  FeedAttribute line2Attribute = new FeedAttribute();
  line2Attribute.setType(FeedAttributeType.STRING);
  line2Attribute.setName("Line 2 Description");

  // Create the feed.
  Feed siteLinksFeed = new Feed();
  siteLinksFeed.setName(feedName);
  siteLinksFeed.setAttributes(
      new FeedAttribute[] {textAttribute, finalUrlAttribute, line1Attribute, line2Attribute});
  siteLinksFeed.setOrigin(FeedOrigin.USER);

  // Create operation.
  FeedOperation operation = new FeedOperation();
  operation.setOperand(siteLinksFeed);
  operation.setOperator(Operator.ADD);

  // Add the feed.
  FeedReturnValue result = feedService.mutate(new FeedOperation[] {operation});

  Feed savedFeed = result.getValue()[0];
  siteLinksData.siteLinksFeedId = savedFeed.getId();
  FeedAttribute[] savedAttributes = savedFeed.getAttributes();
  siteLinksData.linkTextFeedAttributeId = savedAttributes[0].getId();
  siteLinksData.linkFinalUrlFeedAttributeId = savedAttributes[1].getId();
  siteLinksData.line1FeedAttributeId = savedAttributes[2].getId();
  siteLinksData.line2FeedAttributeId = savedAttributes[3].getId();
  System.out.printf("Feed with name '%s' and ID %d with linkTextAttributeId %d"
      + " and linkFinalUrlAttributeId %d and line1AttributeId %d"
      + " and line2AttributeId %d was created.%n",
      savedFeed.getName(),
      savedFeed.getId(),
      savedAttributes[0].getId(),
      savedAttributes[1].getId(),
      savedAttributes[2].getId(),
      savedAttributes[3].getId());
}

Para descrever os dados tabulares que serão utilizados para sitelinks, o método cria um Feed contendo FeedAttributes (colunas) com os seguintes nomes: Texto do link, URLs finais, Linha 1 e Linha 2. Nomeamos o Feed como Feed para sitelinks por ser uma descrição útil para nossa referência. A origem do Feed está definida como FeedOrigin.USER, o que significa que o anunciante preencherá os FeedItems (linhas). Em contrapartida, o Google AdWords também pode preencher os dados dos feeds.

Uma operação de modificação é chamada no FeedService para criar o Feed. Depois de concluir a adição do Feed com sucesso, o FeedService retornará seu ID e os IDs de cada FeedAttribute (coluna). É importante armazenar esses IDs para uso com outros serviços posteriormente. Para simplificar nosso exemplo, suponhamos que um objeto chamado siteLinksData do tipo SiteLinksDataHolder tenha sido criado e que ele contenha os campos apropriados para manter os IDs. Usaremos esse objeto nas etapas subsequentes para recuperar os IDs. Você pode criar um objeto semelhante na sua linguagem de implementação.

Nosso Feed tem exatamente a quantidade necessária de colunas para sitelinks. No entanto, você também pode criar um Feed com mais colunas e apenas algumas delas contendo dados exigidos pelo recurso do Google AdWords. Veremos isso posteriormente. Entre outros motivos, você pode fazer isso para usar os valores das outras colunas com intuito de filtrar quais FeedItems (linhas) se aplicam a quais campanhas ou grupos de anúncios por meio de uma função correspondente, conforme descrito abaixo.

2. Preencher o feed

Agora que a forma dos dados foi descrita para o Google AdWords, os dados dos sitelinks podem ser preenchidos por meio da adição de FeedItems (linhas) usando o FeedItemService.

Começamos com um método auxiliar, newSiteLinkFeedItemAddOperation(), para criar FeedItems. Este método auxiliar leva informações sobre um sitelink (seu rótulo de texto, URL final e suas linhas descritivas) e sobre os IDs de FeedAttributes (colunas) do nosso Feed para criar um novo FeedItem (linha) preenchido com as informações fornecidas. Em seguida, o novo FeedItem é colocado em uma operação de adição e retornado.

Para entender como criar um FeedItem, lembre-se desta forma de caracterizar uma tabela: cada linha é um conjunto de células, e cada célula está localizada em uma determinada coluna e contém algum conteúdo. Analogamente, um FeedItem (linha) é um conjunto de FeedItemAttributeValues​​ (células), e cada FeedItemAttributeValue (célula) apresenta o ID de um FeedAttribute (coluna em que a célula está localizada) e um stringValue (o conteúdo da célula, se for uma string).

private static FeedItemOperation newSiteLinkFeedItemAddOperation(
    SiteLinksDataHolder siteLinksData, String text, String finalUrl, String line1, String line2) {
  return newSiteLinkFeedItemAddOperation(siteLinksData, text, finalUrl, line1, line2, null);
}

private static FeedItemOperation newSiteLinkFeedItemAddOperation(
    SiteLinksDataHolder siteLinksData, String text, String finalUrl, String line1, String line2,
    Long locationId) {
  // Create the FeedItemAttributeValues for our text values.
  FeedItemAttributeValue linkTextAttributeValue = new FeedItemAttributeValue();
  linkTextAttributeValue.setFeedAttributeId(siteLinksData.linkTextFeedAttributeId);
  linkTextAttributeValue.setStringValue(text);
  FeedItemAttributeValue linkFinalUrlAttributeValue = new FeedItemAttributeValue();
  linkFinalUrlAttributeValue.setFeedAttributeId(siteLinksData.linkFinalUrlFeedAttributeId);
  linkFinalUrlAttributeValue.setStringValues(new String[] {finalUrl});
  FeedItemAttributeValue line1TextAttributeValue = new FeedItemAttributeValue();
  line1TextAttributeValue.setFeedAttributeId(siteLinksData.line1FeedAttributeId);
  line1TextAttributeValue.setStringValue(line1);
  FeedItemAttributeValue line2TextAttributeValue = new FeedItemAttributeValue();
  line2TextAttributeValue.setFeedAttributeId(siteLinksData.line2FeedAttributeId);
  line2TextAttributeValue.setStringValue(line2);

  // Create the feed item and operation.
  FeedItem item = new FeedItem();
  item.setFeedId(siteLinksData.siteLinksFeedId);
  item.setAttributeValues(new FeedItemAttributeValue[] {linkTextAttributeValue,
      linkFinalUrlAttributeValue, line1TextAttributeValue, line2TextAttributeValue});

  // OPTIONAL: Use geographical targeting on a feed item.
  // IDs can be found in the documentation or retrieved with the
  // LocationCriterionService.
  if (locationId != null) {
    Location location = new Location();
    location.setId(locationId);
    item.setGeoTargeting(location);
    // OPTIONAL: Restrict targeting only to people physically within the location.
    FeedItemGeoRestriction geoTargetingRestriction = new FeedItemGeoRestriction();
    geoTargetingRestriction.setGeoRestriction(GeoRestriction.LOCATION_OF_PRESENCE);
    item.setGeoTargetingRestriction(geoTargetingRestriction);
  }

  // Optional: use item.setStartTime() and item.setEndTime() to specify the
  // time period for the feed to deliver.  The example below will make the feed
  // start now and stop in one month.
  // Make sure you specify the DateTime in the customer's time zone.  You can
  // retrieve this from customer.getDateTimeZone().
  //   item.setStartTime(new DateTime(customerTimeZone).toString("yyyyMMdd HHmmss"));
  //   item.setEndTime(new DateTime(customerTimeZone).plusMonths(1).toString("yyyyMMdd HHmmss"));

  // Optional: use item.setScheduling() to specify time and days of the week for feed to deliver.
  FeedItemOperation operation = new FeedItemOperation();
  operation.setOperand(item);
  operation.setOperator(Operator.ADD);
  return operation;
}

Continuando o exemplo, o método abaixo, createSiteLinksFeedItems(), cria todos os FeedItems e as FeedItemOperations que o contenha, invocando nosso método auxiliar com informações diferentes para cada sitelink que queremos criar.

Os FeedItems retornados pela chamada de modificação incluem IDs que armazenamos em siteLinksData para uso posterior. Novamente, suponhamos que esse objeto já tenha sido criado e que contenha os campos apropriados para manter os IDs.

private static void createSiteLinksFeedItems(AdWordsServices adWordsServices,
    AdWordsSession session, SiteLinksDataHolder siteLinksData) throws Exception {
  // Get the FeedItemService.
  FeedItemServiceInterface feedItemService =
      adWordsServices.get(session, FeedItemServiceInterface.class);

  // Create operations to add FeedItems.
  FeedItemOperation home = newSiteLinkFeedItemAddOperation(siteLinksData, "Home",
      "http://www.example.com", "Home line 1", "Home line 2");
  FeedItemOperation stores = newSiteLinkFeedItemAddOperation(siteLinksData, "Stores",
      "http://www.example.com/stores", "Stores line 1", "Stores line 2");
  FeedItemOperation onSale = newSiteLinkFeedItemAddOperation(siteLinksData, "On Sale",
      "http://www.example.com/sale", "On Sale line 1", "On Sale line 2");
  FeedItemOperation support = newSiteLinkFeedItemAddOperation(siteLinksData, "Support",
      "http://www.example.com/support", "Support line 1", "Support line 2");
  FeedItemOperation products = newSiteLinkFeedItemAddOperation(siteLinksData, "Products",
      "http://www.example.com/prods", "Products line 1", "Products line 2");
  // This site link is using geographical targeting by specifying the
  // criterion ID for California.
  FeedItemOperation aboutUs = newSiteLinkFeedItemAddOperation(siteLinksData, "About Us",
      "http://www.example.com/about", "About Us line 1", "About Us line 2", 21137L);

  FeedItemOperation[] operations =
      new FeedItemOperation[] {home, stores, onSale, support, products, aboutUs};

  FeedItemReturnValue result = feedItemService.mutate(operations);
  for (FeedItem item : result.getValue()) {
    System.out.printf("FeedItem with feedItemId %d was added.%n", item.getFeedItemId());
    siteLinksData.siteLinkFeedItemIds.add(item.getFeedItemId());
  }
}

3. Mapear o feed para os campos de marcador de posição

Há um tipo de marcador de posição que especifica os campos e tipos de dados exigidos para cada recurso compatível do Google AdWords que utiliza dados tabulares. O FeedMappingService é usado para mapear um feed para um tipo de marcador de posição, indicando de que forma o feed será usado, e para mapear alguns FeedAttributes (coluna) para campos do marcador de posição, indicando de que forma esses FeedAttributes serão interpretados pelo recurso do Google AdWords.

// See the Placeholder reference page for a list of all the placeholder types and fields.
// https://developers.google.com/adwords/api/docs/appendix/placeholders
private static final int PLACEHOLDER_SITELINKS = 1;

// See the Placeholder reference page for a list of all the placeholder types and fields.
// https://developers.google.com/adwords/api/docs/appendix/placeholders
private static final int PLACEHOLDER_FIELD_SITELINK_LINK_TEXT = 1;
private static final int PLACEHOLDER_FIELD_SITELINK_FINAL_URL = 5;
private static final int PLACEHOLDER_FIELD_LINE_1_TEXT = 3;
private static final int PLACEHOLDER_FIELD_LINE_2_TEXT = 4;

private static void createSiteLinksFeedMapping(AdWordsServices adWordsServices,
    AdWordsSession session, SiteLinksDataHolder siteLinksData) throws Exception {
  // Get the FeedItemService.
  FeedMappingServiceInterface feedMappingService =
      adWordsServices.get(session, FeedMappingServiceInterface.class);

  // Map the FeedAttributeIds to the fieldId constants.
  AttributeFieldMapping linkTextFieldMapping = new AttributeFieldMapping();
  linkTextFieldMapping.setFeedAttributeId(siteLinksData.linkTextFeedAttributeId);
  linkTextFieldMapping.setFieldId(PLACEHOLDER_FIELD_SITELINK_LINK_TEXT);
  AttributeFieldMapping linkFinalUrlFieldMapping = new AttributeFieldMapping();
  linkFinalUrlFieldMapping.setFeedAttributeId(siteLinksData.linkFinalUrlFeedAttributeId);
  linkFinalUrlFieldMapping.setFieldId(PLACEHOLDER_FIELD_SITELINK_FINAL_URL);
  AttributeFieldMapping line1FieldMapping = new AttributeFieldMapping();
  line1FieldMapping.setFeedAttributeId(siteLinksData.line1FeedAttributeId);
  line1FieldMapping.setFieldId(PLACEHOLDER_FIELD_LINE_1_TEXT);
  AttributeFieldMapping line2FieldMapping = new AttributeFieldMapping();
  line2FieldMapping.setFeedAttributeId(siteLinksData.line2FeedAttributeId);
  line2FieldMapping.setFieldId(PLACEHOLDER_FIELD_LINE_2_TEXT);

  // Create the FeedMapping and operation.
  FeedMapping feedMapping = new FeedMapping();
  feedMapping.setPlaceholderType(PLACEHOLDER_SITELINKS);
  feedMapping.setFeedId(siteLinksData.siteLinksFeedId);
  feedMapping.setAttributeFieldMappings(new AttributeFieldMapping[] {linkTextFieldMapping,
      linkFinalUrlFieldMapping, line1FieldMapping, line2FieldMapping});
  FeedMappingOperation operation = new FeedMappingOperation();
  operation.setOperand(feedMapping);
  operation.setOperator(Operator.ADD);

  // Save the field mapping.
  FeedMappingReturnValue result =
      feedMappingService.mutate(new FeedMappingOperation[] {operation});
  for (FeedMapping savedFeedMapping : result.getValue()) {
    System.out.printf(
        "Feed mapping with ID %d and placeholderType %d was saved for feed with ID %d.%n",
        savedFeedMapping.getFeedMappingId(), savedFeedMapping.getPlaceholderType(),
        savedFeedMapping.getFeedId());
  }
}

Nesse exemplo, o método configura o feed para ser usado para sitelinks. Isso acontece ao definir um tipo de marcador de posição no FeedMapping para a constante PLACEHOLDER_SITELINKS. O valor dessa constante é 1. O método também mapeia os FeedAttributes para os campos de marcador de posição necessários aos sitelinks: texto do link, URLs finais e linhas descritivas. Esse mapeamento indica ao Google AdWords quais FeedAttributes (colunas) correspondem a quais aspectos de sitelinks.

4. Associar o feed a um cliente, uma campanha ou um grupo de anúncios

Nesse ponto, o feed estará pronto para ser usado para sitelinks. A última etapa é associar o feed a um cliente (CustomerFeedService), uma campanha (CampaignFeedService) ou um grupo de anúncios (AdGroupFeedService) para ativar os sitelinks para o conjunto de anúncios específico.

A opção por associar ou não um feed a um cliente, uma campanha ou um grupo de anúncios se baseia nos dados contidos no seu feed e no nível de controle que você deseja. Usando sitelinks como um exemplo novamente, se todos os grupos de anúncios em uma campanha tiverem que exibir os mesmos sitelinks, você poderá associar o feed à campanha. Da mesma forma, se quiser que os sitelinks sejam usados com todas as campanhas, associe o feed à conta. Por outro lado, se diferentes grupos de anúncios na mesma campanha tiverem que exibir diferentes sitelinks, você deverá associar separadamente o feed apenas ao grupo de anúncios específico.

Quando você associa um feed, é possível filtrar quais FeedItems (linhas) serão ativados para o cliente, a campanha ou o grupo de anúncios em questão. Por exemplo, você pode ter um único feed onde alguns FeedItems (em virtude de um filtro) são usados em uma campanha e outros FeedItems (em virtude de outro filtro) são usados em outra campanha etc. Os filtros são aplicados quando uma função correspondente é fornecida, o que é avaliado para cada FeedItem.

private static void createSiteLinksCampaignFeed(AdWordsServices adWordsServices,
    AdWordsSession session, SiteLinksDataHolder siteLinksData, Long campaignId) throws Exception {
  // Get the CampaignFeedService.
  CampaignFeedServiceInterface campaignFeedService =
      adWordsServices.get(session, CampaignFeedServiceInterface.class);

  // Construct a matching function that associates the sitelink feed items to the campaign, and
  // sets the device preference to mobile. See the matching function guide at
  // https://developers.google.com/adwords/api/docs/guides/feed-matching-functions
  // for more details.
  String matchingFunctionString = String.format(
      "AND( IN(FEED_ITEM_ID, {%s}), EQUALS(CONTEXT.DEVICE, 'Mobile') )",
      Joiner.on(',').join(siteLinksData.siteLinkFeedItemIds));

  CampaignFeed campaignFeed = new CampaignFeed();
  campaignFeed.setFeedId(siteLinksData.siteLinksFeedId);
  campaignFeed.setCampaignId(campaignId);

  Function matchingFunction = new Function();
  matchingFunction.setFunctionString(matchingFunctionString);

  campaignFeed.setMatchingFunction(matchingFunction);
  // Specifying placeholder types on the CampaignFeed allows the same feed
  // to be used for different placeholders in different Campaigns.
  campaignFeed.setPlaceholderTypes(new int[] {PLACEHOLDER_SITELINKS});

  CampaignFeedOperation operation = new CampaignFeedOperation();
  operation.setOperand(campaignFeed);
  operation.setOperator(Operator.ADD);
  CampaignFeedReturnValue result =
      campaignFeedService.mutate(new CampaignFeedOperation[] {operation});
  for (CampaignFeed savedCampaignFeed : result.getValue()) {
    System.out.printf("Campaign with ID %d was associated with feed with ID %d.%n",
        savedCampaignFeed.getCampaignId(), savedCampaignFeed.getFeedId());
  }
}

Esse método cria uma associação entre uma campanha e um feed. Há dois trechos desses dados configurados com esta associação: os tipos de marcador de posição e a função correspondente (filtro).

Talvez você se pergunte o motivo pelo qual o tipo de marcador de posição (neste exemplo, sitelinks) precisa ser configurado novamente para o CampaignFeed quando ele já foi configurado no FeedMapping para o Feed como um todo. O motivo é o seguinte: exigir que os marcadores de posição sejam configurados novamente oferece a flexibilidade para que um Feed com vários FeedMappings seja usado apenas para alguns tipos de marcadores de posição em algumas campanhas e outros tipos de marcadores de posição em outras campanhas.

Definir uma função correspondente no CampaignFeed indica ao sistema de veiculação quais FeedItems (linhas) usar como sitelinks. Consulte o guia Funções correspondentes para mais detalhes. Nesse exemplo, usamos FEED_ITEM_ID como RequestContextOperand na nossa Função correspondente. No entanto, poderíamos ter usado facilmente outro tipo de RequestContextOperand ou até mesmo correspondido usando um FeedAttributeOperand, como FeedAttributeId.

O mesmo processo funciona para grupos de anúncios e clientes. Você pode conectar os feeds ao criar um AdGroupFeed usando o AdGroupFeedService ou um CustomerFeed usando o CustomerFeedService.

5. Programar quando os itens do feed devem ser ativados (opcional)

Se preferir, você pode especificar os dias e horários em que os FeedItems estarão ativados. Para isso, adicione um FeedItemScheduling a um objeto do FeedItem, conforme mostrado abaixo:

// Create and set the days and time.
FeedItemSchedule schedule = new FeedItemSchedule();
schedule.setDayOfWeek(dayOfWeek);
schedule.setStartHour(startHour);
schedule.setEndHour(endHour);
schedule.setStartMinute(startMinute);
schedule.setEndMinute(endMinute);

// Create the feed item scheduling.
FeedItemScheduling scheduling = new FeedItemScheduling();
scheduling.setFeedItemSchedules(new FeedItemSchedule[] {schedule});
item.setScheduling(scheduling);
Se você quiser redefinir a programação, defina o FeedItemScheduling vazio, conforme mostrado no código abaixo.

private static FeedItemOperation newSiteLinkFeedItemOperationResetScheduling(
    Long feedId, Long feedItemId) {
  // Create the feed item and operation.
  FeedItem feedItem = new FeedItem();
  feedItem.setFeedId(feedId);
  feedItem.setFeedItemId(feedItemId);

  FeedItemScheduling scheduling = new FeedItemScheduling();
  feedItem.setScheduling(scheduling);

  FeedItemOperation operation = new FeedItemOperation();
  operation.setOperand(feedItem);
  operation.setOperator(Operator.SET);
  return operation;
}

Código-fonte completo

Consulte os seguintes exemplos de código nas nossas bibliotecas cliente para saber mais sobre serviços de feeds.
Biblioteca Exemplo de AddSitelinksUsingFeeds
Java AddSitelinksUsingFeeds.java
Perl add_site_links_using_feeds.pl
PHP AddSitelinksUsingFeeds.php
Python add_site_links_using_feeds.py
Ruby add_site_links_using_feeds.rb
.NET (C#) AddSitelinksUsingFeeds.cs
.NET (VB) AddSitelinksUsingFeeds.vb

Enviar comentários sobre…

Precisa de ajuda? Acesse nossa página de suporte.