8

Ich habe eine Menge über Facebook-Anzeigen und solche Sachen gelesen, benutze GUI, um das zu tun, was ich mache, und aus irgendeinem Grund auf SDK tut es das nicht.Facebook Ads Sdk erlaubt keine Werbung über API. Subcode: 1487930

Ich bekomme diesen suberror Code auf Facebook Anzeigen sdk Subcode .

Die Meldung sagt:

Sie müssen ein Objekt auswählen zu fördern, die Benutzernachricht sagt: Ihre Kampagne muss> umfasst eine Anzeige mit einem ausgewählten Objekt auf Ihr Ziel>> (ex Bezug zu fördern: Seite, URL, Ereignis). Bitte aktualisieren Sie Ihre Anzeige, um fortzufahren.

Antwort lieferte keine Felder verantwortlich zu machen und Fehler passiert, wenn kreative erstellt wird: $creative->create();

ich mein Setup adset wie folgt aus:

use Facebook; 
    use FacebookAds\Api; 
    use FacebookAds\Object; 
    use Facebook\Exceptions; 

     $inventory = new Models\AdvertisingInventory(); 
     $item = $inventory->getListing($id)->getAttributes(); 
     $item['properties'] = json_decode($item['properties'], true); 

     /** 
     * Step 1 Instantiate an API 
     * 
     * @link https://developers.facebook.com/docs/marketing-api/sdks#init-sdk 
     */ 

     try { 
      Api::init($this->app_id, $this->app_secret, $this->access_token); 
     } catch (\Exception $e) { 
      return $this->AdvertisingRenderErrorMessage($e); 
     } 

     /** 
     * Step 2 Query to create campaign 
     * @var $campaign 
     * @link https://developers.facebook.com/docs/marketing-api/reference/ad-campaign-group 
     * 
     * TODO: Implement ad image widget sizing: https://www.facebook.com/business/help/103816146375741 
     */ 
     try { 

      $account = new Object\AdAccount($this->current_facebook_ads_account); 

      $campaign = new Object\Campaign(null, $this->current_facebook_ads_account); // Getting AdAccount instance 

      $ad_campaigns = $account->getCampaigns($campaign::getFields())->getArrayCopy(); // Checks of there are any campaigns already created 

      $current_campaign = null; 

      if (!empty($ad_campaigns)) { 
       foreach ($ad_campaigns as $ad_campaign) { // loops through campaigns 
        $campaign_data = $ad_campaign->exportAllData(); 
        if ($campaign_data['name'] == 'Sell old inventory') { // If campaign name matches the name given to new campaign, created campaign is then used 
         $current_campaign = $ad_campaign; 
        } 
       } 
      } 

      if (!is_null($current_campaign)) { // Checks if campaign is already assigned if yes, then its used. 
       $campaign = $current_campaign; 
      } else { // else new one is created 
       $campaign->setData(array(
        Object\Fields\CampaignFields::NAME => 'Sell old inventory', 
        Object\Fields\CampaignFields::OBJECTIVE => Object\Values\CampaignObjectiveValues::LINK_CLICKS, 
       )); 

       $campaign->validate()->create(array(
        Object\Campaign::STATUS_PARAM_NAME => Object\Campaign::STATUS_PAUSED 
       )); 
      } 

      //$campaignData = $campaign->getData(); 

      echo 'Campaign ID: ' . $campaign->id . " <br>\n"; 

     } catch (\Exception $e) { 
      return $this->AdvertisingRenderErrorMessage($e); 
     } 

     /** 
     * Step 3 Search for targeting topic 
     * @var $targeting 
     * @link https://developers.facebook.com/docs/marketing-api/targeting-specs/v2.7 
     */ 
     try { 
      $results = Object\TargetingSearch::search(
       Object\Search\TargetingSearchTypes::INTEREST, 
       null, 
       'Automobiles'); 

      $target = (count($results)) ? $results->current() : null; 

      //if (!is_null($target)) { 

      echo "Using target: " . $target->name . "<br/>"; 

      $targeting = new Object\Targeting(); 
      $targeting->{Object\Fields\TargetingFields::GEO_LOCATIONS} = array(
       'countries' => array('NZ') 
      ); 
      $targeting->{Object\Fields\TargetingFields::INTERESTS} = array(
       array(
        'id' => $target->id, 
        'name' => $target->name, 
       ), 
      ); 
      //} 
     } catch (\Exception $e) { 
      return $this->AdvertisingRenderErrorMessage($e); 
     } 

     /** 
     * Step 4 Create an AdSet 
     * @var $adset 
     * @link https://developers.facebook.com/docs/marketing-api/reference/ad-campaign 
     */ 
     try { 

      $adset = new Object\AdSet(null, $this->current_facebook_ads_account); 
      //$fields = $adset::getFields(); 

      $available_adsets = $campaign->getAdSets(array(Object\Fields\AdSetFields::NAME,Object\Fields\AdSetFields::ID)); 

      $current_adset = null; 

      if (!empty($available_adsets)) { 
       foreach ($available_adsets as $ad_set) { // loops through adsets 
        if ($adset->name == $item['title']) { // If adset name matches the name given to new campaign, created campaign is then used 
         $current_adset = $ad_set; 
        } 
       } 
      } 

      if (!is_null($current_adset)) { 
       $adset = $current_adset; 
       /*$adset->read(array(
        Object\Fields\AdSetFields::PROMOTED_OBJECT, 
        Object\Fields\AdSetFields::NAME 
       )); 
       echo $adset->name."<br>"; 
       echo $adset->promoted_object."<br>";*/ 
      } else { 

       $start_time = (new \DateTime("+1 week"))->format(\DateTime::ISO8601); 
       $end_time = (new \DateTime("+2 week"))->format(\DateTime::ISO8601); 


       $adset->setData(array(
        Object\Fields\AdSetFields::NAME => $item['title'], 
        Object\Fields\AdSetFields::OPTIMIZATION_GOAL => Object\Values\AdSetOptimizationGoalValues::LINK_CLICKS, 
        Object\Fields\AdSetFields::BILLING_EVENT => Object\Values\AdSetBillingEventValues::LINK_CLICKS, 
        Object\Fields\AdSetFields::BID_AMOUNT => 100, 
        Object\Fields\AdSetFields::DAILY_BUDGET => 500, 
        Object\Fields\AdSetFields::CAMPAIGN_ID => $campaign->id, 
        Object\Fields\AdSetFields::TARGETING => $targeting, 
        Object\Fields\AdSetFields::START_TIME => $start_time, 
        Object\Fields\AdSetFields::END_TIME => $end_time, 
        Object\Fields\AdSetFields::PROMOTED_OBJECT => (object) array(
         Object\Fields\AdPromotedObjectFields::PAGE_ID => '178698438995498', 
        ) 
       )); 
       $adset->create(array(
        Object\AdSet::STATUS_PARAM_NAME => Object\AdSet::STATUS_PAUSED, 
       )); 
      } 
      echo 'Adset ID: ' . $adset->id . " <br>\n"; 
     } catch (\Exception $e) { 
      return $this->AdvertisingRenderErrorMessage($e); 
     } 


     //New method 
     /** 
     * Step 5 Create an AdImage 
     * @var $image 
     * @link https://developers.facebook.com/docs/marketing-api/reference/ad-image 
     */ 
     try { 
      $image = new Object\AdImage(null, $this->current_facebook_ads_account); // Invokes images preparation for Facebook ad instance 
      $target_path = __DIR__ . '/assets/temp/'; // path where images will be streamed to 

      if (!file_exists($target_path)) { 
       mkdir($target_path, 0755); // creating path if one doesn't exist 
      } 

      $files_in_dir = array_diff(scandir($target_path), array('..', '.')); // checking for existing files in target directory 
      $size = getimagesize($item['properties']['images_large'][0]); // getting image details 
      $extension = image_type_to_extension($size[2]); // getting image extension from type 
      $target_file_name = preg_replace(['/\./', '/\\s/', '/\\t/'], "_", strtolower($item['title'])) . $extension; // creating proper file name 
      $target_file = $target_path . $target_file_name; // setting full target directory 

      if (array_search($target_file_name, $files_in_dir) === false) { // checking if target file already exists 

       $image_file = file_get_contents($item['properties']['images_large'][0]); 

       file_put_contents($target_file, $image_file); 
      } 

      $image->{Object\Fields\AdImageFields::FILENAME} = $target_file; // Using target file as ad image 

      $image->create(); 

      echo 'Image Hash: ' . $image->hash . " <br>\n"; 
     } catch (\Exception $e) { 
      return $this->AdvertisingRenderErrorMessage($e); 
     } 

     /** 
     * Step 6 Create an AdCreative 
     */ 
     try { 

      $creative = new Object\AdCreative(null, $this->current_facebook_ads_account); 

      $available_creatives = $adset->getAdCreatives($creative::getFields()); 

      $current_creative = null; 

      if (!empty($available_creatives)) { 
       foreach ($available_creatives as $creative) { // loops through adsets 
        if ($creative->name == 'Creative of '.$item['title']) { // If adset name matches the name given to new campaign, created campaign is then used 
         $current_creative = $creative; 
        } 
       } 
      } 

      if (!is_null($current_creative)) { 
       $creative = $current_creative; 
      } else { 

       $creative = new Object\AdCreative(null, $this->current_facebook_ads_account); 
       $creative->setData(array(
        Object\Fields\AdCreativeFields::NAME => 'Creative of '.$item['title'], 
        Object\Fields\AdCreativeFields::TITLE => $item['title'], 
        Object\Fields\AdCreativeFields::BODY => $item['properties']['description'], 
        Object\Fields\AdCreativeFields::IMAGE_HASH => $image->hash, 
        Object\Fields\AdCreativeFields::LINK_URL => ipConfig()->get('globalPortalUrl'), 
        Object\Fields\AdCreativeFields::OBJECT_URL => ipConfig()->get('globalPortalUrl'), 
       )); 
       **$creative->create();** 
      } 
      echo 'Creative ID: ' . $creative->id . " <br>\n"; 
     } catch (\Exception $e) { 
      return $this->AdvertisingRenderErrorMessage($e); 
     } 


     /** 
     * Step 7 Create an Ad 
     * 
     * Then, use the image hash returned from above. Finally, create your ad along with ad creative. 
     * Please note that the ad creative is not created independently, rather its data structure 
     * is appended to the ad group 
     * 
     * @link https://developers.facebook.com/docs/marketing-api/reference/adgroup 
     */ 
     try { 

      $ad = new Object\Ad(null, $this->current_facebook_ads_account); 

      $last_ad = $adset->getAds($ad::getFields())->end()->exportData(); 

      //var_dump($last_ad); exit(); 

      $ad->setData(array(
       Object\Fields\AdFields::NAME => $item['title'].' #1', 
       Object\Fields\AdFields::ADSET_ID => $adset->id, 
       Object\Fields\AdFields::CREATIVE => array('creative_id' => $creative->id), 
      )); 
      $ad->create(array(
       Object\Ad::STATUS_PARAM_NAME => Object\Ad::STATUS_PAUSED, 
      )); 
      echo 'Ad ID:' . $ad->id . " <br>\n"; 

     } catch (\Exception $e) { 
      return $this->AdvertisingRenderErrorMessage($e); 

     } 

