Развернутые текстовые объявления

Развернутые текстовые объявления – это следующее поколение стандартных текстовых объявлений AdWords. Главная отличительная особенность нового формата – более длинный текст с более предсказуемым отображением. Другие особенности развернутых текстовых объявлений:

Два заголовка
В развернутых тестовых объявлениях можно использовать два заголовка. Первый заголовок отделяется от второго знаком тире. При показе на мобильных устройствах такой заголовок может занимать две строки.
Больше текста
Каждый из заголовков может содержать до 30 символов (это больше, чем в заголовках стандартных текстовых объявлений). Double–width characters such as Chinese, Japanese, and Korean allow for 15 characters.
Расширенное описание
В развернутых тестовых объявлениях используется только одна строка описания длинной до 80 символов. При этом применение усечения и многоточия сведено к минимуму, что делает отображение объявлений более предсказуемым.
Настройка URL
Указывать отображаемый URL для таких объявлений не требуется, поскольку он генерируется на основе адреса целевой страницы и полей пути (path1 и path2), содержащих информацию о том, куда будет направлен пользователь, нажавший на объявление. Принцип действия конечного URL и URL отслеживания в развернутых текстовых объявлениях тот же, что и в обычных.

Ниже приведен пример загруженного через API AdWords объявления вымышленной компании Interplanetary Cruises в пользовательском интерфейсе AdWords.

Поля в этом развернутом текстовом объявлении имеют следующие значения:

Поле Значение
headlinePart1 Cruise to Mars #12QjNuTP
headlinePart2 Best Space Cruise Line
description Buy your tickets now!
finalUrls ["http://www.example.com/0"]
path1 all-inclusive
path2 deals

Совместимость

Развернутые текстовые объявления можно создавать и использовать как в тестовых, так и в основных аккаунтах.

Пример

Рассмотрим подробнее код приведенного выше объявления компании Interplanetary Cruises.

Как и другие типы объявлений, объекты ExpandedTextAd можно добавлять с помощью метода AdGroupAdService.mutate(). В них необходимо указать два заголовка, описание и по меньшей мере один конечный URL.

Java

public static void runExample(
    AdWordsServices adWordsServices, AdWordsSession session, long adGroupId) throws Exception {
  // Get the AdGroupAdService.
  AdGroupAdServiceInterface adGroupAdService =
      adWordsServices.get(session, AdGroupAdServiceInterface.class);

  List<AdGroupAdOperation> operations = Lists.newArrayList();

  for (int i = 0; i < NUMBER_OF_ADS; i++) {
    // Create expanded text ad.
    ExpandedTextAd expandedTextAd = new ExpandedTextAd();
    expandedTextAd.setHeadlinePart1(String.format("Cruise #%d to Mars", i));
    expandedTextAd.setHeadlinePart2("Best Space Cruise Line");
    expandedTextAd.setDescription("Buy your tickets now!");
    expandedTextAd.setFinalUrls(new String[] {"http://www.example.com/" + i});

    // Create ad group ad.
    AdGroupAd expandedTextAdGroupAd = new AdGroupAd();
    expandedTextAdGroupAd.setAdGroupId(adGroupId);
    expandedTextAdGroupAd.setAd(expandedTextAd);

    // Optional: set the status.
    expandedTextAdGroupAd.setStatus(AdGroupAdStatus.PAUSED);

    // Create the operation.
    AdGroupAdOperation adGroupAdOperation = new AdGroupAdOperation();
    adGroupAdOperation.setOperand(expandedTextAdGroupAd);
    adGroupAdOperation.setOperator(Operator.ADD);

    operations.add(adGroupAdOperation);
  }

  // Add ads.
  AdGroupAdReturnValue result =
      adGroupAdService.mutate(operations.toArray(new AdGroupAdOperation[operations.size()]));

  // Display ads.
  for (AdGroupAd adGroupAdResult : result.getValue()) {
    ExpandedTextAd newAd = (ExpandedTextAd) adGroupAdResult.getAd();
    System.out.printf("Expanded text ad with ID %d and headline '%s - %s' was added.%n",
        newAd.getId(), newAd.getHeadlinePart1(), newAd.getHeadlinePart2());
  }
}

