Создание рекламы в Yandex Direct через API Битрикс

3k
Алексей,
Создание рекламы в 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) в настройках битрикс.

Есть вопросы или нашли ошибку? Напишите комментарий (можно без регистрации), отвечать стараюсь быстро.

Опубликовано 10 июня 2018 | Обновлено 13 июня 2018
seo, примеры d7
Поделиться
Комментарии
❮…❯
Авторизуйтесь чтобы получать уведомления об ответе
В Битриксе есть занимательная штука - автоконтекст. Это когда рекламное объявление показывается в зависимости от наличия товара. Но создавать вручную объявление на каждый товар занятие так себе. Поэтому написал скриптик, который делает это за меня.