Я пытаюсь создать очиститель рекламы Facebook, который удаляет завершенные AdSets в указанной кампании. Существует ограничение на количество не удаленных неархивированных AdSets (которое составляет 10000 для массовых учетных записей), и мы довольно быстро достигаем этого лимита.
Я использую Marketing API и SDK Facebook Ads API для PHP: https://github.com/facebook/facebook-php-ads-sdk
Хотя ясно, как можно получить AdSets, я не могу найти способ отфильтровать их по времени окончания. Есть параметр «с», но похоже, что он не фильтрует по дате начала и окончания AdSet, а фильтрует саму статистику. Следовательно, AdSet, который все еще активен, попадет в указанный диапазон.
Мой код:
use FacebookAds\Object\Campaign;
use FacebookAds\Object\Fields\AdSetFields;
use Carbon\Carbon;
// Facebook ID of a Ad Campaign
$external_id = '123456789';
$campaign = new Campaign( $external_id );
// Querying required field only
$fields = [
AdSetFields::END_TIME
];
// Need to query AdSets which have been completed in the past...?
$params = [
];
$adsets = $campaign->getAdSets( $fields, $params );
$adsets->setUseImplicitFetch( true );
while ( $adsets->valid() )
{
/** @var AdSet $adset */
$adset = $adsets->current();
$end_time = Carbon::parse( $adset->{AdSetFields::END_TIME} );
if ( $end_time->isPast() )
{
$adset->delete();
}
$adsets->next();
}
Проблема: в случае, если в кампании много AdSet, это будет буквально означать повторение ВСЕХ AdSets внутри один за другим и проверка даты его окончания. Обычно речь идет о тысячах записей, и такой подход крайне неэффективен. Поскольку у нас много рекламных аккаунтов, скрипт «очистки» работает вечно, даже если время ожидания не истекает быстро.
Вопрос: есть ли способ отфильтровать AdSets по end_time? Похоже, это возможно путем явного доказательства значения, но я не могу найти способ отфильтровать значение, используя синтаксис «меньше чем» или «больше чем».