C#

// Get the AdGroupAdService.
AdGroupAdService service =
    (AdGroupAdService) user.GetService(AdWordsService.v201609.AdGroupAdService);

List<AdGroupAdOperation> operations = new List<AdGroupAdOperation>();

for (int i = 0; i < NUMBER_OF_ADS; i++) {
  // Create the expanded text ad.
  ExpandedTextAd expandedTextAd = new ExpandedTextAd();
  expandedTextAd.headlinePart1 = "Cruise #" + i .ToString() + " to Mars";
  expandedTextAd.headlinePart2 = "Best Space Cruise Line";
  expandedTextAd.description = "Buy your tickets now!";
  expandedTextAd.finalUrls = new string[] { "http://www.example.com/" + i };

  AdGroupAd expandedTextAdGroupAd = new AdGroupAd();
  expandedTextAdGroupAd.adGroupId = adGroupId;
  expandedTextAdGroupAd.ad = expandedTextAd;

  // Optional: Set the status.
  expandedTextAdGroupAd.status = AdGroupAdStatus.PAUSED;

  // Create the operation.
  AdGroupAdOperation operation = new AdGroupAdOperation();
  operation.@operator = Operator.ADD;
  operation.operand = expandedTextAdGroupAd;

  operations.Add(operation);
}

AdGroupAdReturnValue retVal = null;

try {
  // Create the ads.
  retVal = service.mutate(operations.ToArray());

  // Display the results.
  if (retVal != null && retVal.value != null) {
    foreach (AdGroupAd adGroupAd in retVal.value) {
      ExpandedTextAd newAd = adGroupAd.ad as ExpandedTextAd;
      Console.WriteLine("Expanded text ad with ID '{0}' and headline '{1} - {2}' was added.",
          newAd.id, newAd.headlinePart1, newAd.headlinePart2);
    }
  } else {
    Console.WriteLine("No expanded text ads were created.");
  }
} catch (Exception e) {
  throw new System.ApplicationException("Failed to create expanded text ad.", e);
}

PHP

function AddExpandedTextAdsExample(AdWordsUser $user, $adGroupId) {
  // Get the service, which loads the required classes.
  $adGroupAdService = $user->GetService('AdGroupAdService', ADWORDS_VERSION);

  // Create an expanded text ad.
  $expandedTextAd = new ExpandedTextAd();
  $expandedTextAd->headlinePart1 = 'Cruise to Mars #' . uniqid();
  $expandedTextAd->headlinePart2 = 'Best Space Cruise Line';
  $expandedTextAd->description = 'Buy your tickets now!';
  $expandedTextAd->finalUrls = array('http://www.example.com');
  $expandedTextAd->path1 = 'all-inclusive';
  $expandedTextAd->path2 = 'deals';

  // Create ad group ad.
  $adGroupAd = new AdGroupAd();
  $adGroupAd->adGroupId = $adGroupId;
  $adGroupAd->ad = $expandedTextAd;

  // Set additional settings (optional).
  $adGroupAd->status = 'PAUSED';

  // Create operation.
  $operation = new AdGroupAdOperation();
  $operation->operand = $adGroupAd;
  $operation->operator = 'ADD';

  $operations = array($operation);

  // Make the mutate request.
  $result = $adGroupAdService->mutate($operations);

  // Display results.
  foreach ($result->value as $adGroupAd) {
    printf(
        "Expanded text ad with ID '%d' and headline '%s - %s' was added.\n",
        $adGroupAd->ad->id,
        $adGroupAd->ad->headlinePart1,
        $adGroupAd->ad->headlinePart2
    );
  }
}

Perl

