Необходимо установить композе и последнюю версию FACEBOOK BUSINESS SDK https://github.com/facebook/facebook-php-business-sdk
На момент публикации последния версия 12.0.1
После установки SDK создадим плагин
Обработчики событий:
OnDocUnPublished
OnDocPublished
OnDocFormSave
Первый токен получается по ссылке https://developers.facebook.com/tools/explorer/?method=GET, данный токен обменивается на долгий токен, который действует 60 дней, далее этот токен надо обновить либо поулчить автоматически, реализации для получения токена нет.
$eventName = $modx->event->name;
include_once(MODX_BASE_PATH . '/vendor/autoload.php');
use FacebookAds\Api;
if(($eventName == 'OnDocFormSave' || $eventName == 'OnDocPublished' || $eventName == 'OnDocUnPublished') && $resource->getTVValue('instagram_allow_export') == '1')
{
$app_id = "ID приложения";
$app_secret = "Секрет приложения";
$product_catalog_id = "ID каталога";
if(!function_exists(getInstagramToken))
{
function getInstagramToken() {
global $modx;
$app_id = "ID приложения";
$app_secret = "Секрет приложения";
$file_token = file_get_contents(MODX_BASE_PATH.'instagram_token.txt');
if(trim($file_token)!='')
{
$user_access_token = trim($file_token);
}
else
{
$user_access_token = $modx->getOption('instagram_user_token');
}
$url = "https://graph.facebook.com/v2.10/oauth/access_token?grant_type=fb_exchange_token&client_id=$app_id&client_secret=$app_secret&fb_exchange_token=".$user_access_token;
$token_exchange = file_get_contents($url);
$token_answer = json_decode($token_exchange);
if($token_answer->error)
{
return false;
}
if($token_answer->expires_in)
{
//Возвращаем долгий токен
file_put_contents(MODX_BASE_PATH.'instagram_token.txt', $token_answer->access_token);
return $token_answer->access_token;
}
else
{
file_put_contents(MODX_BASE_PATH.'instagram_token.txt', '');
}
return false;
}
}
if($monthToken = getInstagramToken())
{
if($resource->get('class_key') == 'msProduct')
{
Api::init($app_id, $app_secret, $monthToken);
$api = Api::instance();
//Данные для отправки в инстаграм
$productTitle = $resource->get('pagetitle');
$productImage = $resource->getTVValue('instagram_image') != '' ? '/'.$resource->getTVValue('instagram_image') : $resource->get('image');
$productText = $resource->getTVValue('instagram_text') != '' ? $resource->getTVValue('instagram_text') : strip_tags($resource->get('content'));
// Новый товар в каталог инстаграма
$product_url= $modx->makeUrl($modx->resource->get('id'), '', '', '-1');
$product_status = $modx->resource->get('published')==1 ? 'published' : 'staging';
try {
$request = $api->call(
"/$product_catalog_id/batch",
'POST',
[
'allow_upsert'=>true,
'item_type' => 'PRODUCT_ITEM',
'requests' => json_encode([
(object) [
'retailer_id' => $modx->resource->get('id'),
'method'=>'CREATE',
'data' => (object) [
'name' => $modx->resource->get('pagetitle'),
'price' => $modx->resource->get('price')*100,
'category' => '10',
'currency' => 'RUB',
'image_url' => 'https://fruttidimare.ru'.$productImage,
'brand' => 'Фрукты моря',
'description'=> $productText,
'url' => "$product_url",
'visibility' => $product_status
]
],
])
]
);
} catch(Exception $e) {
// When Graph returns an error
$modx->log(1, 'Graph returned an error: ' . print_r($e,true). $e->getMessage());
exit;
}
}
}
else
{
$modx->event->output('Токен инстаграма не указан или устарел! Обновите токен в настройках контекста mrg. Получить токен: https://developers.facebook.com/tools/explorer/?method=GET');
return '[onSaveInstagramExport] Не удалось Опубликовать товар в инстаграм каталог. Страница товара - '.$id;
}
}