管理廣告目標的狀態

廣告行銷活動、廣告組合和廣告具有下列其中一種狀態類型:

  • 直播
  • 已封存
  • 已刪除

背景資訊請參閱廣告開發人員部落格:已刪除與已封存

直播

已上線廣告物件可包含下列狀態:

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

已封存

status 欄位設為 ARCHIVED,即可將廣告物件設為 ARCHIVED。物件狀態設為 ARCHIVED 時,您可根據物件編號繼續查詢詳細資料和統計資料。不過,可封存的物件數量有上限。因此,當您不再需要物件時,應遵守此限制並將狀態變更為 DELETED

ARCHIVED 物件僅有 2 個可變更的欄位:namestatus,您也可以僅將 status 變更為 DELETED

已刪除

status 欄位設為 DELETED 或向該物件傳送 HTTP DELETE,即可將廣告物件設為 DELETED。物件狀態一旦設為 DELETED,就無法再改回 ARCHIVED

如果您保有已刪除物件編號,即可透過查詢物件編號,繼續擷取統計資料或物件詳細資料。不過,您無法以連線物件的方式,從未刪除節點或物件擷取已刪除物件。例如,<API_VERSION>/<AD_ID>/insights 可用於已刪除物件,但 <API_VERSION>/act_<AD_ACCOUNT_ID>/insights?level=ad 就不會傳回已刪除物件的統計資料。

當您刪除某個廣告之後,在廣告最後投遞日期的 28 天內,這則廣告仍可能會追蹤曝光次數、點擊次數及動作。您可以使用 ad.effective_status 篩選條件,查詢 DELETED 物件的洞察報告。

如果您有一個廣告組合,內含 2 個廣告,而您刪除其中一個廣告,則下列 2 個查詢將不會傳回相同結果:

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

廣告組合會傳回所含已刪除廣告和未刪除廣告兩者的統計資料,但是查詢廣告組合內的廣告時,您只會看到一個廣告:

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

為了避免以上情況發生,您應該在廣告最後投遞日期的 28 天後才刪除廣告,以確保統計資料不再變更。此外,您應該在刪除物件前,將這些物件的統計資料或編號儲存在您自己的系統中。此項建議為選用:

  • 如果您的應用程式不會顯示統計資料的資料解析,
  • 您覺得統計資料的資料解析總和,因為一些已刪除的子物件而不符合父物件統計資料也沒關係。

您無法變更 DELETED 物件的任何欄位(name 除外)。

管理狀態

以下為管理物件狀態的一般方式:

  • 您建立廣告物件,廣告物件上線並開始投遞
  • 當您刪除物件時,我們會自動將它刪除
  • 當您達到已封存物件的限制時,將無法再封存更多物件。
  • 您應該將這些已封存的刪除物件移至 deleted 狀態,才能減少限制。

廣告物件的狀態會針對廣告物件的階層以此方式運作:

  • 如果您將行銷活動的狀態設為 with_issuespausedarchiveddeleted,底下所有物件都會自動繼承該狀態。
  • 如果您將廣告行銷活動設為 deleted,除非您明確指定編號,否則無法擷取該行銷活動底下的廣告組合或廣告。
  • 如果您將廣告的狀態設為 with_issuespausedarchiveddeleted,包含該廣告的廣告組合或廣告行銷活動仍會保有原始狀態,並可供擷取。

下列限制適用於指定廣告帳號的 ARCHIVED 物件:

  • 廣告行銷活動為 100,000
  • 廣告組合為 100,000
  • 廣告為 100,000

如果您讀取 archived 關係連線,必須特別篩選封存物件,因為預設情況下我們不會傳回這些物件。如果您讀取廣告物件的統計資料,無論子物件是 activearchiveddeleted,我們都會加入所有子物件的統計資料。因此,您不需要針對子物件使用洞察報告的篩選條件。

比較不同狀態

具有 ACTIVEPAUSED 狀態的物件與具有 ARCHIVED 狀態和 DELETED 的物件不同。主要差異如下。

查詢 直播 已封存 已刪除

存在於資料庫中

每個廣告帳號的數量上限

有限制

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/v21.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/v21.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'], })