ich diese Seite, um mein Geschäft Konto zugeordnet und dass App, die die Abfrage durchläuft und der Benutzer ist der Besitzer des Geschäftsaccounts, der App und der Seite.

Was braucht es noch, wenn die Seiten-ID angegeben wird? Die Kampagne Ziel ist:

Object\Fields\CampaignFields::OBJECTIVE => Object\Values\CampaignObjectiveValues::LINK_CLICKS 

Ich benutze gültige PAGE_ID. Ich vermisse ich zusätzliche Daten für das (FYI versucht, dies ohne (Objekt) typehint):

Object\Fields\AdSetFields::PROMOTED_OBJECT => (object) array(
    Object\Fields\AdPromotedObjectFields::PAGE_ID => '178698438995498', 
) 

Oder gibt es Probleme mit App-Seite und Geschäftskonto-Einstellungen?

Bitte jemand beantworten meine Anrufe. Versucht fast alles kann diesen Punkt nicht passieren. Alle anderen beworbenen Objekte funktionieren nicht mit dem Kampagnenziel.

P.S. Jemand mit Ruf mehr als 1500 bitte erstellen Sie ne Facebook-php-ads-sdk-Tag.

+1

Haben Sie eine Lösung gefunden? – aks

+0

Ja, aber ich erinnere mich nicht daran, ich denke es war wegen der ungültigen Konstanten als Parameter auf dem Bild, ich habe einen funktionierenden Code. Wenn Sie mich brauchen, pm. :-) P. S. Wenn Sie planen, ständig automatisierte Werbung zu machen, dann sprechen Sie mit Google nach Geschäftskonto oder etwas, sie werden Beschränkungen auf das Konto erheben. Aber ich werde versuchen zu sehen, was anders ist, als es vor morgen war, weil ich jetzt wirklich beschäftigt bin. – juslintek

Antwort

1

Ich glaube nicht, gefördert Objekt für LINK_CLICKS Ziel ist erforderlich. Hast du versucht, es überhaupt nicht zu setzen?

Facebook docs für Anzeigensatz, Abschnitt Erstellen Feld promoted_object sagt

Erforderlich mit bestimmten Kampagnenziele

und das LINK_CLICKS Ziel ist dort nicht aufgeführt.


Alternativ können Sie eine Anzeige mit den gewünschten Parameter durch FB-Schnittstelle (Anzeigen-Manager oder Power-Editor) erstellen und dann ihre Werte über die API zurückgelesen, um zu sehen, welche Felder ausgefüllt sind und welche Werte verwendet wurden.

+0

Ich verwende das LINK_CLICKS-Ziel und sehe dasselbe "Ihre Kampagne muss eine Anzeige mit einem ausgewählten Objekt enthalten, das für Ihr Ziel relevant ist (z. B. Seite, URL, Ereignis). Aktualisieren Sie Ihre Anzeigengruppe, um fortzufahren. . "wenn ich meine neue Anzeige an /ads. – Kirby

1

Ich hatte diesen Fehler, weil ich beim Erstellen eines Adcreative den falschen Parameternamen verwendete.Ich benutzte page_id anstelle von object_id.

Ich hoffe, es kann jemandem helfen.