管理广告对象状态

广告系列、广告组和广告具有下列其中一种状态类型:

  • 已发布
  • 已归档
  • 已删除

如需了解背景信息,请参阅广告开发者博客的“已删除与已归档”部分。

已发布

已发布的广告对象可能具有下列状态:

  • ACTIVE
  • PAUSED
  • PENDING_REVIEW
  • CREDIT_CARD_NEEDED
  • PREAPPROVED
  • DISABLED
  • PENDING_PROCESS
  • WITH_ISSUES

已归档

将广告对象的 status 字段设置为 ARCHIVED,即可将其状态设置为 ARCHIVED。将对象状态设置为 ARCHIVED 后,您仍然可以根据对象编号查询详细信息和统计数据。您可以存档的对象数量设有上限。因此,您应遵从此上限,将不再需要的对象的状态更改为 DELETED

状态为 ARCHIVED 的对象只有两个可供更改的字段,即 namestatus。您也仅可将 status 更改为 DELETED

已删除

如要将广告对象设置为 DELETED,您可以将 status 字段设置为 DELETED,或向该对象发送 HTTP DELETE 请求。将对象的状态设置为 DELETED 后,您无法再将其恢复为 ARCHIVED

如果您有保留已删除对象的编号,则仍然可以通过查询该对象编号来检索其统计数据或详细信息。可是,您无法利用未删除的节点或对象检索要用作连接对象的已删除对象。例如,虽然 <API_VERSION>/<AD_ID>/insights 适用于已删除的对象,但 <API_VERSION>/act_<AD_ACCOUNT_ID>/insights?level=ad 不会返回已删除对象的统计数据。

即使删除广告,系统仍会在其最后一个投放日之后的 28 天内追踪其展示次数、点击量和操作次数。您可以使用 ad.effective_status 筛选条件来查询 DELETED 对象的成效分析。

如果您的广告组内包含两条广告,而您删除了其中一条,则以下两个查询返回的结果会有所不同:

https://graph.facebook.com/v19.0/<AD_SET_ID>/insights
https://graph.facebook.com/v19.0/<AD_ID>/insights

广告组返回的统计数据中包括其中已删除和未删除的广告资料。但在查询广告组中的广告时,您只会看见一条广告:

https://graph.facebook.com/v19.0/<AD_SET_ID>/ads

为避免出现这种情况,您应该在广告停止投放 28 天后再将其删除,以确保统计数据不再继续更改。此外,在删除这些对象之前,您还应先将它们的统计数据或编号存储至自己的系统。若发生以下情况,您不一定要遵循此建议:

  • 如果您的应用程序不显示细分统计数据,或者
  • 您不介意删除某些子对象后,子对象的汇总细分统计数据与父对象的统计数据不一致。

name 外,您不能更改 DELETED 对象的任何字段。

管理状态

管理对象状态通常包括以下几种情况:

  • 创建广告对象,然后运行并开始投放
  • 在您删除对象时,我们也会自动将其删除
  • 当已归档对象的数量达到上限时,您将无法再归档更多对象。
  • 您应将已归档的删除对象状态更改为 deleted,以使归档数量低于限制。

在广告对象架构中,广告对象状态的运作方式如下:

  • 如果将广告系列的状态设置为 with_issuespausedarchiveddeleted,该广告系列下的所有对象均将自动更改为相同状态。
  • 如果将广告系列的状态设置为 deleted,除非明确指定对象编号,否则您将无法检索该广告系列下的广告组或广告。
  • 如果将广告的状态设置为 with_issuespausedarchiveddeleted,包含该广告的广告组或广告系列仍将保持原有状态,并可供检索。

下列限制适用于给定广告账户的 ARCHIVED 对象:

  • 广告系列:100,000
  • 广告组:100,000
  • 广告:100,000

如果您读取 archived 连线,则需要专门筛选出已归档对象,因为我们默认不会返回这些对象。如果您读取某个广告对象的统计数据,无论子对象的状态是 activearchived 还是 deleted,我们将列出所有子对象的统计数据。因此,您无需筛选子对象的成效分析。

不同状态的对比

状态为 ACTIVEPAUSED 的对象与状态为 ARCHIVEDDELETED 的对象有所不同。它们的主要区别如下。

查询 已发布 已归档 已删除

存在于数据库中

每个广告帐户的最大数量

有上限

100,000

无上限

以连线查询(不含筛选条件)

使用状态筛选条件查询连线

如果筛选条件包含对象的状态,则为是

如果状态筛选条件包含 ARCHIVED,则为是。

如果状态筛选条件不包含 DELETED,则为否;如果包含在内,则会发生错误。

以自身编号查询

统计数据汇总于 /<PARENT_OBJECT_ID>/insights

统计数据包含在 /<PARENT_OBJECT_ID>/insights?level=<OBJECT_LEVEL> 的结果列表中

统计数据包含在 /<PARENT_OBJECT_ID>/insights 的结果列表中,且含 delivery_info 筛选条件

如果筛选条件包含对象的状态,则为是

如果筛选条件包含对象的状态,则为是

通过 /<OBJECT_ID>/insights 显示成效分析

状态可以更改为

任何有效状态

DELETED

无法更改

如要将广告状态更改为已归档:

use FacebookAds\Object\Ad;

$ad = new Ad(<AD_ID>);
$ad->archive();
from facebookads.adobjects.ad import Ad

ad = Ad(ad_id)
ad.remote_archive()
new Ad(<AD_ID>, context).update()
  .setStatus(Ad.EnumStatus.VALUE_ARCHIVED)
  .execute();
curl \
  -F 'status=ARCHIVED' \
  -F 'access_token=<ACCESS_TOKEN>' \
  https://graph.facebook.com/v2.11/<AD_ID>

如要删除广告:

use FacebookAds\Object\Ad;

$ad = new Ad(<AD_ID>);
$ad->deleteSelf();
from facebookads.adobjects.ad import Ad

ad = Ad(<AD_ID>)
ad.remote_delete()
new Ad(<AD_ID>, context).update()
  .setStatus(Ad.EnumStatus.VALUE_DELETED)
  .execute();
curl -X DELETE \
  -d 'access_token=<ACCESS_TOKEN>' \
  https://graph.facebook.com/v2.11/<AD_ID>/

如要检索已发布对象的已发布子对象,例如广告系列中的所有已发布广告(不包括 ARCHIVEDDELETED 广告):