sub add_expanded_text_ads {
  my $client      = shift;
  my $ad_group_id = shift;

  my $num_ads    = 5;
  my @operations = ();
  for (my $i = 0 ; $i < $num_ads ; $i++) {
    # Create text ad.
    my $expanded_text_ad = Google::Ads::AdWords::v201609::ExpandedTextAd->new({
        headlinePart1 => "Cruise to Mars #" . substr(uniqid(), 0, 8),
        headlinePart2 => "Best Space Cruise Line",
        description   => "Buy your tickets now!",
        finalUrls     => ["http://www.example.com/" . $i],
        path1         => "all-inclusive",
        path2         => "deals"
    });

    # Create ad group ad for the expanded text ad.
    my $ad_group_ad = Google::Ads::AdWords::v201609::AdGroupAd->new({
        adGroupId => $ad_group_id,
        ad        => $expanded_text_ad,
        # Additional properties (non-required).
        status => "PAUSED"
    });

    # Create operation.
    my $ad_group_ad_operation =
      Google::Ads::AdWords::v201609::AdGroupAdOperation->new({
        operator => "ADD",
        operand  => $ad_group_ad
      });
    push @operations, $ad_group_ad_operation;
  }

  # Add expanded text ad.
  my $result =
    $client->AdGroupAdService()->mutate({operations => \@operations});

  # Display results.
  if ($result->get_value()) {
    foreach my $ad_group_ad (@{$result->get_value()}) {
      printf "New expanded text ad with id \"%d\" and " .
        "headline \"%s - %s\" was added.\n",
        $ad_group_ad->get_ad()->get_id(),
        $ad_group_ad->get_ad()->get_headlinePart1(),
        $ad_group_ad->get_ad()->get_headlinePart2();
    }
  } else {
    print "No expanded text ads were added.\n";
  }

  return 1;
}

Python

def main(client, ad_group_id):
  # Initialize appropriate service.
  ad_group_ad_service = client.GetService('AdGroupAdService', version='v201609')

  operations = [
      {
          'operator': 'ADD',
          'operand': {
              'xsi_type': 'AdGroupAd',
              'adGroupId': ad_group_id,
              'ad': {
                  'xsi_type': 'ExpandedTextAd',
                  'headlinePart1': ('Cruise #%s to Mars'
                                    % str(uuid.uuid4())[:8]),
                  'headlinePart2': 'Best Space Cruise Line',
                  'description': 'Buy your tickets now!',
                  'finalUrls': ['http://www.example.com/%s' % i],
              },
              # Optional fields.
              'status': 'PAUSED'
          }
      } for i in range(NUMBER_OF_ADS)
  ]
  ads = ad_group_ad_service.mutate(operations)

  # Display results.
  for ad in ads['value']:
    print ('Ad of type "%s" with id "%d" was added.'
           '\n\theadlinePart1: %s\n\theadlinePart2: %s'
           % (ad['ad']['Ad.Type'], ad['ad']['id'],
              ad['ad']['headlinePart1'], ad['ad']['headlinePart2']))

Ruby

ad_group_ad_srv = adwords.service(:AdGroupAdService, API_VERSION)

# Create text ads.
# The 'xsi_type' field allows you to specify the xsi:type of the object
# being created. It's only necessary when you must provide an explicit
# type that the client library can't infer.
operations = 5.times.map do |i|
  expanded_text_ad = {
    :xsi_type => 'ExpandedTextAd',
    :headline_part1 => 'Cruise to Mars #%d' % (Time.new.to_f * 1000).to_i,
    :headline_part2 => 'Best Space Cruise Line',
    :description => 'Buy your tickets now!',
    :final_urls => ['http://www.example.com/%d' % i],
    :path1 => 'all-inclusive',
    :path2 => 'deals'
  }

  ad_group_ad = {
    :ad_group_id => ad_group_id,
    :ad => expanded_text_ad,
    # Additional properties (non-required).
    :status => 'PAUSED'
  }

  operation = {
    :operator => 'ADD',
    :operand => ad_group_ad
  }
end

# Add ads.
response = ad_group_ad_srv.mutate(operations)
if response and response[:value]
  response[:value].each do |ad_group_ad|
    puts ('New expanded text ad with id "%d" and headline "%s - %s" was ' +
        'added.') % [ad_group_ad[:ad][:id], ad_group_ad[:ad][:headline_part1],
        ad_group_ad[:ad][:headline_part2]]
  end
else
  raise StandardError, 'No ads were added.'
end

Чтобы получить созданные объявления, вызовите AdGroupAdService.get() с фильтрацией по AdType EXPANDED_TEXT_AD в предикате.

Java

