Dienste zur Einrichtung von Erweiterungen

Dienste zur Einrichtung von Erweiterungen verwenden

Angenommen, Sie werben in AdWords für ein Restaurant. Sie haben bereits eine AdWords-Kampagne eingerichtet, möchten jedoch die folgenden zusätzlichen Informationen zu Ihrem Unternehmen präsentieren:

  • Store hours (Öffnungszeiten): Über diesen Link werden Nutzer auf http://www.example.com/storehours weitergeleitet.
  • Nutrition data: (Nährwertinformationen): Über diesen Link werden Nutzer auf http://www.example.com/menu/nutritiondata weitergeleitet. Dort sind Nährwertinformationen zu einzelnen Speisen aufgelistet.
  • Happy hours:Über diesen Link werden Nutzer auf http://www.example.com/happyhours weitergeleitet. Er ist aber nur zu diesen Zeiten sichtbar: Montag bis Freitag von 18:00 bis 21:00 Uhr und Samstag von 17:00 bis 20:00 Uhr.
  • Thanksgiving special (Special zum Erntedankfest): Sie planen ein spezielles Erntedankfestmenü vom 27. bis 28. November. Dieser Link soll nur vom 20. bis 27. November zu sehen sein, damit Nutzer unter http://www.example.com/thanksgiving reservieren können.

Jedes der oben genannten Elemente ist eine Anzeigenerweiterung in AdWords. Sie können Anzeigenerweiterungen mit den Diensten zur Einrichtung von Erweiterungen in der AdWords API verwalten.

Anzeigenerweiterungen hinzufügen

Anzeigenerweiterungen können auf der Konto-, Kampagnen- oder Anzeigengruppenebene hinzugefügt werden. Allerdings sind nicht alle Erweiterungstypen auf allen Ebenen verfügbar. Verwenden Sie für neue Anzeigenerweiterungen den Operator ADD oder SET. Wenn der Operator SET verwendet wird und keine Anzeigenerweiterung vorhanden ist, wird eine neue Anzeigenerweiterung hinzugefügt. Folgende Anzeigenerweiterungen sind verfügbar:

Mithilfe von Sitelinks können Sie die Nutzer auf bestimmte Unterseiten Ihrer Website verweisen (anstatt auf die Zielseite), sodass sich die Besucher besser auf der Website zurechtfinden.

Im folgenden Code-Snippet wird gezeigt, wie Sie einer Kampagne mit CampaignExtensionSettingService neue Anzeigenerweiterungen hinzufügen.

// Get the CampaignExtensionSettingService.
CampaignExtensionSettingService campaignExtensionSettingService =
    (CampaignExtensionSettingService) user.GetService(
         AdWordsService.v201705.CampaignExtensionSettingService);

CampaignExtensionSetting campaignExtensionSetting =
    new CampaignExtensionSetting();
campaignExtensionSetting.campaignId = campaignId;
campaignExtensionSetting.extensionType = FeedType.SITELINK;

SitelinkFeedItem link1 = new SitelinkFeedItem() {
    sitelinkText = "Store Hours",
    sitelinkUrl = "http://www.example.com/storehours"
};

SitelinkFeedItem link2 = new SitelinkFeedItem() {
    sitelinkText = "Thanksgiving Specials",
    sitelinkUrl = "http://www.example.com/thanksgiving",
    startTime = "20141120 000000 EST",
    endTime = "20141127 235959 EST",

    // Target this sitelink for United States only. See
    // https://developers.google.com/adwords/api/docs/appendix/geotargeting
    // for valid geolocation codes.
    geoTargeting = new Location () {
      id = 2840
    };
};

SitelinkFeedItem link3 = new SitelinkFeedItem() {
    sitelinkText = "Nutrition Data",
    sitelinkUrl = "http://www.example.com/menu/nutritiondata"
};

SitelinkFeedItem link4 = new SitelinkFeedItem() {
    sitelinkText = "Happy hours",
    sitelinkUrl = "http://www.example.com/happyhours",
    scheduling = new FeedItemSchedule[] {
        new FeedItemSchedule() {
            dayOfWeek = AdWords.v201705.DayOfWeek.MONDAY,
            startHour = 18,
            startMinute = MinuteOfHour.ZERO,
            endHour = 21,
            endMinute = MinuteOfHour.ZERO
        },
        new FeedItemSchedule() {
            dayOfWeek = AdWords.v201705.DayOfWeek.TUESDAY,
            startHour = 18,
            startMinute = MinuteOfHour.ZERO,
            endHour = 21,
            endMinute = MinuteOfHour.ZERO
        },
        new FeedItemSchedule() {
            dayOfWeek = AdWords.v201705.DayOfWeek.WEDNESDAY,
            startHour = 18,
            startMinute = MinuteOfHour.ZERO,
            endHour = 21,
            endMinute = MinuteOfHour.ZERO
        },
        new FeedItemSchedule() {
            dayOfWeek = AdWords.v201705.DayOfWeek.THURSDAY,
            startHour = 18,
            startMinute = MinuteOfHour.ZERO,
            endHour = 21,
            endMinute = MinuteOfHour.ZERO
        },
        new FeedItemSchedule() {
            dayOfWeek = AdWords.v201705.DayOfWeek.FRIDAY,
            startHour = 18,
            startMinute = MinuteOfHour.ZERO,
            endHour = 21,
            endMinute = MinuteOfHour.ZERO
        },
        new FeedItemSchedule() {
            dayOfWeek = AdWords.v201705.DayOfWeek.SATURDAY,
            startHour = 17,
            startMinute = MinuteOfHour.ZERO,
            endHour = 21,
            endMinute = MinuteOfHour.ZERO
        }
    }
};

campaignExtensionSetting.extensionSetting = new ExtensionSetting() {
    extensions = new ExtensionFeedItem[] {
        link1, link2, link3, link4
    },
};

CampaignExtensionSettingOperation operation = new CampaignExtensionSettingOperation() {
    operand = campaignExtensionSetting,
    @operator = Operator.ADD,
};

