Создание рекламы в Yandex Direct через API Битрикс
В Битриксе есть занимательная штука - автоконтекст. Это когда рекламное объявление показывается в зависимости от наличия товара. Но создавать вручную объявление на каждый товар - занятие так себе. Поэтому написал скриптик, который делает это за меня.
Ниже представлен пример кода, который нужно будет "подогнать" под себя. Вкратце о том, что делает код: получаем список текущий объявлений с привязкой к товарам, берем товары которых нет в объявлениях, по параметрам этих товаров создаем новые объявления с привязкой.
use Bitrix\Main, Bitrix\Seo\Engine, Bitrix\Seo\Adv; Main\Loader::includeModule('seo'); Main\Loader::includeModule('iblock'); $engine = new Engine\YandexDirect(); $currentUser = $engine->getCurrentUser(); $campaignId = 1; // Получаем список текущих объявлений $dbBanners = Adv\YandexBannerTable::getList(array( 'filter' => array('=CAMPAIGN_ID' => $campaignId, '=ENGINE_ID' => $engine->getId()), 'select' => array('*'), )); while ($arBanner = $dbBanners->fetch()) { $dbItem = Adv\LinkTable::getList(array( // Привязка к товару "filter" => array( '=BANNER_ID' => $arBanner['ID'], ), "select" => array( "LINK_TYPE", "LINK_ID", ) )); if ($arItem = $dbItem->fetch()) { $arExistIds[] = $arItem["LINK_ID"]; } } // Получаем список товаров $dbItems = CIBlockElement::GetList( array(), array( 'IBLOCK_CODE' => 'catalog', 'SECTION_CODE' => 'main', 'ACTIVE' => 'Y', '!ID' => $arExistIds, ), false, false, array('ID', 'IBLOCK_ID', 'NAME', 'DETAIL_PAGE_URL') ); while ($obItem = $dbItems->GetNextElement()) { $arItem = $obItem->GetFields(); $arItem['PROPERTIES'] = $obItem->GetProperties(); // Добавляем объявление $result = Adv\YandexBannerTable::add(array( "ENGINE_ID" => $engine->getId(), "ACTIVE" => 'Y', "OWNER_ID" => $currentUser['id'], "OWNER_NAME" => $currentUser["login"], "NAME" => substr($arItem['NAME'], 0, 35), "CAMPAIGN_ID" => $campaignId, "AUTO_QUANTITY_OFF" => 'Y', "AUTO_QUANTITY_ON" => 'Y', "SETTINGS" => array( "Type" => 'TEXT_AD', "Text" => 'У нас Вы можете купить '.substr($arItem['NAME'], 0, 39).' по цене '.$arItem['PROPERTIES']['PRICE']['VALUE'].'р.', "Title" => 'Купить '.substr($arItem['NAME'], 0, 35), "Href" => 'https://site.ru'.$arItem['DETAIL_PAGE_URL'], "MinusKeywords" => array( 'кофе' ), "Geo" =>'225,977', // Вся Россия "Phrases" => array(array( 'PhraseID' => '0', 'Phrase' => trim('Купить '.str_replace(' - ', ' ', $arItem['NAME'])), 'AutoBudgetPriority' => "Medium" )) ) )); if($result->isSuccess()) { // Добавляем привязку к товару Adv\LinkTable::add(array( 'LINK_TYPE' => Adv\LinkTable::TYPE_IBLOCK_ELEMENT, 'LINK_ID' => $arItem['ID'], 'BANNER_ID' => $result->getId() )); } else { var_dump($result->getErrorMessages());exit; } exit; }
Рекомендую добавлять по одному объявлению за раз (стоит exit в конце скрипта) т.к. данные, похоже, сразу отправляются в yandex, а это не быстро. Так же важно, что для работы скрипта необходима успешная авторизация (в yandex) в настройках битрикс.
Есть вопросы или нашли ошибку? Напишите комментарий (можно без регистрации), отвечать стараюсь быстро.