Google Ads API PHP SDK 删除广告系列排除IP报错解决方案
问题根因
Google Ads PHP SDK 中所有*Operation类的setRemove()方法,入参都只接受待删除实体的字符串格式资源名,不接受完整的实体对象。你直接传入构造的CampaignCriterion实例时,SDK内部会尝试把入参强转为字符串,就会触发你看到的对象转字符串报错。
REMOVE操作本身不需要传实体的完整字段信息,只需要传能唯一定位到目标实体的资源名即可,和你要删的是IP排除项还是其他类型的Campaign准则没有关系。
正确删除流程
- 第一步:获取待删除IP排除项对应的CampaignCriterion资源名
IP排除项作为负向Campaign准则,资源名格式为customers/{你的客户ID}/campaignCriteria/{广告系列ID}~{准则ID},这个准则ID无法通过IP地址、广告系列ID直接拼出来,两种常用获取方式:- 新增IP排除项时,保存接口返回结果中自动生成的
criterion_id,删除时直接拼接资源名 - 删除前先通过GAQL语句查询对应广告系列下匹配目标IP的负向IP_BLOCK类型准则,拿到资源名,查询示例代码:
- 新增IP排除项时,保存接口返回结果中自动生成的
// 替换为你自己的客户ID、广告系列ID、待删除IP $targetCampaignId = $item['campaignId']; $targetIp = $item['ip']; $gaql = <<<EOF SELECT campaign_criterion.resource_name FROM campaign_criterion WHERE campaign.id = {$targetCampaignId} AND campaign_criterion.type = 'IP_BLOCK' AND campaign_criterion.ip_block.ip_address = '{$targetIp}' AND campaign_criterion.negative = TRUE EOF; $searchResponse = $googleAdsServiceClient->search($customerId, $gaql); $targetCriterionResourceName = null; foreach ($searchResponse->iterateAllElements() as $row) { $targetCriterionResourceName = $row->getCampaignCriterion()->getResourceName(); break; }
- 第二步:构造删除操作,直接传入拿到的资源名
不需要构造IpBlockInfo实例,也不需要构造完整的CampaignCriterion对象,直接把字符串格式的资源名传给setRemove()即可:
$operation = new CampaignCriterionOperation(); // 注意入参是字符串类型的资源名,不要传实体对象 $operation->setRemove($targetCriterionResourceName);
- 第三步:将构造好的operation传入你之前用的
mutateCampaignCriteria接口提交请求,即可完成IP排除项的删除。
注意事项
不要尝试通过清空IpBlockInfo字段、传入带IP信息的新建CampaignCriterion对象的方式实现删除:Google Ads API的所有删除类操作都只认目标实体的资源名,和实体上的字段内容无关,不管是删除IP排除、否定关键词、受众排除项,逻辑都是一致的。
IpBlockInfo自带的清空IP地址方法仅用于修改/新建场景下重置对象字段,无法用于删除操作。
内容的提问来源于stack exchange,提问作者Wakka
相关产品推荐
相关产品推荐