CampaignExtensionSettingReturnValue retVal = campaignExtensionSettingService.mutate(
    new CampaignExtensionSettingOperation[] {operation});

Anruferweiterungen

Mit einer CallFeedItem-Erweiterung können Sie Ihren Anzeigen eine geschäftliche Telefonnummer hinzufügen, die Nutzer direkt über die Anzeige anrufen können. Das folgende Code-Snippet zeigt, wie das funktioniert:

CallFeedItem callFeedItem = new CallFeedItem() {
    callCountryCode = "US",
    callPhoneNumber = "212-565-0000",
};

CampaignExtensionSetting campaignExtensionSetting =
    new CampaignExtensionSetting();
campaignExtensionSetting.campaignId = campaignId;

campaignExtensionSetting.extensionSetting = new ExtensionSetting() {
    extensions = new ExtensionFeedItem[] { callFeedItem },
};

Rezensionserweiterungen

Mit einer Rezensionserweiterung können Rezensionen neben Ihren Anzeigen aufgelistet werden. Das folgende Code-Snippet zeigt, wie eine Rezensionserweiterung erstellt wird:

ReviewFeedItem reviewFeeditem = new ReviewFeedItem() {
    reviewSourceName = "Example Food review magazine",
    reviewSourceUrl =
        "http://www.example.com/reviews/2014/03/the-amazing-example-hotel",
    reviewText = "The best food in New York city!",
    reviewTextExactlyQuoted = true
};

CampaignExtensionSetting campaignExtensionSetting =
    new CampaignExtensionSetting();
campaignExtensionSetting.campaignId = campaignId;

campaignExtensionSetting.extensionSetting = new ExtensionSetting() {
    extensions = new ExtensionFeedItem[] { reviewFeeditem },
};

Erweiterungen mit Zusatzinformationen

Über eine Anzeigenerweiterung mit Zusatzinformationen können Sie direkt unter Ihren Suchanzeigen weitere Details wie die angebotenen Produkte oder Dienstleistungen angeben. Das folgende Code-Snippet zeigt, wie eine Erweiterung mit Zusatzinformationen erstellt wird:

CalloutFeedItem freeDeliveryCallout = new CalloutFeedItem() {
   calloutText = "Free delivery",
};
CalloutFeedItem kidsCallout = new CalloutFeedItem() {
   calloutText = "Kids eat free",
};

CampaignExtensionSetting campaignExtensionSetting = new CampaignExtensionSetting();
campaignExtensionSetting.campaignId = campaignId;
campaignExtensionSetting.extensionType = FeedType.CALLOUT;
campaignExtensionSetting.extensionSetting = new ExtensionSetting() {
    extensions = new ExtensionFeedItem[] {
        freeDeliveryCallout, kidsCallout
    }
};

App-Erweiterungen

Wenn Ihr Unternehmen eine Android- oder iOS-App für Nutzer von Mobilgeräten entwickelt hat, können Sie mithilfe einer App-Erweiterung bei Ihren Anzeigen Links zu der App präsentieren. App-Erweiterungen werden nur Nutzern angezeigt, die gerade bei Google angemeldet sind und Ihre App noch nicht installiert haben. Ein Klick auf den App-Erweiterungslink leitet sie auf die Google Play- oder Apple iTunes-Seite für Ihre App weiter. Mit diesem Code-Snippet wird gezeigt, wie Sie eine App-Erweiterung für eine App bei Google Play erstellen können:

AppFeedItem appFeedItem = new AppFeedItem() {
    appId = "com.example.mobileapp",
    appStore = AppFeedItemAppStore.GOOGLE_PLAY,
    appLinkText = "Install our mobile app!",
    appUrl = "https://play.google.com/store/apps/details?id=com.example.mobileapp"
};

CampaignExtensionSetting campaignExtensionSetting =
    new CampaignExtensionSetting();
campaignExtensionSetting.campaignId = campaignId;

campaignExtensionSetting.extensionSetting = new ExtensionSetting() {
    extensions = new ExtensionFeedItem[] { appFeedItem },
};

SMS-Erweiterungen

Wenn Nutzer eine Anzeige mit einer SMS-Erweiterung sehen, können sie darin auf ein Symbol klicken und sich direkt per SMS an Sie wenden. Mit nur einem Tipp auf Ihre Anzeige können Nutzer einen Termin buchen, ein Angebot erhalten, nach Informationen fragen oder eine Dienstleistung anfordern. Im folgenden Code-Snippet wird gezeigt, wie Sie diese Erweiterungen mithilfe eines MessageFeedItem verwenden:

MessageFeedItem messageFeedItem = new MessageFeedItem() {
    messageBusinessName = "Travel Here",
    messageCountryCode = "US",
    messagePhoneNumber = "212-565-0000",
    messageText = "I want to know more.",
    messageExtensionText = "Ask us about travel.",
};

CampaignExtensionSetting campaignExtensionSetting =
    new CampaignExtensionSetting();
campaignExtensionSetting.campaignId = campaignId;

campaignExtensionSetting.extensionSetting = new ExtensionSetting() {
    extensions = new ExtensionFeedItem[] { messageFeedItem },
};

Preiserweiterungen

Über Preiserweiterungen bieten Sie Nutzern die Möglichkeit, Details und Preise Ihrer Produkte oder Dienstleistungen zu vergleichen. Hierzu geben Sie eine Liste mit Dienstleistungen, Produkten, Veranstaltungen oder anderen Elementen zusammen mit einer Liste der Preise ein, die Nutzer sehen sollen.

Preiserweiterungen sind genau wie andere Erweiterungstypen vollständig konfigurierbar und können umfassend ausgerichtet werden. Sie enthalten Titel, Beschreibungen und Preisdetails für drei bis acht Produkte oder Dienstleistungen.

Preiserweiterungen lassen sich auf Konto-, Kampagnen- oder Anzeigengruppenebene hinzufügen.

Mit dem folgenden Code-Snippet wird gezeigt, wie Sie eine Preiserweiterung erstellen können:

// Create the price extension feed item.
PriceFeedItem priceFeedItem = new PriceFeedItem();
priceFeedItem.setPriceExtensionType(PriceExtensionType.SERVICES);

// Price qualifier is optional.
priceFeedItem.setPriceQualifier(PriceExtensionPriceQualifier.FROM);
priceFeedItem.setTrackingUrlTemplate("http://tracker.example.com/?u={lpurl}");
priceFeedItem.setLanguage("en");
FeedItemCampaignTargeting campaignTargeting = new FeedItemCampaignTargeting();
campaignTargeting.setTargetingCampaignId(campaignId);
priceFeedItem.setCampaignTargeting(campaignTargeting);
priceFeedItem.setScheduling(
    new FeedItemScheduling(
        new FeedItemSchedule[] {
          new FeedItemSchedule(DayOfWeek.SUNDAY, 10, MinuteOfHour.ZERO, 18, MinuteOfHour.ZERO),
          new FeedItemSchedule(DayOfWeek.SATURDAY, 10, MinuteOfHour.ZERO, 22, MinuteOfHour.ZERO)
        }));

// To create a price extension, at least three table rows are needed.
List<PriceTableRow> priceTableRows = new ArrayList<>();
String currencyCode = "USD";
priceTableRows.add(
    createPriceTableRow(
        "Scrubs",
        "Body Scrub, Salt Scrub",
        "http://www.example.com/scrubs",
        "http://m.example.com/scrubs",
        60000000,
        currencyCode,
        PriceExtensionPriceUnit.PER_HOUR));
priceTableRows.add(
    createPriceTableRow(
        "Hair Cuts",
        "Once a month",
        "http://www.example.com/haircuts",
        "http://m.example.com/haircuts",
        75000000,
        currencyCode,
        PriceExtensionPriceUnit.PER_MONTH));
priceTableRows.add(
    createPriceTableRow(
        "Skin Care Package",
        "Four times a month",
        "http://www.example.com/skincarepackage",
        null,
        250000000,
        currencyCode,
        PriceExtensionPriceUnit.PER_MONTH));
priceFeedItem.setTableRows(priceTableRows.toArray(new PriceTableRow[priceTableRows.size()]));

// Create your campaign extension settings. This associates the sitelinks
// to your campaign.
CustomerExtensionSetting customerExtensionSetting = new CustomerExtensionSetting();
customerExtensionSetting.setExtensionType(FeedType.PRICE);
ExtensionSetting extensionSetting = new ExtensionSetting();
extensionSetting.setExtensions(new ExtensionFeedItem[] {priceFeedItem});
customerExtensionSetting.setExtensionSetting(extensionSetting);

Der Verweis auf createPriceTableRow ist wie folgt definiert:

/**
 * Creates a new {@link PriceTableRow} with the specified attributes.
 *
 * @param header the header for the row
 * @param description the description for the row
 * @param finalUrl the final URL for the row
 * @param finalMobileUrl the final mobile URL for the row, or null if this field should not be set
 * @param priceInMicros the price for the row, in micros
 * @param currencyCode the currency for the row
 * @param priceUnit the price unit for the row
 * @return a new {@link PriceTableRow}
 */
private static PriceTableRow createPriceTableRow(
    String header,
    String description,
    String finalUrl,
    String finalMobileUrl,
    long priceInMicros,
    String currencyCode,
    PriceExtensionPriceUnit priceUnit) {
  PriceTableRow priceTableRow = new PriceTableRow();
  priceTableRow.setHeader(header);
  priceTableRow.setDescription(description);

  UrlList finalUrls = new UrlList();
  finalUrls.setUrls(new String[] {finalUrl});
  priceTableRow.setFinalUrls(finalUrls);

  if (finalMobileUrl != null) {
    UrlList finalMobileUrls = new UrlList();
    finalMobileUrls.setUrls(new String[] {finalMobileUrl});
    priceTableRow.setFinalMobileUrls(finalMobileUrls);
  }

  MoneyWithCurrency price = new MoneyWithCurrency();
  Money priceMoney = new Money();
  price.setCurrencyCode(currencyCode);
  priceMoney.setMicroAmount(priceInMicros);
  price.setMoney(priceMoney);
  priceTableRow.setPrice(price);
  priceTableRow.setPriceUnit(priceUnit);

  return priceTableRow;
}

Angebotserweiterungen

Mithilfe von Angebotserweiterungen können Sie die Nutzer auf Ausverkäufe und andere Werbeaktionen aufmerksam machen, um ihnen zu zeigen, wie viel sie jetzt sparen können. Es stehen viele Felder zur Verfügung, über die Sie genau anpassen können, was in der Erweiterung dargestellt wird. Die folgenden Felder sind Pflichtfelder:

  • promotionTarget: Text, der auf der Anzeige erscheint, wenn die Erweiterung dargestellt wird
  • percentOff oder moneyAmountOff (eines dieser Felder ist erforderlich): Hier sehen die Nutzer, wie hoch der Rabatt ist.

    • Für percentOff muss ein Wert in millionstel Einheiten angegeben werden, wobei eine Million Einheiten einem Prozent entsprechen. Dieser Wert wird in der Erweiterung als Prozentwert angezeigt. Beispiel: Der Wert 10000000 wird als "10 %" dargestellt.
    • Der Wert von moneyAmountOff ist ebenfalls in millionstel Einheiten anzugeben. Hier ist sowohl eine Währung als auch ein Geldbetrag erforderlich.
  • finalUrls: URL-Ziele Ihrer Zielseite für den Fall, dass ein Nutzer auf die Erweiterung klickt

