簡體   English   中英

無法使用Facebook PHP SDK修改廣告素材URL標簽

[英]Unable to modify Ad Creative URL tags using Facebook PHP SDK

更新廣告素材網址代碼時遇到了問題。

我知道我們無法為現有的廣告素材更新URL標簽。

因此,我嘗試使用修改的URL標記克隆現有的,並嘗試刪除舊的但刪除了創建問題,現在出現此錯誤。

您無法刪除此廣告,因為它已被現有的廣告組使用

試圖將廣告狀態更改為“已刪除”,但這也不起作用。 另外,嘗試將廣告狀態更改為“已暫停”,但完全沒有運氣。 甚至API也不會更新廣告狀態。

有人,請指導我該怎么解決? 還是通過其他任何方式可以更新廣告素材URL標簽?

我正在使用PHP SDK並遵循此FB文檔 我對我的應用程序具有所有必需的權限,並且它們已被FB批准。

這是我要使其正常運行所要做的工作,仍然存在一些問題,但這對大多數類型的廣告都有效:

public function appendAdSetIdsToCreatives($fbAccountId, $adsetIds, $creativeIds, $fullSync = false, $dryRun = false)
{
    $urlTagArray = [];
    $attempts = 0;
    Cursor::setDefaultUseImplicitFetch(true);
    $account = new AdAccount('act_' . $fbAccountId);
    $params['limit'] = 1000;
    $params[AdFields::EFFECTIVE_STATUS] = array(AdEffectiveStatusValues::ACTIVE, AdEffectiveStatusValues::PENDING_BILLING_INFO, AdEffectiveStatusValues::PENDING_REVIEW, AdEffectiveStatusValues::PREAPPROVED);

    if (!$fullSync) {
        $params['updated_since'] = Carbon::now()->subDay()->timestamp;
    }
    if (!empty($adsetIds)) {
        $params[AdFields::ADSET_ID] = $adsetIds;
    }
    $updateCount = 0;
    $skipCount = 0;
    $exception = null;
    do {
        try {
            $cursor = $account->getAds(array(AdFields::ID, AdFields::NAME, AdFields::ADSET_ID, AdFields::CREATIVE, AdFields::STATUS, AdFields::EFFECTIVE_STATUS), $params);
            foreach ($cursor as $ad) {
                //If adset specified in command, ignore if ad not belongs to specified adset
                if (!empty($adsetIds) && !in_array($ad->adset_id, $adsetIds)) {
                    continue;
                }
                foreach ($ad->creative as $creativeId) {
                    if(!empty($creativeIds) && !in_array($creativeId, $creativeIds)) {
                        continue;
                    }
                    $creativeParams = ['id' => $creativeId];
                    $creativeCursor = $ad->getAdCreatives(array(
                        AdCreativeFields::ACCOUNT_ID,
                        AdCreativeFields::ACTOR_ID,
                        AdCreativeFields::ADLABELS,
                        AdCreativeFields::APPLINK_TREATMENT,
                        AdCreativeFields::BODY,
                        AdCreativeFields::CALL_TO_ACTION_TYPE,
                        AdCreativeFields::EFFECTIVE_INSTAGRAM_STORY_ID,
                        AdCreativeFields::EFFECTIVE_OBJECT_STORY_ID,
                        AdCreativeFields::ID,
                        AdCreativeFields::IMAGE_CROPS,
                        AdCreativeFields::IMAGE_HASH,
                        AdCreativeFields::IMAGE_URL,
                        AdCreativeFields::INSTAGRAM_ACTOR_ID,
                        AdCreativeFields::INSTAGRAM_PERMALINK_URL,
                        AdCreativeFields::INSTAGRAM_STORY_ID,
                        AdCreativeFields::LINK_OG_ID,
                        AdCreativeFields::LINK_URL,
                        AdCreativeFields::NAME,
                        AdCreativeFields::OBJECT_ID,
                        AdCreativeFields::OBJECT_STORY_ID,
                        AdCreativeFields::OBJECT_STORY_SPEC,
                        AdCreativeFields::OBJECT_TYPE,
                        AdCreativeFields::OBJECT_URL,
                        AdCreativeFields::PLATFORM_CUSTOMIZATIONS,
                        AdCreativeFields::PRODUCT_SET_ID,
                        AdCreativeFields::STATUS,
                        AdCreativeFields::TEMPLATE_URL,
                        AdCreativeFields::TEMPLATE_URL_SPEC,
                        AdCreativeFields::THUMBNAIL_URL,
                        AdCreativeFields::TITLE,
                        AdCreativeFields::URL_TAGS,
                        AdCreativeFields::USE_PAGE_ACTOR_OVERRIDE,
                        AdCreativeFields::VIDEO_ID,
                        AdCreativeFields::CALL_TO_ACTION,
                        AdCreativeFields::DYNAMIC_AD_VOICE,
                        AdCreativeFields::IMAGE_FILE
                    ), array($creativeParams));
                    foreach ($creativeCursor as $adCreative) {
                        Log::info("Ad Account Id: " . $fbAccountId . " AdSet Id: " . $ad->adset_id . " STATUS: " . $ad->status . " E STATUS: " . $ad->effective_status . " Ad Id: " . $ad->id . " Ad Name: " . $ad->name . " Ad Creative Id: " . $adCreative->id . " Url Tags: " . $adCreative->url_tags);
                        if ($this->isValidCampaignObject($ad->adset_id)){
                            if (isset($adCreative->{ AdCreativeFields::URL_TAGS })) {
                                if ($adCreative->{AdCreativeFields::OBJECT_STORY_SPEC} == null ){
                                    parse_str($adCreative->url_tags, $urlTagArray);
                                    if (!array_key_exists('asid', $urlTagArray)) {
                                        $updateCount++;
                                        $urlTagArray['asid'] = $ad->adset_id;
                                        ksort($urlTagArray);
                                        $adCreative->{ AdCreativeFields::URL_TAGS } = http_build_query($urlTagArray);
                                        ksort($urlTagArray);

                                        parse_str($adCreative->url_tags, $urlTagArray);
                                        if (!$dryRun) {

                                            $this->replaceAdCreative($ad, $adCreative);
                                        }

                                    } else {
                                        $skipCount++;
                                        Log::info("Skipping [Key Exists]  " . " Ad Account Id: " . $fbAccountId . " AdSet Id: " . $ad->adset_id . " STATUS: " . $ad->status . " E STATUS: " . $ad->effective_status . " Ad Id: " . $ad->id . " Ad Name: " . $ad->name . " Ad Creative Id: " . $adCreative->id . " Url Tags: " . $adCreative->url_tags);
                                    }

                                }
                                else {
                                    $skipCount++;
                                    Log::info("Skipping [ObjectStorySpec]  " . " Ad Account Id: " . $fbAccountId . " AdSet Id: " . $ad->adset_id . " STATUS: " . $ad->status . " E STATUS: " . $ad->effective_status . " Ad Id: " . $ad->id . " Ad Name: " . $ad->name . " Ad Creative Id: " . $adCreative->id . " Url Tags: " . $adCreative->url_tags);
                                }
                            }
                            else {
                                $skipCount++;
                                Log::info("Skipping [Missing URL Tag]  " . " Ad Account Id: " . $fbAccountId . " AdSet Id: " . $ad->adset_id . " STATUS: " . $ad->status . " E STATUS: " . $ad->effective_status . " Ad Id: " . $ad->id . " Ad Name: " . $ad->name . " Ad Creative Id: " . $adCreative->id . " Url Tags: " . $adCreative->url_tags);
                            }
                        }
                        else{
                            $skipCount++;
                            Log::info("Skipping [Invalid Campaign Objective] " . " Ad Account Id: " . $fbAccountId . " AdSet Id: " . $ad->adset_id . " STATUS: " . $ad->status . " E STATUS: " . $ad->effective_status . " Ad Id: " . $ad->id . " Ad Name: " . $ad->name . " Ad Creative Id: " . $adCreative->id . " Url Tags: " . $adCreative->url_tags);
                        }


                    }
                }
            }
            break;
        } catch (\Exception $e) {
            $exception = $e;
            $updateCount = 0;
            $skipCount = 0;
            $attempts++;
            Log::error("Sync Ad Url Tag Error for Account[" . $fbAccountId . "] Code:" . $e->getCode() . " Message:" . $e->getMessage() . PHP_EOL . $e->getTraceAsString());
            Log::warning("Sleeping for " . ($attempts * 30) . " seconds...");
            sleep($attempts * 30);
            continue;
        }
    } while ($attempts < env('COMMAND_RETRY_LIMIT', 3));


    if ($attempts >= env('COMMAND_RETRY_LIMIT', 3)) {
        throw  $exception;
    }

    Log::info("Ad Account Id: " . $fbAccountId . " Updated AdSets: " . $updateCount . " Skipped AdSets: " . $skipCount);
    return (object)['updateCount' => $updateCount, 'skipCount' => $skipCount];
}

