Плагин для автоматической публикации товаров в магазин Facebook/Instagram

Необходимо установить композе и последнюю версию 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;
    }
}