Optionale Felder:

  • occasion: Anlass, etwa NEW_YEARS oder HALLOWEEN

    • Wenn Sie occasion verwenden, ohne die Dienste zur Einrichtung von Erweiterungen zu nutzen, müssen Sie sicherstellen, dass die Werte genau den dokumentierten Aufzählungswerten für PromotionFeedItem entsprechen.
  • discountModifier: Mit diesem Feld können Sie der Werbeaktion die Wendung "bis zu" hinzufügen, falls die Preisnachlässe bei der Aktion variabel sind.

    • Wenn Sie discountModifier verwenden, ohne die Dienste zur Einrichtung von Erweiterungen zu nutzen, müssen Sie sicherstellen, dass die Werte genau den dokumentierten Aufzählungswerten für PromotionFeedItem entsprechen.
  • promotionCode: Dies ist der Code, den die Nutzer eingeben müssen, um den Rabatt zu erhalten.

  • ordersOverAmount: Mit diesem Feld können Sie festlegen, dass der Nutzer bestimmte Mindestausgaben erreichen muss, damit er die Werbeaktion nutzen kann.

    • Für PromotionFeedItem kann nur entweder promotionCode oder ordersOverAmount angegeben werden, nicht beide Felder gleichzeitig.
  • promotionStart und promotionEnd: Mit diesen Feldern können Sie sicherstellen, dass die Erweiterung nur im Aktionszeitraum dargestellt wird. Hier muss ein DateTime-Format verwendet werden, auch wenn Start- und Endzeit nur auf Mitternacht festgelegt werden können. Wenn die Werbeaktion beispielsweise auf den Monat Juni beschränkt ist, können Sie promotionStart auf "20170601 000000" und promotionEnd auf "20170701 000000" festlegen.

    • Um diese Felder zu löschen, geben Sie den Sonderwert "00000101 000000" an.

Ausführliche Informationen zu den restlichen Feldern finden Sie PromotionFeedItemin der Dokumentation.

Mit diesem Beispiel-Code-Snippet wird gezeigt, wie Sie eine Angebotserweiterung erstellen:

PromotionFeedItem promotionFeedItem = new PromotionFeedItem() {
    promotionTarget = "Wool Socks",
    percentOff = 10000000,
    promotionCode = "WinterSocksDeal",
    finalUrls = new string[] { "http://www.example.com/socks" },
};

CampaignExtensionSetting campaignExtensionSetting =
    new CampaignExtensionSetting();
campaignExtensionSetting.campaignId = campaignId;

campaignExtensionSetting.extensionSetting = new ExtensionSetting() {
    extensions = new ExtensionFeedItem[] { promotionFeedItem },
};

Anzeigenerweiterungen aktualisieren

Angenommen, Sie beschließen, die Happy Hours Ihres Restaurants am Samstag auf 17:00 bis 22:00 Uhr zu ändern.

Der erste Schritt besteht darin, die Liste der vorhandenen Einstellungen abzurufen:

// Get the CampaignExtensionSettingService.
CampaignExtensionSettingService campaignExtensionSettingService =
    (CampaignExtensionSettingService) user.GetService(
         AdWordsService.v201705.CampaignExtensionSettingService);

Selector selector = new Selector() {
    fields = new string[] { "CampaignId", "ExtensionType", "Extensions" },
    predicates = new Predicate[] {
        new Predicate() {
            field = "CampaignId",
            @operator = PredicateOperator.EQUALS,
            values = new string[] {campaignId.ToString()}
        },
        new Predicate() {
            field = "ExtensionType",
            @operator = PredicateOperator.EQUALS,
            values = new string[] {"SITELINK"}
        },
    }
};

CampaignExtensionSettingPage page = campaignExtensionSettingService.get(selector);

Nun wird der gewünschte Sitelink aktualisiert:

CampaignExtensionSetting campaignExtensionSetting = page.entries[0];
foreach (SitelinkFeedItem siteLink in
     campaignExtensionSetting.extensionSetting.extensions) {
  if (siteLink.sitelinkText == "Happy hours") {
    foreach (FeedItemSchedule schedule in siteLink.scheduling) {
      if (schedule.dayOfWeek == AdWords.v201705.DayOfWeek.SATURDAY) {
         schedule.startHour = 17;
         schedule.startMinute = MinuteOfHour.ZERO;
         schedule.endHour = 22;
         schedule.endMinute = MinuteOfHour.ZERO;
      }
    }
  }
}

Zum Schluss wird der geänderte Wert für campaignExtensionSetting an den Server gesendet.

CampaignExtensionSettingOperation operation = new CampaignExtensionSettingOperation() {
  operand = campaignExtensionSetting,
  @operator = Operator.SET,
};

Um zu verhindern, dass die alten Einstellungen durch die neuen Einstellungen überschrieben werden, müssen Sie sämtliche Feedelemente zurücksenden, auch wenn Sie nur ein einziges Element geändert haben.

Anzeigenerweiterungen entfernen

Hinter den Kulissen werden für die Dienste zur Einrichtung von Erweiterungen weiterhin Feeds verwendet, um Ihre Anzeigenerweiterungen zu steuern. Wenn Sie eine neue Erweiterungseinstellung generieren, erstellt der Dienst im entsprechenden Feed Elemente für Sie und verknüpft diese mit der betreffenden Kampagne oder Anzeigengruppe bzw. mit dem Konto – je nachdem, welchen Dienst Sie verwendet haben.

Wenn Sie ein ExtensionFeedItem aus einer Erweiterungseinstellung entfernen oder die Erweiterungseinstellung vollständig löschen, entfernt der Dien die Verknüpfung zwischen den Feedelementen und der zugehörigen Entität. Die Feedelemente selbst werden hingegen nicht entfernt, da sie unter Umständen mit einer anderen Entität verknüpft sind.

Es gibt zwei Methoden, um die Verknüpfung zwischen einem Feedelement und einer Entität zu entfernen:

  1. Sie können die gesamte Erweiterungseinstellung mit einem REMOVE-Operator entfernen. Dadurch wird die Verknüpfung zwischen der Entität und allen Feedelementen in der Erweiterungseinstellung entfernt.
  2. Sie können einzelne ExtensionFeedItem-Objekte in der Erweiterungseinstellung entfernen, indem Sie einen neuen Satz von ExtensionFeedItem-Objekten angeben, in dem die zu entfernenden Elemente nicht vorhanden sind.

