管理廣告物件狀態

廣告宣傳活動、廣告組合及廣告會擁有下列其中一種狀態類型:

  • 已發佈
  • 已封存
  • 已刪除

如需了解背景資訊,請參閱廣告開發人員網誌,已刪除與已封存

已發佈

已發佈的廣告物件可擁有下列狀態:

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

已封存

將廣告物件的 status 欄位設定為 ARCHIVED,即可將其狀態設定為 ARCHIVED。將物件狀態設定為 ARCHIVED 後,您仍然可以根據物件編號查詢詳細資訊和統計資料。但是,您最多只能封存特定數量的物件。因此,請遵從此上限,並將不再需要的物件之狀態變更為 DELETED

狀態為 ARCHIVED 的物件只有 2 個可變更的欄位: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 物件的洞察報告。

如果您的廣告組合內包含 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 天後再將之刪除,以確保狀態不再持續變更。此外,在刪除這些物件之前,請先將它們的統計資料或編號儲存至自己的系統。在以下情況下,您不一定要遵循此建議:

  • 如果您的應用程式不顯示統計資料的資料細節,或者
  • 您不介意刪除某些子物件後,子物件的匯總資料細節與母物件的統計資料不一致。

除了 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/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'], })