public static void runExample(
    AdWordsServices adWordsServices, AdWordsSession session, Long adGroupId) throws Exception {
  // Get the AdGroupAdService.
  AdGroupAdServiceInterface adGroupAdService =
      adWordsServices.get(session, AdGroupAdServiceInterface.class);

  int offset = 0;
  boolean morePages = true;

  // Create selector.
  SelectorBuilder builder = new SelectorBuilder();
  Selector selector =
      builder
          .fields(
              AdGroupAdField.Id,
              AdGroupAdField.Status,
              AdGroupAdField.HeadlinePart1,
              AdGroupAdField.HeadlinePart2,
              AdGroupAdField.Description)
          .orderAscBy(AdGroupAdField.Id)
          .offset(offset)
          .limit(PAGE_SIZE)
          .equals(AdGroupAdField.AdGroupId, adGroupId.toString())
          .in(AdGroupAdField.Status, "ENABLED", "PAUSED")
          .equals("AdType", "EXPANDED_TEXT_AD")
          .build();

  while (morePages) {
    // Get all ads.
    AdGroupAdPage page = adGroupAdService.get(selector);

    // Display ads.
    if (page.getEntries() != null && page.getEntries().length > 0) {
      for (AdGroupAd adGroupAd : page.getEntries()) {
        ExpandedTextAd expandedTextAd = (ExpandedTextAd) adGroupAd.getAd();
        System.out.printf(
            "Expanded text ad with ID %d, status '%s', and headline '%s - %s' was found.%n",
            adGroupAd.getAd().getId(),
            adGroupAd.getStatus(),
            expandedTextAd.getHeadlinePart1(),
            expandedTextAd.getHeadlinePart2());
      }
    } else {
      System.out.println("No expanded text ads were found.");
    }

    offset += PAGE_SIZE;
    selector = builder.increaseOffsetBy(PAGE_SIZE).build();
    morePages = offset < page.getTotalNumEntries();
  }
}

C#

// Get the AdGroupAdService.
AdGroupAdService service =
    (AdGroupAdService) user.GetService(AdWordsService.v201609.AdGroupAdService);

// Create a selector.
Selector selector = new Selector() {
  fields = new string[] {
    ExpandedTextAd.Fields.Id, AdGroupAd.Fields.Status, ExpandedTextAd.Fields.HeadlinePart1,
    ExpandedTextAd.Fields.HeadlinePart2, ExpandedTextAd.Fields.Description
  },
  ordering = new OrderBy[] { OrderBy.Asc(ExpandedTextAd.Fields.Id) },
  predicates = new Predicate[] {
    // Restrict the fetch to only the selected ad group id.
    Predicate.Equals(AdGroupAd.Fields.AdGroupId, adGroupId),

    // Retrieve only expanded text ads.
    Predicate.Equals("AdType", "EXPANDED_TEXT_AD"),

    // By default disabled ads aren't returned by the selector. To return
    // them include the DISABLED status in the statuses field.
    Predicate.In(AdGroupAd.Fields.Status, new string[] {
      AdGroupAdStatus.ENABLED.ToString(),
      AdGroupAdStatus.PAUSED.ToString(),
      AdGroupAdStatus.DISABLED.ToString()
    })
  },
  paging = Paging.Default
};

AdGroupAdPage page = new AdGroupAdPage();

try {
  do {
    // Get the expanded text ads.
    page = service.get(selector);

    // Display the results.
    if (page != null && page.entries != null) {
      int i = selector.paging.startIndex;

      foreach (AdGroupAd adGroupAd in page.entries) {
        ExpandedTextAd expandedTextAd = (ExpandedTextAd) adGroupAd.ad;
        Console.WriteLine("{0} : Expanded text ad with ID '{1}', headline '{2} - {3}' " +
            "and description '{4} was found.", i + 1, expandedTextAd.id,
            expandedTextAd.headlinePart1, expandedTextAd.headlinePart2,
            expandedTextAd.description);
        i++;
      }
    }
    selector.paging.IncreaseOffset();
  } while (selector.paging.startIndex < page.totalNumEntries);
  Console.WriteLine("Number of expanded text ads found: {0}", page.totalNumEntries);
} catch (Exception e) {
  throw new System.ApplicationException("Failed to get expanded text ads", e);
}