curl -X GET \ -d 'fields="name"' \ -d 'access_token=<ACCESS_TOKEN>' \ https://graph.facebook.com/v19.0/<AD_CAMPAIGN_ID>/ads
'use strict'; const bizSdk = require('facebook-nodejs-business-sdk'); const Campaign = bizSdk.Campaign; const Ad = bizSdk.Ad; const access_token = '<ACCESS_TOKEN>'; const app_secret = '<APP_SECRET>'; const app_id = '<APP_ID>'; const id = '<AD_CAMPAIGN_ID>'; const api = bizSdk.FacebookAdsApi.init(access_token); const showDebugingInfo = true; // Setting this to true shows more debugging info. if (showDebugingInfo) { api.setDebug(true); } const logApiCallResult = (apiCallName, data) => { console.log(apiCallName); if (showDebugingInfo) { console.log('Data:' + JSON.stringify(data)); } }; let fields, params; fields = [ 'name', ]; params = { }; const adss = (new Campaign(id)).getAds( fields, params ); logApiCallResult('adss api call complete.', adss);
require __DIR__ . '/vendor/autoload.php'; use FacebookAds\Object\Campaign; use FacebookAds\Object\Ad; use FacebookAds\Api; use FacebookAds\Logger\CurlLogger; $access_token = '<ACCESS_TOKEN>'; $app_secret = '<APP_SECRET>'; $app_id = '<APP_ID>'; $id = '<AD_CAMPAIGN_ID>'; $api = Api::init($app_id, $app_secret, $access_token); $api->setLogger(new CurlLogger()); $fields = array( 'name', ); $params = array( ); echo json_encode((new Campaign($id))->getAds( $fields, $params )->getResponse()->getContent(), JSON_PRETTY_PRINT);
from facebook_business.adobjects.campaign import Campaign from facebook_business.adobjects.ad import Ad from facebook_business.api import FacebookAdsApi access_token = '<ACCESS_TOKEN>' app_secret = '<APP_SECRET>' app_id = '<APP_ID>' id = '<AD_CAMPAIGN_ID>' FacebookAdsApi.init(access_token=access_token) fields = [ 'name', ] params = { } print Campaign(id).get_ads( fields=fields, params=params, )
import com.facebook.ads.sdk.*; import java.io.File; import java.util.Arrays; public class SAMPLE_CODE_EXAMPLE { public static void main (String args[]) throws APIException { String access_token = \"<ACCESS_TOKEN>\"; String app_secret = \"<APP_SECRET>\"; String app_id = \"<APP_ID>\"; String id = \"<AD_CAMPAIGN_ID>\"; APIContext context = new APIContext(access_token).enableDebug(true); new Campaign(id, context).getAds() .requestNameField() .execute(); } }
require 'facebook_ads' access_token = '<ACCESS_TOKEN>' app_secret = '<APP_SECRET>' app_id = '<APP_ID>' id = '<AD_CAMPAIGN_ID>' FacebookAds.configure do |config| config.access_token = access_token config.app_secret = app_secret end campaign = FacebookAds::Campaign.get(id) adss = campaign.ads({ fields: { 'name' }, })

如要检索已发布对象的 ARCHIVED 子对象(例如广告组中的所有 ARCHIVED 广告),则须使用状态筛选条件:

curl -X GET \ -d 'effective_status=[ "ARCHIVED" ]' \ -d 'fields="name"' \ -d 'access_token=<ACCESS_TOKEN>' \ https://graph.facebook.com/v19.0/<AD_CAMPAIGN_ID>/ads
'use strict'; const bizSdk = require('facebook-nodejs-business-sdk'); const Campaign = bizSdk.Campaign; const Ad = bizSdk.Ad; const access_token = '<ACCESS_TOKEN>'; const app_secret = '<APP_SECRET>'; const app_id = '<APP_ID>'; const id = '<AD_CAMPAIGN_ID>'; const api = bizSdk.FacebookAdsApi.init(access_token); const showDebugingInfo = true; // Setting this to true shows more debugging info. if (showDebugingInfo) { api.setDebug(true); } const logApiCallResult = (apiCallName, data) => { console.log(apiCallName); if (showDebugingInfo) { console.log('Data:' + JSON.stringify(data)); } }; let fields, params; fields = [ 'name', ]; params = { 'effective_status' : ['ARCHIVED'], }; const adss = (new Campaign(id)).getAds( fields, params ); logApiCallResult('adss api call complete.', adss);
require __DIR__ . '/vendor/autoload.php'; use FacebookAds\Object\Campaign; use FacebookAds\Object\Ad; use FacebookAds\Api; use FacebookAds\Logger\CurlLogger; $access_token = '<ACCESS_TOKEN>'; $app_secret = '<APP_SECRET>'; $app_id = '<APP_ID>'; $id = '<AD_CAMPAIGN_ID>'; $api = Api::init($app_id, $app_secret, $access_token); $api->setLogger(new CurlLogger()); $fields = array( 'name', ); $params = array( 'effective_status' => array('ARCHIVED'), ); echo json_encode((new Campaign($id))->getAds( $fields, $params )->getResponse()->getContent(), JSON_PRETTY_PRINT);
from facebook_business.adobjects.campaign import Campaign from facebook_business.adobjects.ad import Ad from facebook_business.api import FacebookAdsApi access_token = '<ACCESS_TOKEN>' app_secret = '<APP_SECRET>' app_id = '<APP_ID>' id = '<AD_CAMPAIGN_ID>' FacebookAdsApi.init(access_token=access_token) fields = [ 'name', ] params = { 'effective_status': ['ARCHIVED'], } print Campaign(id).get_ads( fields=fields, params=params, )
import com.facebook.ads.sdk.*; import java.io.File; import java.util.Arrays; public class SAMPLE_CODE_EXAMPLE { public static void main (String args[]) throws APIException { String access_token = \"<ACCESS_TOKEN>\"; String app_secret = \"<APP_SECRET>\"; String app_id = \"<APP_ID>\"; String id = \"<AD_CAMPAIGN_ID>\"; APIContext context = new APIContext(access_token).enableDebug(true); new Campaign(id, context).getAds() .setEffectiveStatus(\"[\\"ARCHIVED\\"]\") .requestNameField() .execute(); } }
require 'facebook_ads' access_token = '<ACCESS_TOKEN>' app_secret = '<APP_SECRET>' app_id = '<APP_ID>' id = '<AD_CAMPAIGN_ID>' FacebookAds.configure do |config| config.access_token = access_token config.app_secret = app_secret end campaign = FacebookAds::Campaign.get(id) adss = campaign.ads({ fields: { 'name' }, effective_status: ['ARCHIVED'], })