In beiden Fällen werden die zugrunde liegenden Feedelemente nicht entfernt. Wenn die Feedelemente nicht mehr mit anderen Entitäten verknüpft sind, sollten Sie in Erwägung ziehen, die Elemente zu löschen. Dadurch wird Speicherplatz freigegeben, sodass Sie später neue Erweiterungen erstellen können. Alternativ können Sie die Feedelemente in anderen Erweiterungseinstellungen wiederverwenden.

Wenn Sie mit den Diensten zur Einrichtung von Erweiterungen erstellten Feedelemente nicht entfernen oder wiederverwenden, wenn Sie die Erweiterungen löschen, häufen sich diese Elemente im Laufe der Zeit an. Dadurch kann dann das Limit für die Anzahl von Feedelementen erreicht werden, die in Ihrem Konto zulässig sind.

Feedelemente löschen

Wenn Sie die zugrunde liegenden Feedelemente löschen möchten, nachdem Sie ihre Verknüpfung mit einer Entität aufgehoben haben, können Sie einfach das entsprechende FeedItem mithilfe der feedId und der feedItemId der gelöschten Erweiterung entfernen.

CampaignExtensionSettingOperation operation = new CampaignExtensionSettingOperation() {
  operand = campaignExtensionSetting,
  @operator = Operator.REMOVE,
};

campaignExtensionSettingService.mutate(new CampaignExtensionSettingOperation[] {operation});

List<FeedItemOperation> operations = new List<FeedItemOperation>();
foreach(ExtensionFeedItem extensionFeedItem in
    campaignExtensionSetting.extensionSetting.extensions) {
  FeedItemOperation operation = new FeedItemOperation() {
    @operator = Operator.REMOVE,
    operand = new FeedItem() {
      feedItemId = extensionFeedItem.feedItemId,
      feedId = extensionFeedItem.feedId
    }
  };
  operations.Add(operation);
}

feedItemService.mutate(operations.ToArray());

Mit dem ersten REMOVE-Objekt (CampaignExtensionSettingService) wird die Verknüpfung zwischen der Erweiterung und der Kampagne aufgehoben. Durch das zweite REMOVE-Objekt (FeedItemService) werden die zugrunde liegenden Feedelemente entfernt, sodass Speicherplatz für zukünftige neue Erweiterungen freigegeben wird.

Feedelemente wiederverwenden

Sie können jedes Feedelement mit mehreren Entitäten verknüpfen. Wenn Sie beispielsweise die gleichen Sitelinks in mehreren Kampagnen verwenden möchten, können Sie jede dieser Kampagnen mit demselben Satz von Feedelementen verknüpfen.

Nachdem Sie die Verknüpfung einer Anzeigenerweiterung mit einer Entität aufgehoben haben, können Sie das zugrunde liegende Feedelement mit einer anderen Entität verknüpfen. Verwenden Sie hierzu einfach die feedItemId aus der Antwort.

Wenn Sie beispielsweise die feedItemId einer zuvor entfernten Erweiterungseinstellung in der Variablen storedFeedItemId gespeichert haben, können Sie diese wiederverwenden, indem Sie für das SitelinkFeedItem lediglich die feedItemId angeben:

SitelinkFeedItem link = new SitelinkFeedItem() {
  feedItemId = storedFeedItemId
};

CampaignExtensionSetting campaignExtensionSetting = new CampaignExtensionSetting();
campaignExtensionSetting.extensionSetting = new ExtensionSetting() {
  extensions = new ExtensionFeedItem[] {
    link
  }
};

CampaignExtensionSettingOperation operation = new CampaignExtensionSettingOperation() {
  operand = campaignExtensionSetting,
  @operator = Operator.ADD,
};

CampaignExtensionSettingReturnValue retVal = campaignExtensionSettingService.mutate(
    new CampaignExtensionSettingOperation[] {operation});

Ausrichtungsoptionen für Erweiterungen

Mit ExtensionSetting können Sie eine Erweiterung auf Kunden-, Kampagnen- oder Anzeigengruppenebene ausrichten. Sie haben aber auch die Möglichkeit, Ausrichtungsoptionen für einzelne ExtensionFeedItem festzulegen, indem Sie das Attribut campaignTargeting, adGroupTargeting, keywordTargeting oder geoTargeting angeben.

Diese Ausrichtungsoptionen werden mit den ExtensionSetting-Properties kombiniert, um zu entscheiden, welche Feedelemente der Erweiterung bei einer bestimmten Impression verwendet werden.

Angenommen, Sie erstellen ein SitelinkFeedItem mit den folgenden Ausrichtungsoptionen:

adGroupTargeting.TargetingAdGroupId = 12345
keywordTargeting.id = 7890

Außerdem stellen Sie die Plattformeinschränkung für die AdGroupExtensionSetting auf MOBILE ein.

Bei der Auslieferung von Impressionen für diese Anzeigengruppe werden von AdWords Sitelinks aus SitelinkFeedItem nur dann ausgeliefert, wenn die Impressionsattribute die Ausrichtungsoptionen sowohl des Objekts AdGroupExtensionSetting als auch des Objekts SitelinkFeedItem erfüllen.

Fall Impressionsattribute Ergebnis
1
  • Anzeigengruppen-ID 12345
  • Keyword 7890
  • Desktopnutzer
SitelinkFeedItem wird nicht verwendet, da die Plattform (Desktop) nicht die Ausrichtungsoptionen von AdGroupExtensionSetting erfüllt.
2
  • Anzeigengruppen-ID 12345
  • Keyword 8910
  • Mobilgerätnutzer
SitelinkFeedItem wird nicht verwendet, da das Keyword (7890) nicht die Ausrichtungsoptionen von SitelinkFeedItem erfüllt.
3
  • Anzeigengruppen-ID 12345
  • Keyword 7890
  • Mobilgerätnutzer
SitelinkFeedItem wird verwendet, da die Attribute die Ausrichtungsoptionen von AdGroupExtensionSetting und SitelinkFeedItem erfüllen.

Leistung der Anzeigenerweiterung verfolgen