PHP

function GetExpandedTextAdsExample(AdWordsUser $user, $adGroupId) {
  // Get the service, which loads the required classes.
  $adGroupAdService = $user->GetService('AdGroupAdService', ADWORDS_VERSION);

  // Create selector.
  $selector = new Selector();
  $selector->fields =
      array('Id', 'Status', 'HeadlinePart1', 'HeadlinePart2', 'Description');
  $selector->ordering[] = new OrderBy('Id', 'ASCENDING');

  // Create predicates.
  $selector->predicates[] = new Predicate('AdGroupId', 'IN', array($adGroupId));
  $selector->predicates[] =
      new Predicate('AdType', 'IN', array('EXPANDED_TEXT_AD'));
  $selector->predicates[] =
      new Predicate('Status', 'IN', array('ENABLED', 'PAUSED'));

  // Create paging controls.
  $selector->paging = new Paging(0, AdWordsConstants::RECOMMENDED_PAGE_SIZE);

  do {
    // Make the get request.
    $page = $adGroupAdService->get($selector);

    // Display results.
    if (isset($page->entries)) {
      foreach ($page->entries as $adGroupAd) {
        printf(
            "Expanded text ad with ID '%d' status '%s', and headline '%s - %s' "
                . "was found.\n",
            $adGroupAd->ad->id,
            $adGroupAd->status,
            $adGroupAd->ad->headlinePart1,
            $adGroupAd->ad->headlinePart2
        );
      }
    } else {
      print "No expanded text ads were found.\n";
    }

    // Advance the paging index.
    $selector->paging->startIndex += AdWordsConstants::RECOMMENDED_PAGE_SIZE;
  } while ($page->totalNumEntries > $selector->paging->startIndex);
}

Perl

sub get_expanded_text_ads {
  my $client      = shift;
  my $ad_group_id = shift;

  # Create predicates.
  my $ad_group_predicate = Google::Ads::AdWords::v201609::Predicate->new({
      field    => "AdGroupId",
      operator => "IN",
      values   => [$ad_group_id]});
  my $status_predicate = Google::Ads::AdWords::v201609::Predicate->new({
      field    => "Status",
      operator => "IN",
      values   => ["ENABLED", "PAUSED"]});
  my $ad_type_predicate = Google::Ads::AdWords::v201609::Predicate->new({
      field    => "AdType",
      operator => "EQUALS",
      values   => ["EXPANDED_TEXT_AD"]});

  # Create selector.
  my $paging = Google::Ads::AdWords::v201609::Paging->new({
      startIndex    => 0,
      numberResults => PAGE_SIZE
  });
  my $selector = Google::Ads::AdWords::v201609::Selector->new({
      fields =>
        ["Id", "Status", "HeadlinePart1", "HeadlinePart2", "Description"],
      predicates =>
        [$ad_group_predicate, $status_predicate, $ad_type_predicate],
      ordering => [
        Google::Ads::AdWords::v201609::OrderBy->new({
            field     => "Id",
            sortOrder => "ASCENDING"
          })
      ],
      paging => $paging
    });

  # Paginate through results.
  # The contents of the subroutine will be executed for each text ad.
  Google::Ads::AdWords::Utilities::PageProcessor->new({
      client   => $client,
      service  => $client->AdGroupAdService(),
      selector => $selector
    }
    )->process_entries(
    sub {
      my ($ad_group_ad) = @_;
      printf "Expanded text ad with id \"%d\", status \"%s\", and " .
        "headline \"%s - %s\" was found.\n",
        $ad_group_ad->get_ad()->get_id(),
        $ad_group_ad->get_status(),
        $ad_group_ad->get_ad()->get_headlinePart1(),
        $ad_group_ad->get_ad()->get_headlinePart2();
    });

  return 1;
}

Python

