如何使用最新版本的Google AdWords API 201509删除单个附加链接并完成其余内容?

问题描述:

Google added a new way to add sitelink extensions.

https://developers.google.com/adwords/api/docs/guides/extension-settings#add_ad_extensions

I added a bunch of them, but how do you delete them? I had 3 sitelinks on each campaign. I was able to remove a sitelink from the campaigns, but it removed all sitelinks from the campaigns. They are still in the + Extension list, but not associated with any campaigns.

  function deleteSitelinks($sitelinks) {
    $user = $this->getUser();
    $campaignExtensionSettingService = $user->GetService('CampaignExtensionSettingService', ADWORDS_VERSION);
    // first remove the sitelinks from the campaigns
    $operations = array();
    foreach ($sitelinks as $sitelink) {
      $sfi = new SitelinkFeedItem();
      $sfi->feedItemId = $sitelink->google_feed_item_id;

      $campaignExtensionSetting = new CampaignExtensionSetting();
      $campaignExtensionSetting->campaignId = $sitelink->campaign->google_id;
      $campaignExtensionSetting->extensionType = 'SITELINK';

      $extensionSetting = new ExtensionSetting();
      $extensionSetting->extensions = array($sfi);
      $campaignExtensionSetting->extensionSetting = $extensionSetting;

      $operation = new CampaignExtensionSettingOperation();
      $operation->operator = 'REMOVE';
      $operation->operand = $campaignExtensionSetting;
      $operations[] = $operation;
    }
    $result = $campaignExtensionSettingService->mutate($operations);

    // now remove the sitelinks themselves
    $feedItemService = $user->GetService('FeedItemService', ADWORDS_VERSION);
    $operations = array();
    foreach ($sitelinks as $sitelink) {
      $sfi = new SitelinkFeedItem();
      $sfi->feedId = $sitelink->google_feed_id;
      $sfi->feedItemId = $sitelink->google_feed_item_id;

      $operation = new FeedItemOperation();
      $operation->operator = 'REMOVE';
      $operation->operand = $sfi;
      $operations[] = $operation;
    }
    $result = $feedItemService->mutate($operations);

    return $result->value;
  }

Google添加了一种新方法来添加附加链接。 p>

https:// developers.google.com/adwords/api/docs/guides/extension-settings#add_ad_extensions p>

我添加了一堆,但是你如何删除它们? 每个广告系列都有3个附加链接。 我可以从广告系列中删除附加链接,但它从广告系列中删除了所有 strong>附加链接。 它们仍然在 + Extension code>列表中,但不与任何广告系列相关联。 p>

  function deleteSitelinks($ sitelinks){
 $ user = $  this-> getUser(); 
 $ campaignExtensionSettingService = $ user-> GetService('CampaignExtensionSettingService',ADWORDS_VERSION); 
 //首先从广告系列中删除附加链接
 $ operations = array(); 
 foreach  ($ sitelinks as $ sitelink){
 $ sfi = new SitelinkFeedItem(); 
 $ sfi-> feedItemId = $ sitelink-> google_feed_item_id; 
 
 $ campaignExtensionSetting = new CampaignExtensionSetting(); 
 $ campaignExtensionSetting  - > campaignId = $ sitelink-> campaign-> google_id; 
 $ campaignExtensionSetting-> extensionType ='SITELINK'; 
 
 $ extensionSetting = new ExtensionSetting(); 
 $ extensionSetting-> extensions =  array($ sfi); 
 $ campaignExtensionSetting-> extensionSetting = $ extensionSetting; 
 
 $ operation = new CampaignExtensionSettingOperation(); 
 $  operation-> operator ='REMOVE'; 
 $ operation-> operand = $ campaignExtensionSetting; 
 $ operations [] = $ operation; 
} 
 $ result = $ campaignExtensionSettingService-> mutate($ operations)  ; 
 
 //现在删除附加链接
 $ feedItemService = $ user-> GetService('FeedItemService',ADWORDS_VERSION); 
 $ operations = array(); 
 foreach($ sitelinks as $ sitelink)  {
 $ sfi = new SitelinkFeedItem(); 
 $ sfi-> feedId = $ sitelink-> google_feed_id; 
 $ sfi-> feedItemId = $ sitelink-> google_feed_item_id; 
 
 $ operation =  new FeedItemOperation(); 
 $ operation-> operator ='REMOVE'; 
 $ operation-> operand = $ sfi; 
 $ operations [] = $ operation; 
} 
 $ result = $ feedItemService  - > mutate($ operations); 
 
返回$ result-> value; 
} 
  code>  pre> 
  div>

Ok I 'fixed' it by re-adding all the sitelinks that belong to that campaign immediately after deleting the target sitelink. I swear, this is the most retarded part of this API.

...
$result = $campaignExtensionSettingService->mutate($operations);

// now re-add the other sitelinks. the google API is removing/disassociating ALL sitelinks for whatever reason 
$operations = array();
foreach ($sitelinks as $sitelink) {
  $campaignSitelinks = array();
  $siblings = Sitelink::find()->where(['campaign_id' => $sitelink->campaign_id])->andWhere(['not', ['id' => $sitelink->id]])->all();
  foreach ($siblings as $sibling) {
    $sfi = new SitelinkFeedItem();
    $sfi->feedItemId = $sibling->google_feed_item_id;
    $campaignSitelinks[] = $sfi;
  }
  $campaignExtensionSetting = new CampaignExtensionSetting();
  $campaignExtensionSetting->campaignId = $sitelink->campaign->google_id;
  $campaignExtensionSetting->extensionType = 'SITELINK';
  $campaignExtensionSetting->extensionSetting = new ExtensionSetting();
  $campaignExtensionSetting->extensionSetting->extensions = $campaignSitelinks;
  // Create operation.
  $operation = new CampaignExtensionSettingOperation();
  $operation->operator = 'SET';
  $operation->operand = $campaignExtensionSetting;
  $operations[] = $operation;
}
$result = $campaignExtensionSettingService->mutate($operations);

// now remove all the sitelinks themselves
$feedItemService = $user->GetService('FeedItemService', ADWORDS_VERSION);
...