Преамбула.
Эта статья является логическим продолжением и дополнением этой моей статьи. А также полностью с ней взаимосвязана, отсылки к ней будут периодически здесь появляться.
Здесь мы рассмотрим код 1С, с помощью которого сможем сделать следующее с фотографией/картинкой (медиа) на сайте:
- Создать.
- Обновить/изменить.
- Посмотреть 1.
- Посмотреть список.
- Удалить.
Также сможем сделать аналогичное с категориями товаров магазина WooCommerce, плюс привязка к категории картинки (Миниатюры).
Публикация Медиа.
Конечные точки WordPress используемые для медиа.
- POST.
- GET.
- DELETE.
Чтобы было нагляднее и понятнее, трансляция:
команды/конечные точки запросов ВП
"Список" -> "GET"
"Получить" -> "GET"
"Создать" -> "POST"
"Обновить" -> "POST"
"Удалить" -> "DELETE"
Почему под некоторыми разными русскими "командами" используются одинаковые конечные точки WordPress? Не знаю, наверное, надо адресовать этот вопрос разработчикам CMS.
Маршруты WordPress используемые для медиа.
"Медиа" -> "/wp-json/wp/v2/media/"
Также можете по-экспериментировать с другими:
"Категория" -> "/wp-json/wp/v2/categories/"
"Посты" -> "/wp-json/wp/v2/posts/"
"Страницы" -> "/wp-json/wp/v2/pages/"
Немного теории. REST API Handbook / Reference / Media
Является моим вольным переводом книги разработчика, источник.
Мои комментарии: образец моего комментария.
Схема
Схема определяет все поля, существующие в записи элемента мультимедиа. Можно ожидать, что любой ответ от этих конечных точек будет содержать поля описанные ниже, если только не используется параметр запроса "_filter" или поле схемы не появляется только в определенном контексте.
date
Array, datetime |
Дата публикации объекта в часовом поясе сайта.
Контекст: view , edit , embed
В контексте приведенного ниже кода не использую.
|
date_gmt
Array, datetime |
Дата публикации объекта - GMT.
Контекст: view , edit
В контексте приведенного ниже кода не использую.
|
guid
object |
Глобальный уникальный идентификатор объекта.
Только для чтения.
Контекст: view , edit
В контексте приведенного ниже кода не использую, генерируется системой автоматически.
|
id
integer |
Уникальный идентификатор объекта.
Только для чтения
Контекст: view , edit , embed
В коде использую, генерируется системой автоматически.
|
link
string,
uri |
URL объекта.
Только для чтения
Контекст: view , edit , embed
В коде не использую, генерируется системой автоматически.
|
modified
string,
datetime |
Дата последнего изменения объекта в часовом поясе сайта.
Только для чтения
Контекст: view , edit
В коде использую, генерируется системой автоматически.
|
modified_gmt
string, datetime |
Дата последней модификации объекта в GMT.
Только для чтения.
Контекст: view , edit
В контексте приведенного ниже кода не использую.
|
slug
string |
Слаг, буквенно-цифровой идентификатор объекта, уникальный для его типа.
Контекст: view , edit , embed
В коде использую, лучше создавать самому, в латинице. Может генерироваться системой автоматически.
|
status
string |
Определенный статус объекта.
Контекст: view , edit.
Один из вариантов: publish , future , draft , pending , private
В коде использую как publish , обязательный реквизит.
|
type
string |
Type of Post for the object.
Только для чтения.
Контекст: view , edit , embed
В контексте приведенного ниже кода не использую, генерируется системой автоматически.
|
permalink_template
string |
Шаблон Permalink для объекта.
Только для чтения.
Контекст: edit
В контексте приведенного ниже кода не использую, генерируется системой автоматически.
|
generated_slug
string |
Слаг автоматически генерируется из названия объекта.
Только для чтения.
Контекст: edit
В контексте приведенного ниже кода не использую, генерируется системой автоматически.
|
title
object |
Заголовок/название объекта.
Контекст: view , edit , embed
В коде использую, обязательный для заполнения реквизит.
|
author
integer |
ID автора публикации объекта.
Контекст: view , edit , embed
В контексте приведенного ниже кода не использую, берется системой автоматически из Токена.
|
ping_status
string |
Устанавливает открыт или нет пинк к объекту.
Контекст: view , edit
Один из: open , closed
В контексте приведенного ниже кода не использую, системой автоматически устанавливается closed
|
meta
object |
Мета поля.
Контекст: view , edit
В контексте приведенного ниже кода не использую. Честно говоря, не знай где и как использовать.
|
template
string |
Файл темы, используемый для отображения объекта.
Контекст: view , edit
В контексте приведенного ниже кода не использую. Честно говоря, не знай где и как использовать.
|
alt_text
string |
Альтернативный текст для отображения, если вложение не отображается.
Контекст: view , edit , embed
В коде использую, не обязательный для заполнения реквизит.
|
caption
object |
Подпись к вложению.
Контекст: view , edit , embed
В коде использую, не обязательный для заполнения реквизит.
|
description
object |
Описание.
Контекст: view , edit
В коде использую, не обязательный для заполнения реквизит.
|
media_type
string |
Тип вложения.
Только для чтения.
Контекст: view , edit , embed
Один из: image , file
В контексте приведенного ниже кода не использую, генерируется системой автоматически.
|
mime_type
string |
MIME тип вложения.
Только для чтения.
Контекст: view , edit , embed
В контексте приведенного ниже кода не использую, генерируется системой автоматически.
|
media_details
object |
Подробные сведения о медиафайле, относящиеся к его типу.
Только для чтения.
Контекст: view , edit , embed
В контексте приведенного ниже кода не использую, генерируется системой автоматически.
|
post
integer |
ID связанной записи вложения.
Контекст: view , edit
В контексте приведенного ниже кода не использую, генерируется системой автоматически.
|
source_url
string,
uri |
URL-адрес исходного файла вложения.
Только для чтения.
Контекст: view , edit , embed
В контексте приведенного ниже кода не использую, генерируется системой автоматически.
|
missing_image_sizes
array |
Список отсутствующих размеров изображений вложения.
Только для чтения.
Контекст: edit
В контексте приведенного ниже кода не использую, генерируется системой автоматически.
|
Список медиа.
Запрос по этой конечной точке, чтобы получить коллекцию медиа. Полученный ответ можно контролировать и фильтровать с помощью приведенных ниже параметров URL-запроса.
GET /wp/v2/media
В контексте нижеописанного кода 1С выглядит так:
СПИСОК /wp/v2/media
Про Аргументы маршрута можно почитать по ссылке выше. Без аргументов выдает список из десяти элементов. Мной не использовались за ненадобность.
Просмотр элемента медиа.
Запрос по этой конечной точке, чтобы получить конкретную запись элемента мультимедиа.
GET /wp/v2/media/<id>
В контексте нижеописанного кода 1С выглядит так:
Получить /wp/v2/media/<id>
id - обязательный аргумент.
Удалить элемент медиа.
Аргументы.
id |
Уникальный идентификатор объекта. |
force |
Нужно ли помещать в "Корзину" или принудительно удалять его. Принимаемые значения "Истина" или "Ложь". |
DELETE /wp/v2/media/<id>
В контексте нижеописанного кода 1С выглядит так:
Удалить /wp/v2/media/<id>
id - обязательный аргумент.
Обновить элемент медиа.
Аналогичен созданию элемента медиа, описание ниже по тексту.
POST /wp/v2/media/<id>
В контексте нижеописанного кода 1С выглядит так:
Обновить /wp/v2/media/<id>
id - обязательный аргумент.
Создать элемент медиа.
Аргументы.
date |
Дата публикации объекта в часовом поясе сайта.
В контексте приведенного ниже кода не использую, генерируется системой автоматически. |
date_gmt |
Дата публикации объекта - GMT.
В контексте приведенного ниже кода не использую, генерируется системой автоматически. |
slug |
Слаг, буквенно-цифровой идентификатор объекта, уникальный для его типа.
В коде использую, лучше создавать самому, в латинице. Может генерироваться системой автоматически.
|
status |
Определенный статус объекта.
Один из вариантов: publish , future , draft , pending , private
В коде использую как publish , обязательный реквизит.
|
title |
Заголовок/название объекта.
В коде использую, обязательный для заполнения реквизит.
|
author |
ID автора публикации объекта.
В контексте приведенного ниже кода не использую, берется системой автоматически из Токена.
|
comment_status |
Устанавливает открыты или нет комментарии к объекту.
Один из: open , closed
В контексте приведенного ниже кода не использую, системой автоматически устанавливается closed
|
ping_status |
Устанавливает открыт или нет пинк к объекту.
Один из: open , closed
В контексте приведенного ниже кода не использую, системой автоматически устанавливается closed
|
meta |
Мета поля.
В контексте приведенного ниже кода не использую.
|
template |
Файл темы, используемый для отображения объекта.
В контексте приведенного ниже кода не использую.
|
alt_text |
Альтернативный текст для отображения, если вложение не отображается.
В коде использую, не обязательный для заполнения реквизит.
|
caption |
Подпись к вложению.
В коде использую, не обязательный для заполнения реквизит.
|
description |
Описание.
В коде использую, не обязательный для заполнения реквизит.
|
post |
ID связанной записи вложения.
В контексте приведенного ниже кода не использую.
|
Как используется.
POST /wp/v2/media
В контексте нижеописанного кода 1С выглядит так:
СОЗДАТЬ /wp/v2/media [Список аргументов]
Наверное это самый важный момент, поэтому рассмотрим его максимально подробно.
Публикация медиа-картинки из 1С на сайт WordPress.
Для этого использую внешнюю обработку на обычных формах. Код на управляемых формах не будет отличаться от приведенного здесь, чуть-чуть сложнее, но думаю для вас не составит труд адаптировать. Мне, честно говоря, было лень.
Исходные данные.
Аргументы запроса
Что означают первые 4 пункта, можно прочитать здесь.
- Token.
- Server
- Маршрут
- КонечнаяТочка
- _Заголовок - title в WordPress
- ИмяФайла - полный путь картинки на диске, например: C:\Foto\media.jpg
- Описание - description в WordPress
- альт_текст - alt_text в WordPress
- м_описание - caption в WordPress
- РасширениеФото - mime_type в WordPress, расширение файла
- Слаг - slug в WordPress, временное имя файла, если всё хорошо, становится именем.
Аргументы с 5 по 11 должны присутствовать в реквизитах элемента справочника (иной сущности) 1С. Можно иные данные, как вам будет удобнее.
Важное замечание: с самого начала, делал реквизиты на английском, как в WordPress. Однако в последствии столкнулся с тем, что многие "аглицкие" названия зарезервированы самой 1С, про этот момент забыл. Поэтому пришлось делать структуру перевода с "Русского" на "Английский" и обратно.
ВП_СтруктураСоответствийСАнгНаРусского=Новый Структура;
////маршруты ВП
ВП_СтруктураСоответствийСРусскогоНаАнг.Вставить(Врег("Категория") , "/wp-json/wp/v2/categories/");
ВП_СтруктураСоответствийСРусскогоНаАнг.Вставить(Врег("Медиа") , "/wp-json/wp/v2/media/");
ВП_СтруктураСоответствийСРусскогоНаАнг.Вставить(Врег("Посты") , "/wp-json/wp/v2/posts/");
ВП_СтруктураСоответствийСРусскогоНаАнг.Вставить(Врег("Страницы") , "/wp-json/wp/v2/pages/");
////команды/конечные точки запросов ВП
ВП_СтруктураСоответствийСРусскогоНаАнг.Вставить(Врег("Список") ,"GET");
ВП_СтруктураСоответствийСРусскогоНаАнг.Вставить(Врег("Получить") ,"GET");
ВП_СтруктураСоответствийСРусскогоНаАнг.Вставить(Врег("Создать") ,"POST");
ВП_СтруктураСоответствийСРусскогоНаАнг.Вставить(Врег("Обновить") ,"POST");
ВП_СтруктураСоответствийСРусскогоНаАнг.Вставить(Врег("Удалить") ,"DELETE");
ВП_СтруктураСоответствийСРусскогоНаАнг=Новый Структура;
////Обратное преобразование
/////Конвертируем ВП_СтруктураСоответствийСАнгНаРусского
Для каждого КлючИЗначение Из ВП_СтруктураСоответствийСРусскогоНаАнг Цикл
ВП_СтруктураСоответствийСАнгНаРусского.Вставить(НовыйКлюч,КлючИЗначение.Ключ);
КонецЦикла;
Сначала было непривычно, потом привык, потом расширил, стал использовать для конвертации ответов от сайта, так как многие аргументы совпадают или практически похожи, что не всегда понимаешь точно "аглицкий" ответ. А с этим очень многое сразу встало на свои места.
Если лениво создавать свои структуры, возьмите из обработки, скачать можно отсюда.
Конечные точки
"Список" -> "GET"
"Получить" -> "GET"
"Создать" -> "POST"
"Обновить" -> "POST"
"Удалить" -> "DELETE"
Маршрут
Медиа.
Процедуры и функции в модуле формы.
Локальный массив обязательных реквизитов медиа
Перем МассивОбязательныхРеквизитовМедиа;
МассивОбязательныхРеквизитовМедиа=Новый Массив;
МассивОбязательныхРеквизитовМедиа.Добавить("_Заголовок");
МассивОбязательныхРеквизитовМедиа.Добавить("ИмяФайла");
МассивОбязательныхРеквизитовМедиа.Добавить("Описание");
МассивОбязательныхРеквизитовМедиа.Добавить("альт_текст");
МассивОбязательныхРеквизитовМедиа.Добавить("м_описание");
МассивОбязательныхРеквизитовМедиа.Добавить("РасширениеФото");
МассивОбязательныхРеквизитовМедиа.Добавить("Слаг");
////ещё используется для публикации категорий магазина, об этом в следующей статье.
Думаю, комментарии излишни, разберем позже.
Процедура ПослатьЗапросНаСайтМедиаНажатие
Процедура ПослатьЗапросНаСайтМедиаНажатие(Элемент)
ТекСтрока=ЭлементыФормы.ТаблицаМедиа.ТекущаяСтрока;
Если НЕ ЗначениеЗаполнено(ОперацииСМедиа) Тогда
Сообщить("Не выбрана конечная точка!");
Возврат;
КонецЕсли;
СтруктураПараметров=Новый Структура;
СтруктураПараметров.Вставить("Token",СоединениеССайтом_JWToken);
СтруктураПараметров.Вставить("Server",СоединениеССайтом_JWTServer);
СтруктураПараметров.Вставить("Маршрут",МаршрутМедиа);
СтруктураПараметров.Вставить("КонечнаяТочка",ОперацииСМедиа);
////СтруктураПараметров.Вставить("",);
Если НЕ ОперацииСМедиа="СПИСОК" Тогда
ТекСтрока=ЭлементыФормы.ТаблицаМедиа.ТекущаяСтрока;
Если ОперацииСМедиа="СОЗДАТЬ" Тогда
СтруктураПараметров=ДобавитьДанныеМедиаВСтруктуру(СтруктураПараметров, ТекСтрока.Ссылка);
Иначе
Если ТекСтрока.id=0 Тогда
Сообщить("id=0, продолжение невозможно.");
Возврат;
КонецЕсли;
СтруктураПараметров.Вставить("id",ТекСтрока["id"]);
Если ОперацииСМедиа="ОБНОВИТЬ" Тогда
СтруктураПараметров=ДобавитьДанныеМедиаВСтруктуру(СтруктураПараметров, ТекСтрока.Ссылка);
КонецЕсли;
Если ОперацииСМедиа="УДАЛИТЬ" Тогда
СтруктураПараметров.Вставить("force","true");
КонецЕсли;
КонецЕсли;
КонецЕсли;
СтруктураОтветаССайта = _рс_публикация_ПодсистемаWordPressМедиа(СтруктураПараметров);
ФормаПросмотраОтветаССайта=ПолучитьОбщуюФорму("ФормаПросмотраОтветаССайта");
ФормаПросмотраОтветаССайта.КодСостояния =СтруктураОтветаССайта["КодСостояния"];
ФормаПросмотраОтветаССайта.ОписаниеОтвета =СтруктураОтветаССайта["ОписаниеОтвета"];
ФормаПросмотраОтветаССайта.РезультатКонвертацииИзJSON =СтруктураОтветаССайта["ЗначениеОтвета"];
ФормаПросмотраОтветаССайта.Открыть();
КартинкаОбъект=ТекСтрока.Ссылка.ПолучитьОбъект();
Если ОперацииСМедиа="УДАЛИТЬ" Тогда
ТекСтрока.id=0;
КартинкаОбъект.id=0;
КартинкаОбъект.link="";
КартинкаОбъект.status="";
КартинкаОбъект.source_url="";
ИначеЕсли ОперацииСМедиа="СПИСОК" Тогда
/////ничего не обрабатываем
Возврат;
Иначе
ПарсерСтруктура=_рс_ПостОбработка_РаспарситьПростуюСтрокуДерева(СтруктураОтветаССайта["ЗначениеОтвета"]);
ТекСтрока.id=ПарсерСтруктура.id;
ТекСтрока.Слаг=ПарсерСтруктура.Слаг;
ТекСтрока.link=ПарсерСтруктура.link;
ТекСтрока.status=ПарсерСтруктура.status;
КартинкаОбъект.id=ПарсерСтруктура.id;
КартинкаОбъект.Слаг=ПарсерСтруктура.Слаг;
КартинкаОбъект.link=ПарсерСтруктура.link;
КартинкаОбъект.status=ПарсерСтруктура.status;
КартинкаОбъект.source_url=ПарсерСтруктура.source_url;
КонецЕсли;
КартинкаОбъект.Записать();
КонецПроцедуры
В этой процедуре подготавливаем структуру, для последующей публикации из модуля объекта.
Для получения списка нам никакие аргументы не нужны.
Для того, чтобы "Получить" или "Удалить" нам обязательно нужен id. Чтобы удалить на сайте без сохранения в "корзину" надо добавить ещё один аргумент: СтруктураПараметров.Вставить("force","true")
Для "обновить" на нужны те же данные, что и для "создать", плюс id.
Функция ДобавитьДанныеМедиаВСтруктуру
Функция ДобавитьДанныеМедиаВСтруктуру(ТемпСтруктураПараметров, Ссылка)
Для каждого ЭлМассива Из МассивОбязательныхРеквизитовМедиа Цикл
ТемпСтруктураПараметров.Вставить(ЭлМассива,Ссылка[ЭлМассива]);
КонецЦикла;
Возврат ТемпСтруктураПараметров;
КонецФункции // ДобавитьДанныеМедиаВСтруктуру()
Добавляем данные в структуру согласно массива обязательных реквизитов медиа.
Отправляем данные в модуль объекта для публикации, в зависимости от запроса обрабатываем ответ (парсим данные), сохраняем полученные от сайта данные.
Процедуры и функции модуля объекта.
Код публикации медиа/картинок немного отличается от остальных. Подробности в спойлере.
Функция _рс_публикация_ПодсистемаWordPressМедиа
Функция _рс_публикация_ПодсистемаWordPressМедиа(_ВхСтруктураПараметров) Экспорт
Если НЕ _ВхСтруктураПараметров["КонечнаяТочка"]="СОЗДАТЬ" Тогда //// Если мы не создаем новый медиа-файл на сайте, то всё идет штатным путем.
_ВхСтруктураПараметров.Вставить("status","publish"); //// Обязательный аргумент
Возврат _рс_публикация_ПодсистемаWordPressПостыСтраницы(_ВхСтруктураПараметров);
КонецЕсли;
/////_ВхСтруктураПараметров структура данных необходимых для действий на сайте, не нужные удаляются
ВозвращаемыйОтвет=_рс_подготовка_СоздатьСтруктуруВозвращаемогоОтвета();
Если ТипЗнч(_ВхСтруктураПараметров)<>Тип("Структура") Тогда ////проверка
ВозвращаемыйОтвет.Вставить("ОписаниеОтвета","Входящие параметры не соответствуют типу данных <Структура>");
Возврат ВозвращаемыйОтвет;
КонецЕсли;
///// в этом блоке получаем и удаляем из структуры данные необходимые для подготовки к публикации
_token_ =_ВхСтруктураПараметров["Token"];
_JWTServer_ =_ВхСтруктураПараметров["Server"];
_Маршрут_ =_Текст_ПеревестиНаАнгл_ПолучитьЗначениеПоКлючу(_ВхСтруктураПараметров["Маршрут"]); //// получаем аглицкое название по русскому ключу
_КонечнаяТочка_ =_Текст_ПеревестиНаАнгл_ПолучитьЗначениеПоКлючу(_ВхСтруктураПараметров["КонечнаяТочка"]); //// получаем аглицкое название по русскому ключу
_ИмяФайла_ =_ВхСтруктураПараметров["ИмяФайла"];
_Расширение_ =_ВхСтруктураПараметров["РасширениеФото"];
_ТемпСлаг_ =_ВхСтруктураПараметров["Слаг"];
_ВхСтруктураПараметров.Удалить("Token");
_ВхСтруктураПараметров.Удалить("Server");
_ВхСтруктураПараметров.Удалить("Маршрут");
_ВхСтруктураПараметров.Удалить("КонечнаяТочка");
_ВхСтруктураПараметров.Удалить("ИмяФайла");
_ВхСтруктураПараметров.Удалить("РасширениеФото");
///// в этом блоке получаем и удаляем из структуры данные необходимые для подготовки к публикации
/////////----------Публикуем 2 раза, т.к. соединить бинарные данные и текстовые в одном теле запроса не представляется возможным
Попытка
ДД_Картинка = Новый ДвоичныеДанные(_ИмяФайла_); ////создаем бинарные данные
Исключение
ВозвращаемыйОтвет.Вставить("ОписаниеОтвета","Не удалось получить двоичные данный картинки/фото. "+_ИмяФайла_+" ._ТемпСлаг_ "+_ТемпСлаг_);
Возврат ВозвращаемыйОтвет;
КонецПопытки;
_ТелоЗапроса_=__ПодсистемаWordPressМедиа_СоздатьТело_Изображения__(ДД_Картинка); //// чудеса магии с преобразованием в тело/боди запроса
_ЗаголовкиHTTP_=Новый Соответствие;
_Расширение=?(ЗначениеЗаполнено(_Расширение_),_Расширение_,"jpg");
_ЗаголовкиHTTP_.Вставить("Content-Disposition","attachment; filename="+_ТемпСлаг_+"."+_Расширение); //// особые заголовки и их параметры _Расширение_ - без "."
_ЗаголовкиHTTP_.Вставить("Content-Type","image/jpeg");
_ЗаголовкиHTTP_.Вставить("Authentication", "Bearer "+_token_);
Запрос =_рс_подготовка_ПолучитьЗапросHTTP(_Маршрут_, _ЗаголовкиHTTP_, _ТелоЗапроса_); //// получаем ЗапросHTTP
Результат =_рс_публикация_ПослатьГотовыйЗапросНаСайт(_КонечнаяТочка_, _JWTServer_, Запрос); //// посылаем запрос на сайт и получаем результат HTTPОтвет
_ТелоЗапроса_=Неопределено; ////очищаем
Запрос=Неопределено; ////очищаем
/////---получаем результат ответа - соответствие
РезультатРасшифровка=_Контроль_РезультатHTTPЗапросаСодержитОшибку(Результат); //// Расшифровываем ответ от сайта
/////// преобразовываем JSON результат ответа в "дерево значений"
РезультатОтветаДерево=_рс_ПостОбработка_ЗаполнитьДеревоJSON(Результат.ПолучитьТелоКакСтроку());
Если Результат.КодСостояния >= 200 И Результат.КодСостояния <= 202 Тогда ////ОК
СтруктураВхДанных=_рс_ПостОбработка_РаспарситьПростуюСтрокуДерева(РезультатОтветаДерево); //// здесь парсим, чтобы получить id картинки
Попытка
ИдКартинки=Число(СтруктураВхДанных["id"]);
Исключение
ИдКартинки=0
КонецПопытки;
Если ИдКартинки=0 Тогда
ВозвращаемыйОтвет.Вставить("ЗначениеОтвета",РезультатОтветаДерево);
ВозвращаемыйОтвет.Вставить("КодСостояния",РезультатРасшифровка["КодСостояния"]);
ВозвращаемыйОтвет.Вставить("ОписаниеОтвета","Не удалось извлечь из ответа сайта id опубликованной картинки/фото. ");
Возврат ВозвращаемыйОтвет;
КонецЕсли;
_ВхСтруктураПараметров.Вставить("id",ИдКартинки); //// добавляем id для последующего обновления
_Маршрут_=_Маршрут_+ИдКартинки; //// добавляем id к маршруту POST /wp/v2/media/<id>
Иначе ////возможно не ошибка, но нам нужно чтобы все было ОК
ВозвращаемыйОтвет.Вставить("ЗначениеОтвета",рс_ПостОбработка_ЗаполнитьДеревоJSON(Результат.ПолучитьТелоКакСтроку()));
ВозвращаемыйОтвет.Вставить("КодСостояния",РезультатРасшифровка["КодСостояния"]);
ВозвращаемыйОтвет.Вставить("ОписаниеОтвета",РезультатРасшифровка["ОписаниеОшибки"]);
Возврат ВозвращаемыйОтвет;
КонецЕсли;
/////////----------Публикуем 2 раза, т.к. соединить бинарные данные и текстовые в одном теле запроса не представляется возможным
/////если дошли сюда значит все ОК, картинка зашла на сайт, но это только медиа без описаний
//// обновляем описания и т.д.
_ВхСтруктураПараметров.Вставить("status","publish"); //// обязательный аргумент
_БодиПубликации_=_рс_подготовка_КонвертироватьВСоответствие(_ВхСтруктураПараметров);
_ЗаголовкиHTTP_ =_рс_ПолучитьТиповыеЗаголовкиХТТП();
_ЗаголовкиHTTP_.Вставить("Authentication", "Bearer "+_token_);
/////типовые действия по публикации/обновлению и т.д.
_ТелоЗапроса_ =_рс_подготовка_ОбъектВJSON(_БодиПубликации_);
Запрос =_рс_подготовка_ПолучитьЗапросHTTP(_Маршрут_, _ЗаголовкиHTTP_, _ТелоЗапроса_);
Результат =_рс_публикация_ПослатьГотовыйЗапросНаСайт(_КонечнаяТочка_, _JWTServer_, Запрос);
/////---получаем результат ответа - соответствие
РезультатРасшифровка=_Контроль_РезультатHTTPЗапросаСодержитОшибку(Результат);
ВозвращаемыйОтвет.Вставить("ЗначениеОтвета",РезультатОтветаДерево); //// дерево с ответом из рс_ПостОбработка_ЗаполнитьДеревоJSON
ВозвращаемыйОтвет.Вставить("КодСостояния",РезультатРасшифровка["КодСостояния"]); //// код состояния 200, 201, 404, и т.д. из Контроль_РезультатHTTPЗапросаСодержитОшибку
ВозвращаемыйОтвет.Вставить("ОписаниеОтвета",РезультатРасшифровка["ОписаниеОшибки"]); //// краткое описание ошибки из Контроль_РезультатHTTPЗапросаСодержитОшибку
Возврат ВозвращаемыйОтвет;
КонецФункции // ПодсистемаWordPressПостыСтраницы()
Большинство функций взято из предыдущей публикации, о них можно прочитать здесь.
Чудеса магии с преобразованием в тело/боди запроса.
Функция __ПодсистемаWordPressМедиа_СоздатьТело_Изображения__
Функция __ПодсистемаWordPressМедиа_СоздатьТело_Изображения__(МедиаФотоКартинка) ////чудеса магии с преобразованием в тело/боди запроса
////МедиаФотоКартинка в ДвоичныеДанные
ПотокДвДанных = Новый ПотокВПамяти();
ДвД_ЗаписьДанных = Новый ЗаписьДанных(ПотокДвДанных);
ДвД_ЗаписьДанных.Записать(МедиаФотоКартинка);
ДвД_ЗаписьДанных.Закрыть();
Возврат ПотокДвДанных.ЗакрытьИПолучитьДвоичныеДанные();
КонецФункции
Экспериментировал с кодом по посылке двоичных данных довольно долго, в результате пришел к этому. Объем (размер в КБ или МБ) в принципе не имеет значения. Чем больше объем, тем больше время передачи на сайт.
В "Функция _рс_подготовка_ПолучитьЗапросHTTP" (описание здесь), с помощью "Запрос.УстановитьТелоИзДвоичныхДанных(ТелоЗапроса)" устанавливаем двоичные данные в боди запроса и посылаем на сайт.
Небольшая видео-демонстрация:
Заключение.
Как видим опубликовать, картинку на сайте не составляет большого труда.
Если вам нужна обработка, скачать можно отсюда.
Желаю приятных экспериментов на ниве обмена из 1С с сайтом WordPress.
Плюсуем, не стесняемся, делимся, комментируем.
Особенно ПЛЮСУЕМ, это есть очень большой мотиватор для меня. Если вы не поставили "+" предыдущей публикации, прошу сюда.
Продолжение следует. В следующей публикации начнем работу с магазином WooCommerce, с категорий товаров.
Обработка тестировалась:
Тестировалось на моем сайте: перейти.
Версия WordPress: 5.4.1
PHP Версия : 7.3.15
Платформа: 1С:Предприятие 8.3 (8.3.13.1644).
Минимально необходимый релиз платформы: 8.3.6.