def main(client, ad_group_id):
  # Initialize appropriate service.
  ad_group_ad_service = client.GetService('AdGroupAdService', version='v201609')

  # Construct selector and get all ads for a given ad group.
  offset = 0
  selector = {
      'fields': ['Id', 'AdGroupId', 'Status', 'HeadlinePart1', 'HeadlinePart2',
                 'Description'],
      'predicates': [
          {
              'field': 'AdGroupId',
              'operator': 'EQUALS',
              'values': [ad_group_id]
          },
          {
              'field': 'AdType',
              'operator': 'EQUALS',
              'values': ['EXPANDED_TEXT_AD']
          }
      ],
      'paging': {
          'startIndex': str(offset),
          'numberResults': str(PAGE_SIZE)
      },
      'ordering': [
          {
              'field': 'Id',
              'sortOrder': 'ASCENDING'
          }
      ]
  }
  more_pages = True
  while more_pages:
    page = ad_group_ad_service.get(selector)

    # Display results.
    if 'entries' in page:
      for ad in page['entries']:
        print ('ExpandedTextAd with id "%d", AdGroupId "%d", status "%s", '
               'headlinePart1 "%s", headlinePart2 "%s", description "%s" was '
               'found.' % (ad['ad']['id'], ad['adGroupId'], ad['status'],
                           ad['ad']['headlinePart1'], ad['ad']['headlinePart2'],
                           ad['ad']['description']))
    else:
      print 'No ads were found.'
    offset += PAGE_SIZE
    selector['paging']['startIndex'] = str(offset)
    more_pages = offset < int(page['totalNumEntries'])

Ruby

ad_group_ad_srv = adwords.service(:AdGroupAdService, API_VERSION)

# Get all the ads for this ad group.
selector = {
  :fields => ['Id', 'Status', 'HeadlinePart1', 'HeadlinePart2',
      'Description'],
  :ordering => [{:field => 'Id', :sort_order => 'ASCENDING'}],
  # By default, disabled ads aren't returned by the selector. To return them,
  # include the DISABLED status in a predicate.
  :predicates => [
    {
      :field => 'AdGroupId',
      :operator => 'IN',
      :values => [ad_group_id]
    },
    {
      :field => 'Status',
      :operator => 'IN',
      :values => ['ENABLED', 'PAUSED']
    },
    {
      :field => 'AdType',
      :operator => 'EQUALS',
      :values => ['EXPANDED_TEXT_AD']
    }
  ],
  :paging => {
    :start_index => 0,
    :number_results => PAGE_SIZE
  }
}

# Set initial values.
offset, page = 0, {}

begin
  page = ad_group_ad_srv.get(selector)
  if page[:entries]
    page[:entries].each do |ad_group_ad|
      puts ('Expanded text ad with ID "%d", status "%s", and headline ' +
          '"%s - %s" was found.') % [ad_group_ad[:ad][:id],
          ad_group_ad[:status], ad_group_ad[:ad][:headline_part1],
          ad_group_ad[:ad][:headline_part2]]
    end
    # Increment values to request the next page.
    offset += PAGE_SIZE
    selector[:paging][:start_index] = offset
  end
end while page[:total_num_entries] > offset

if page.include?(:total_num_entries)
  puts "\tAd group ID %d has %d expanded text ad(s)." %
      [ad_group_id, page[:total_num_entries]]
end

Отчеты

Развернутые текстовые объявления соответствуют значению EXPANDED_TEXT_AD поля AdType. Чтобы упростить получение данных, связанных с такими объявлениями, в отчете по эффективности объявлений используются следующие поля:

Советы по переходу на новый формат

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

Чтобы перейти на новый формат, выполните следующие действия:

  1. В режиме PAUSED создайте развернутое текстовое объявление, используя данные стандартного. Обратите внимание, что длина строки description1 в стандартных текстовых объявлениях ограничена 35 символами, а длина headlinePart2 в развернутых – 30 символами. Поэтому простое копирование из description1 в headlinePart2 приведет к ошибке.

  2. Дождитесь, пока approvalStatus развернутого текстового объявления не изменится на APPROVED.

  3. Отправьте запрос AdGroupAdService.mutate(), выполнив две операции:

    • Для поля status развернутого текстового объявления установите значение ENABLED.
    • Для поля status стандартного текстового объявления установите значение DISABLED.

Примеры кода

Примеры полного кода можно найти по ссылкам ниже.

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

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