Mit dem Bericht zu Platzhaltern oder dem Bericht zu Anzeigenplatzhalter-Feedelementen können Sie die Leistung Ihrer Anzeigenerweiterungen verfolgen. Aus der Spalte FeedItemId geht hervor, um welche Anzeigenerweiterung es sich handelt.

Anzeigenerweiterungen zu Diensten zur Einrichtung von Erweiterungen migrieren

Im weiteren Verlauf dieses Leitfadens werden die Vorteile und Nachteile der Dienste zur Einrichtung von Erweiterungen behandelt. So können Sie besser entscheiden, ob Sie in Zukunft damit arbeiten oder doch lieber bei Feeddiensten bleiben. Außerdem wird beschrieben, wie zu den neuen Diensten migriert wird.

Dienste zur Einrichtung von Erweiterungen stellen eine gegenüber den vorhandenen feedbasierten Anzeigenerweiterungen vereinfachte Benutzeroberfläche zur Verfügung. Die neuen Dienste

  • unterstützen konkrete Typen für alle unterstützten Anzeigenerweiterungen.
  • stellen eine vereinfachte API zur Verfügung, mit der die Verwaltung von Anzeigenerweiterungen für Kampagnen oder Anzeigengruppen möglich ist.

Soll ich migrieren?

Dienste zur Einrichtung von Erweiterungen decken alle Anzeigenerweiterungsfunktionen ab, die derzeit in der AdWords-Benutzeroberfläche verfügbar sind. Für die meisten Nutzer lohnt es sich, etwas Zeit aufzuwenden, um ihre Dienste umzuschreiben und die Daten zu migrieren, sodass sie anschließend die vereinfachten Dienste zur Einrichtung von Erweiterungen nutzen können. In den folgenden Abschnitten finden Sie Informationen, die Sie bei der Entscheidung unterstützen, ob Sie auf die Dienste zur Einrichtung von Erweiterungen migrieren sollten oder nicht.

In welchen Fällen sind Dienste zur Einrichtung von Erweiterungen zu bevorzugen?

Wenn Sie lediglich einer Kampagne oder Anzeigengruppe Anzeigenerweiterungen hinzufügen, die Geräteeinstellung festlegen oder den Werbezeitplaner verwalten müssen, empfehlen wir die Verwendung dieser Dienste. Ein weiterer Vorteil besteht darin, dass im Gegensatz zu Feeddiensten das Schema und die Daten Ihres Feeds beibehalten werden. Sie müssen also die zugrunde liegende Feedstruktur nicht auf dem neuesten Stand halten.

In welchen Fällen sind die alten Feeddienste zu bevorzugen?

Wir empfehlen die Verwendung der alten Feeddienste, wenn Sie mindestens eine der folgenden Funktionen benötigen:

  • Standorterweiterungen: Die Dienste zur Einrichtung von Erweiterungen beinhalten keine Unterstützung für Standorterweiterungen.
  • Benutzerdefinierte Felder oder Übereinstimmungsfunktionen: Die Dienste zur Einrichtung von Erweiterungen unterstützen keine benutzerdefinierten Felder in Feeds oder selbst geschriebene benutzerdefinierte Übereinstimmungsfunktionen (matchingFunction).
  • Mehrere Feeds: Die Dienste zur Einrichtung von Erweiterungen unterstützen nur einen Feed pro Erweiterungstyp, der vom System verwaltet wird.

Migrationsschritte

Wenn Sie bisher nur in der AdWords-Benutzeroberfläche erstellte Feeds verwendet haben, können Sie die Dienste zur Einrichtung von Erweiterungen sofort nutzen.

Falls Sie jedoch benutzerdefinierte Feeds mit der API erstellt haben, müssen Sie zunächst die folgenden Schritte ausführen:

  1. Feedelemente in Ihren benutzerdefinierten Feeds abrufen
  2. Beizubehaltende Feedelemente identifizieren
  3. CustomerFeed-, CampaignFeed- und AdGroupFeed-Objekte entfernen, die Feedelemente aus den benutzerdefinierten Feeds verwenden
  4. CustomerExtensionSetting-, CampaignExtensionSetting- und AdGroupExtensionSetting-Objekte erstellen, für die die neuen ExtensionFeedItem verwendet werden
  5. (Optional) Nicht mehr verwendete Feedelemente löschen

Der Schwerpunkt der folgenden Abschnitte liegt auf der Umstellung von Anzeigenerweiterungen auf Kampagnenebene. Dieselbe Vorgehensweise gilt jedoch auch für die Anzeigengruppenebene.

Feedelemente in Ihren benutzerdefinierten Feeds abrufen

Um Feedelemente in Ihren benutzerdefinierten Feeds abzurufen, müssen Sie zuerst alle mithilfe der AdWords API erstellten benutzerdefinierten Feeds identifizieren:

private Feed[] GetFeeds(AdWordsUser user) {
  FeedService feedService = (FeedService)user.GetService(
      AdWordsService.v201705.FeedService);
  FeedPage page = feedService.query("SELECT Id, Name, Attributes where " +
      "Origin='USER' and FeedStatus='ENABLED'");
  return page.entries;
}

Rufen Sie nun Feedelemente in diesen Feeds ab. Im Beispiel werden Sitelinks verwendet. Der Ansatz ist jedoch für die anderen Anzeigenerweiterungen ähnlich.

private FeedItem[] GetFeedItems(AdWordsUser user, long feedId) {
  FeedItemService feedItemService = (FeedItemService) user.GetService(
      AdWordsService.v201705.FeedItemService);
  FeedItemPage page = feedItemService.query(string.Format("Select FeedItemId, " +
      "AttributeValues, Scheduling where Status = 'ENABLED' and FeedId = '{0}'", feedId));
  return page.entries;
}

Um den Vorgang zu vereinfachen, laden Sie die Werte in eine lokal definierte Klasse namens SitelinkFromFeed:

class SiteLinkFromFeed {
  public long FeedId {get;set;}
  public long FeedItemId { get; set; }
  public string Text { get; set; }
  public string Url { get; set; }
  public string[] FinalUrls { get; set; }
  public string[] FinalMobileUrls { get; set; }
  public string TrackingUrlTemplate { get; set; }
  public string Line2 { get; set; }
  public string Line3 { get; set; }
  public FeedItemSchedule[] Scheduling { get; set; }
}

Sie sollten auch eine Reihe von Konstanten definieren, damit Sie die FeedMapping (Feedzuordnungen) besser parsen können. Die Platzhalterwerte finden Sie auf der Seite für Feedplatzhalter.

const int PLACEHOLDER_TYPE_SITELINKS = 1;

class SiteLinkFields {
  public const long TEXT = 1;
  public const long URL = 2;
  public const long LINE2 = 3;
  public const long LINE3 = 4;
  public const long FINAL_URLS = 5;
  public const long FINAL_MOBILE_URLS = 6;
  public const long TRACKING_URL_TEMPLATE = 7;
};

Um ein FeedItem-Objekt in ein SitelinksFromFeed zu konvertieren, müssen Sie das FeedMapping des Feeds abrufen und dann jedes Attribut den entsprechenden Objekt-Properties zuordnen:

private Dictionary<long, SiteLinkFromFeed> GetSiteLinksFromFeed(AdWordsUser user,
    long feedId) {
  Dictionary<long, SiteLinkFromFeed> siteLinks =
      new Dictionary<long, SiteLinkFromFeed>();

  Dictionary<long, long> feedMappings = GetFeedMapping(user, feedId,
      PLACEHOLDER_TYPE_SITELINKS);
  FeedItem[] feedItems = GetFeedItems(user, feedId);

  if (feedItems != null) {
    foreach (FeedItem feedItem in feedItems) {
      SiteLinkFromFeed sitelinkFromFeed = new SiteLinkFromFeed() {
        FeedId = feedItem.feedId,
        FeedItemId = feedItem.feedItemId
      };
      foreach (FeedItemAttributeValue attributeValue in feedItem.attributeValues) {
        switch (attributeValue.feedAttributeId) {
          case SiteLinkFields.TEXT:
            sitelinkFromFeed.Text = attributeValue.stringValue;
            break;

          case SiteLinkFields.URL:
            sitelinkFromFeed.Url = attributeValue.stringValue;
            break;

          case SiteLinkFields.FINAL_URLS:
            sitelinkFromFeed.FinalUrls = attributeValue.stringValues;
            break;

          case SiteLinkFields.FINAL_MOBILE_URLS:
            sitelinkFromFeed.FinalMobileUrls = attributeValue.stringValues;
            break;

          case SiteLinkFields.TRACKING_URL_TEMPLATE:
            sitelinkFromFeed.TrackingUrlTemplate = attributeValue.stringValue;
            break;

          case SiteLinkFields.LINE2:
            sitelinkFromFeed.Line2 = attributeValue.stringValue;
            break;

          case SiteLinkFields.LINE3:
            sitelinkFromFeed.Text = attributeValue.stringValue;
            break;
        }
      }
      sitelinkFromFeed.Scheduling = feedItem.scheduling;
      siteLinks.Add(feedItem.feedItemId, sitelinkFromFeed);
    }
  }
  return siteLinks;
}

private Dictionary<long, long> GetFeedMapping(AdWordsUser user, long feedId,
    long placeHolderType) {
  FeedMappingService feedMappingService = (FeedMappingService) user.GetService(
      AdWordsService.v201705.FeedMappingService);
  FeedMappingPage page = feedMappingService.query(string.Format(
      "SELECT FeedMappingId,AttributeFieldMappings where FeedId='{0}' " +
      "and PlaceholderType={1} and Status='ENABLED'",
      feedId, placeHolderType));

  Dictionary<long, long> attributeMappings = new Dictionary<long, long>();

  if (page.entries != null) {
    foreach (FeedMapping feedMapping in page.entries) {
      foreach (AttributeFieldMapping attributeMapping in
          feedMapping.attributeFieldMappings) {
        attributeMappings.Add(attributeMapping.feedAttributeId,
            attributeMapping.fieldId);
      }
    }
  }
  return attributeMappings;
}

Beizubehaltende Feedelemente identifizieren

Sie erhalten eine Liste der mit einer Kampagne verknüpften Feedelemente, indem Sie den mit der Kampagne verknüpften CampaignFeed abrufen und seine matchingFunction parsen. Da Sie mit Übereinstimmungsfunktionen eine allgemein verwendbare Ausdruckhierarchie erstellen können, ist das Programmieren eines entsprechenden Parsers ziemlich komplex. Dieses Thema wird daher in diesem Leitfaden nicht behandelt. Wir ziehen stattdessen den einfachsten Fall heran, bei dem wenige Feedelemente aus einem einzelnen Feed mit einer Kampagne verknüpft sind. Die Übereinstimmungsfunktion stellt sich wie folgt dar:

FEEDITEM_ID IN (FEEDITEM_ID_1, FEEDITEM_ID_2…)

private CampaignFeed[] GetCampaignFeeds(AdWordsUser user, Feed feed, int placeholderType) {
  CampaignFeedService campaignFeedService = (CampaignFeedService) user.GetService(
      AdWordsService.v201705.CampaignFeedService);

  CampaignFeedPage page = campaignFeedService.query(string.Format(
      "SELECT CampaignId, MatchingFunction, PlaceholderTypes where Status='ENABLED' " +
      "and FeedId = '{0}' and PlaceholderTypes CONTAINS_ANY[{1}]", feed.id, placeholderType));
  return page.entries;
}

private List<long> GetFeedItemsForCampaign(CampaignFeed campaignFeed) {
  List<long> feedItems = new List<long>();
  if (campaignFeed.matchingFunction.lhsOperand.Length == 1 &&
      campaignFeed.matchingFunction.lhsOperand[0] is RequestContextOperand &&
      (campaignFeed.matchingFunction.lhsOperand[0] as
           RequestContextOperand).contextType ==
           RequestContextOperandContextType.FEED_ITEM_ID &&
      campaignFeed.matchingFunction.@operator == FunctionOperator.IN) {
    foreach (ConstantOperand argument in campaignFeed.matchingFunction.rhsOperand) {
      feedItems.Add(argument.longValue);
    }
  }
  return feedItems;
}

Vorhandenen CampaignFeed löschen

Vor dem Hinzufügen von Einstellungen für Anzeigenerweiterungen zu einer Kampagne müssen Sie den vorhandenen CampaignFeed der Kampagne löschen. Dies ist erforderlich, da AdWords für eine Kampagne nur ein CampaignFeed pro Erweiterungstyp unterstützt. Indem Sie den manuell erstellten CampaignFeed löschen, kann vom CampaignExtensionSettingService beim Hinzufügen von Einstellungen für die Anzeigenerweiterung ein neuer, vom System verwalteter CampaignFeed erstellt werden.

private CampaignFeed DeleteCampaignFeed(AdWordsUser user, CampaignFeed campaignFeed) {
  CampaignFeedService campaignFeedService = (CampaignFeedService) user.GetService(
      AdWordsService.v201705.CampaignFeedService);

  CampaignFeedOperation operation = new CampaignFeedOperation() {
    operand = campaignFeed,
    @operator = Operator.REMOVE,
  };

  return campaignFeedService.mutate(
       new CampaignFeedOperation[] { operation }).value[0];
}

Erweiterungseinstellungen hinzufügen

Jetzt können Sie Erweiterungseinstellungen hinzufügen, die den vorherigen Feedelementen entsprechen:

private static void CreateExtensionSetting(AdWordsUser user,
    Dictionary<long, SiteLinkFromFeed> feedItems, CampaignFeed campaignFeed,
    List<long> feedItemIds) {
  CampaignExtensionSetting extensionSetting = new CampaignExtensionSetting() {
    campaignId = campaignFeed.campaignId,
    extensionType = FeedType.SITELINK,
    extensionSetting = new ExtensionSetting() {
    }
  };

  List<ExtensionFeedItem> extensionFeedItems = new List<ExtensionFeedItem>();

  foreach (long feedItemId in feedItemIds) {
    SiteLinkFromFeed feedItem = feedItems[feedItemId];
    SitelinkFeedItem newFeedItem = new SitelinkFeedItem() {
      sitelinkText = feedItem.Text,
      sitelinkUrl = feedItem.Url,
      sitelinkFinalUrls = feedItem.FinalUrls,
      sitelinkFinalMobileUrls = feedItem.FinalMobileUrls,
      sitelinkTrackingUrlTemplate = feedItem.TrackingUrlTemplate,
      sitelinkLine2 = feedItem.Line2,
      sitelinkLine3 = feedItem.Line3,
      scheduling = feedItem.Scheduling
    };
    extensionFeedItems.Add(newFeedItem);
  }
  extensionSetting.extensionSetting.extensions = extensionFeedItems.ToArray();

  CampaignExtensionSettingService campaignExtensionSettingService =
      (CampaignExtensionSettingService) user.GetService(
          AdWordsService.v201705.CampaignExtensionSettingService);
  CampaignExtensionSettingOperation operation =
      new CampaignExtensionSettingOperation() {
        operand = extensionSetting,
        @operator = Operator.ADD
      };

  campaignExtensionSettingService.mutate(
      new CampaignExtensionSettingOperation[] {operation});
  return;
}

Bei diesem Vorgang werden doppelte Erweiterungseinstellungen nicht entfernt. Es empfiehlt sich, diesen Code zu erweitern, damit doppelte Elemente ausgeschlossen werden.

Alte Feedelemente löschen

Löschen Sie zum Abschluss die alten FeedItems:

private void DeleteOldFeedItems(AdWordsUser user, List<long> feedItemIds,
    long feedId) {
  if (feedItemIds.Count == 0) {
    return;
  }
  List<FeedItemOperation> operations = new List<FeedItemOperation>();
  foreach (long feedItemId in feedItemIds) {
    FeedItemOperation operation = new FeedItemOperation() {
      @operator = Operator.REMOVE,
      operand = new FeedItem() {
        feedItemId = feedItemId,
        feedId = feedId
      }
    };
    operations.Add(operation);
  }
  FeedItemService feedItemService = (FeedItemService) user.GetService(
      AdWordsService.v201705.FeedItemService);
  feedItemService.mutate(operations.ToArray());
  return;
}

Dieser Schritt ist optional. Wir empfehlen jedoch das Löschen nicht mehr verwendeter Feedelemente, damit die Anzahl der aktiven Feedelemente unter den Systembeschränkungen bleibt.

Zusammenfassung: Die Hauptschleife

Die Hauptschleife dieses Programms entspricht der Folge der oben behandelten Schritte:

Feed[] feeds = GetFeeds(user);
foreach (Feed feed in feeds) {
  Dictionary<long, SiteLinkFromFeed> feedItems = GetSiteLinksFromFeed(user, feed.id);
  CampaignFeed[] campaignFeeds = GetCampaignFeeds(user, feed,
      PLACEHOLDER_TYPE_SITELINKS);

  if (campaignFeeds != null) {
    HashSet<long> allFeedItemsToDelete = new HashSet<long>();
    foreach (CampaignFeed campaignFeed in campaignFeeds) {
      // Optional: Replace with custom logic that upgrades only selected
      // feed items.
      List<long> feedItemIds = GetFeedItemsForCampaign(campaignFeed);
      DeleteCampaignFeed(user, campaignFeed);
      CreateExtensionSetting(user, feedItems, campaignFeed, feedItemIds);
      allFeedItemsToDelete.UnionWith(feedItemIds);
    }
    DeleteOldFeedItems(user, new List<long>(allFeedItemsToDelete), feed.id);
  }
}

Codebeispiele

Sehen Sie sich die folgenden Codebeispiele in unseren Clientbibliotheken an, um mehr über Dienste zur Einrichtung von Erweiterungen zu erfahren.

Feedback geben zu...