'replaceAdCreative'方法:

private function replaceAdCreative($ad, $adCreative)
{

    $newAdCreative = new AdCreative(null);

    if ($adCreative->{AdCreativeFields::OBJECT_STORY_SPEC} != null ){

        $adCreativeObjectStorySpecField = null;
        if (ISSET($adCreative->{AdCreativeFields::OBJECT_STORY_SPEC}[AdCreativeObjectStorySpecFields::VIDEO_DATA]))
        {
            $adCreativeObjectStorySpecField = adCreativeObjectStorySpecFields::VIDEO_DATA;
        }
        else if (ISSET($adCreative->{AdCreativeFields::OBJECT_STORY_SPEC}[adCreativeObjectStorySpecFields::LINK_DATA]))
        {
            $adCreativeObjectStorySpecField = adCreativeObjectStorySpecFields::LINK_DATA;
        }
        else if (ISSET($adCreative->{AdCreativeFields::OBJECT_STORY_SPEC}[adCreativeObjectStorySpecFields::PHOTO_DATA]))
        {
            $adCreativeObjectStorySpecField = adCreativeObjectStorySpecFields::PHOTO_DATA;
        }
        else if (ISSET($adCreative->{AdCreativeFields::OBJECT_STORY_SPEC}[adCreativeObjectStorySpecFields::TEMPLATE_DATA]))
        {
            $adCreativeObjectStorySpecField = adCreativeObjectStorySpecFields::TEMPLATE_DATA;
        }

        if ($adCreativeObjectStorySpecField != null){
            if (ISSET($adCreative->{AdCreativeFields::OBJECT_STORY_SPEC}[$adCreativeObjectStorySpecField]->{AdCreativeFields::IMAGE_URL}) &&
                ISSET($adCreative->{AdCreativeFields::OBJECT_STORY_SPEC}[$adCreativeObjectStorySpecField]->{AdCreativeFields::IMAGE_HASH}))
                $adCreative->{AdCreativeFields::OBJECT_STORY_SPEC}[$adCreativeObjectStorySpecField][AdCreativeFields::IMAGE_URL] = NULL;
                //@TODO this is not working!!!^^^^
        }
    }

    $newAdCreative->setData(array(
        AdCreativeFields::ACCOUNT_ID => $ad->account_id,
        AdCreativeFields::ACTOR_ID => $adCreative->actor_id,
        AdCreativeFields::ADLABELS => $adCreative->adlabels,
        AdCreativeFields::APPLINK_TREATMENT => $adCreative->applink_treatment,
        AdCreativeFields::BODY => $adCreative->body,
        AdCreativeFields::CALL_TO_ACTION_TYPE => $adCreative->call_to_action_type,
        AdCreativeFields::EFFECTIVE_INSTAGRAM_STORY_ID => $adCreative->effective_instagram_story_id,
        AdCreativeFields::EFFECTIVE_OBJECT_STORY_ID => $adCreative->effective_object_story_id,
        AdCreativeFields::ID => $adCreative->id,
        AdCreativeFields::IMAGE_CROPS => $adCreative->image_crops,
        AdCreativeFields::IMAGE_HASH => $adCreative->image_hash,
        AdCreativeFields::IMAGE_URL => $adCreative->image_url,
        AdCreativeFields::INSTAGRAM_ACTOR_ID => $adCreative->instagram_actor_id,
        AdCreativeFields::INSTAGRAM_PERMALINK_URL => $adCreative->instagram_permalink_url,
        AdCreativeFields::INSTAGRAM_STORY_ID => $adCreative->instagram_story_id,
        AdCreativeFields::LINK_OG_ID => $adCreative->link_og_id,
        AdCreativeFields::LINK_URL => $adCreative->link_url,
        AdCreativeFields::NAME => $adCreative->name,
        AdCreativeFields::OBJECT_ID => $adCreative->object_id,
        AdCreativeFields::OBJECT_STORY_ID => $adCreative->object_story_id,
        AdCreativeFields::OBJECT_STORY_SPEC => $adCreative->object_story_spec,
        AdCreativeFields::OBJECT_TYPE => $adCreative->object_type,
        AdCreativeFields::OBJECT_URL => $adCreative->object_url,
        AdCreativeFields::PLATFORM_CUSTOMIZATIONS => $adCreative->platform_customizations,
        AdCreativeFields::PRODUCT_SET_ID => $adCreative->product_set_id,
        AdCreativeFields::STATUS => $adCreative->status,
        AdCreativeFields::TEMPLATE_URL => $adCreative->template_url,
        AdCreativeFields::TEMPLATE_URL_SPEC => $adCreative->template_url_spec,
        AdCreativeFields::THUMBNAIL_URL => $adCreative->thumbnail_url,
        AdCreativeFields::TITLE => $adCreative->title,
        AdCreativeFields::URL_TAGS => $adCreative->url_tags,
        AdCreativeFields::USE_PAGE_ACTOR_OVERRIDE => $adCreative->use_page_actor_override,
        AdCreativeFields::VIDEO_ID => $adCreative->video_id,
        AdCreativeFields::CALL_TO_ACTION => $adCreative->call_to_action,
        AdCreativeFields::DYNAMIC_AD_VOICE => $adCreative->dynamic_ad_voice,
        AdCreativeFields::IMAGE_FILE => $adCreative->image_file,
    ));
    Log::info("Old Creative Id: " . $adCreative->id . " Old Creative Creative Id: " . $adCreative->creative_id);
    $ad->creative = $newAdCreative;
    try{
        $adCreativeResponse = $ad->update();
    }
    catch (RequestException $e){
        $errorMsg = $this->requestExceptionToString($e);
        Log::error($errorMsg);
        throw new \Exception($errorMsg);
    }

    Log::info("New Creative Id: " . $adCreativeResponse->creative->id . " New Creative Creative Id: " . $adCreativeResponse->creative->creative_id);
    Log::info("Updated: " . " Ad Account Id: " . $ad->account_id . " AdSet Id: " . $ad->adset_id . " Ad Id: " . $ad->id . " Ad Name: " . $ad->name . " Ad Creative Id: " . $adCreativeResponse->creative->id . " Url Tags: " . $adCreativeResponse->creative->url_tags);


}

我按照以下步驟成功完成了此操作

  1. 創建具有所需值的新廣告素材
  2. 將此新廣告素材分配給附加了舊廣告素材的“廣告”

以下是我用來解決此問題的PHP代碼。

$newObj = new AdCreative(null, 'act_account_id');
    $newData = [];
    $fields = [
        AdCreativeFields::NAME,
        AdCreativeFields::TITLE,
        AdCreativeFields::BODY,
        AdCreativeFields::OBJECT_URL,
        AdCreativeFields::LINK_URL,
        AdCreativeFields::IMAGE_HASH,
        AdCreativeFields::OBJECT_STORY_ID,
        AdCreativeFields::OBJECT_STORY_SPEC,
        AdCreativeFields::URL_TAGS,
    ];
    foreach ($fields as $field) {
        $value = $oldAdCreative->{$field};
        if(isset($newValues[$field])){
            $value = $newValues[$field];
        }
        $newData[$field] = $value;
    }
    $newObj->setData($newData);
    $newObj->create();

    // Assigning New Creative ID to Ad
    $ad = new Ad($adId);
    $ad->update(array(
        'creative' => ['creative_id' => $newObj->{AdCreativeFields::ID}],
        'redownload' => true,
    ));

做完了

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM