使用Facebook Business SDK创建PHP广告:广告创意ID获取失败求助
PHP程序化创建Facebook广告完整示例(解决广告创意ID缺失及enroll_status问题)
核心问题解决方案
1. OBJECT_STORY_SPEC的enroll_status配置
使用OBJECT_STORY_SPEC时,必须在spec结构里添加enroll_status字段,值设为'ENABLED',同时要确保你的广告账户已经开通对应广告格式的权限(比如动态创意权限)。
2. 确保广告创意返回ID
不管用不用OBJECT_STORY_SPEC,创建广告创意的参数必须完整符合Facebook API要求,否则不会返回id。如果没拿到ID,先检查必填字段是否遗漏,或者通过API返回的错误信息排查问题。
完整代码示例
1. 初始化SDK及配置
require __DIR__ . '/vendor/autoload.php'; use FacebookAds\Api; use FacebookAds\Object\AdAccount; use FacebookAds\Object\AdCampaign; use FacebookAds\Object\AdSet; use FacebookAds\Object\AdCreative; use FacebookAds\Object\Fields\AdCampaignFields; use FacebookAds\Object\Fields\AdSetFields; use FacebookAds\Object\Fields\AdCreativeFields; use FacebookAds\Object\Values\AdCampaignObjectiveValues; use FacebookAds\Object\Values\AdSetBidStrategyValues; use FacebookAds\Object\ObjectStorySpec; use FacebookAds\Object\Fields\ObjectStorySpecFields; use FacebookAds\Object\LinkData; use FacebookAds\Object\Fields\LinkDataFields; use FacebookAds\Object\ImageData; use FacebookAds\Object\Fields\ImageDataFields; // 初始化API,替换为你的实际信息 Api::init( 'YOUR_APP_ID', 'YOUR_APP_SECRET', 'YOUR_ACCESS_TOKEN' ); $account_id = 'act_YOUR_AD_ACCOUNT_ID'; $ad_account = new AdAccount($account_id);
2. 创建广告系列
$campaign = new AdCampaign(null, $account_id); $campaign->setData(array( AdCampaignFields::NAME => '测试流量广告系列', AdCampaignFields::OBJECTIVE => AdCampaignObjectiveValues::TRAFFIC, AdCampaignFields::STATUS => AdCampaign::STATUS_PAUSED, AdCampaignFields::DAILY_BUDGET => 1000, // 单位:分,即10美元 )); $campaign->create(); $campaign_id = $campaign->id; echo "广告系列ID: " . $campaign_id . "\n";
3. 上传广告图片
// 上传本地图片到广告账户 $image = $ad_account->createImage(array(), array( 'filename' => '/path/to/your/ad-image.jpg', )); $image_hash = $image->{ImageDataFields::HASH}; echo "图片哈希值: " . $image_hash . "\n";
4. 创建广告创意(使用OBJECT_STORY_SPEC)
// 构建链接数据 $link_data = new LinkData(); $link_data->setData(array( LinkDataFields::MESSAGE => '快来查看我们的新品!', LinkDataFields::LINK => 'https://your-website-url.com', LinkDataFields::IMAGE_HASH => $image_hash, )); // 构建OBJECT_STORY_SPEC,添加enroll_status $object_story_spec = new ObjectStorySpec(); $object_story_spec->setData(array( ObjectStorySpecFields::PAGE_ID => 'YOUR_FACEBOOK_PAGE_ID', // 你的Facebook主页ID ObjectStorySpecFields::LINK_DATA => $link_data, ObjectStorySpecFields::ENROLL_STATUS => 'ENABLED', // 解决enroll_status提示的关键配置 )); // 创建广告创意 $ad_creative = new AdCreative(null, $account_id); $ad_creative->setData(array( AdCreativeFields::NAME => '测试创意', AdCreativeFields::OBJECT_STORY_SPEC => $object_story_spec, )); $ad_creative->create(); $creative_id = $ad_creative->id; echo "广告创意ID: " . $creative_id . "\n";
5. 创建广告创意(不使用OBJECT_STORY_SPEC)
$ad_creative_alt = new AdCreative(null, $account_id); $ad_creative_alt->setData(array( AdCreativeFields::NAME => '测试创意(常规格式)', AdCreativeFields::TITLE => '限时特惠', AdCreativeFields::BODY => '全场商品8折,点击了解详情', AdCreativeFields::IMAGE_HASH => $image_hash, AdCreativeFields::LINK_URL => 'https://your-website-url.com', AdCreativeFields::CALL_TO_ACTION_TYPE => 'LEARN_MORE', )); $ad_creative_alt->create(); $creative_id_alt = $ad_creative_alt->id; echo "广告创意ID(常规格式): " . $creative_id_alt . "\n";
6. 创建广告组并关联创意
$ad_set = new AdSet(null, $account_id); $ad_set->setData(array( AdSetFields::NAME => '测试广告组', AdSetFields::CAMPAIGN_ID => $campaign_id, AdSetFields::STATUS => AdSet::STATUS_PAUSED, AdSetFields::DAILY_BUDGET => 1000, AdSetFields::BID_STRATEGY => AdSetBidStrategyValues::LOWEST_COST_WITHOUT_CAP, AdSetFields::TARGETING => array( 'geo_locations' => array( 'countries' => ['US'], ), 'age_min' => 18, 'age_max' => 65, ), AdSetFields::CREATIVE => array( 'creative_id' => $creative_id, ), )); $ad_set->create(); echo "广告组ID: " . $ad_set->id . "\n";
关键注意事项
- 所有大写占位符(如
YOUR_APP_ID、YOUR_PAGE_ID)必须替换为你的实际信息。 - 访问令牌需要包含
ads_management、pages_show_list等必要权限,权限不足会导致创建失败。 - 如果仍遇到
enroll_status错误,检查广告账户是否启用了对应广告格式,或联系Facebook支持确认权限。 - 若创建创意未返回ID,可通过
$ad_creative->getLastResponse()查看API返回的错误详情,针对性补充参数。
内容的提问来源于stack exchange,提问作者albrox
相关产品推荐
相关产品推荐

