Описание товара и варианты его заполнения по данным выгрузки

Одной из важных составляющих товара на сайте, является описание. WooCoommerce предлагает у товара 2 стандартных поля, которые имеют свое применение.
Описание (post_content
), данные из которого стандартно отображаются на одноименной вкладке на странице товара, а также краткое описание (post_excerpt
), данные из которого стандартно отображаются сверху на странице товара.
В стандартных минимальных данных выгрузки, присутствует узел «Товар->Описание» (конечно же, если описание заполнено у позиции номенклатуры), данные из которого попадают в описание товара на сайте. Стандартно заложенных узлов и данных для краткого описания, к сожалению, нет.
Безусловно, только таким вариантом решение этой задачи не обходится и есть еще ряд вариантов и поведений, которые помогают получить желаемый результат заполнения. Давайте рассмотрим ряд самых частых вариантов, ну и начнем с самого первого. В примерах xml, для удобства оставлены только интересующие узлы.
Поведение 1. Описание товара на сайте из данных узла `Товар->Описание`
Самых простой и стандартный вариант. Описание номенклатуры поступает в узле «Товар->Описание», данные из которого попадают в описание товара на сайте, то есть в post_content
.
Пример xml.
<Товар>
...
<Описание>Содержимое описания товара</Описание>
...
</Товар>
Поведение 2. Краткое описание товара на сайте из данных узла `Товар->Описание`
Вполне возможна ситуация, когда заполнение описания товара не требуется, а данные из «Товар->Описание» вместо этого необходимо записать в краткое описание, то есть в post_excerpt
.
Чтобы изменить стандартное поведение и получить желаемый результат, достаточно включить настройку
Пример xml аналогичен предыдущему.
Поведение 3. Описание из данных реквизита `ОписаниеВФорматеHTML`, а краткое из `Товар->Описание`
Безусловно, вам может потребоваться заполнить сразу и описание и краткое описание товара на сайте по данным из выгрузки. Ряд конфигураций имеют функционал «Файл описания для сайта», который позволяет загрузить html к позиции номенклатуры. Эти данные поступают в xml в виде реквизита с наименованием «ОписаниеВФорматеHTML».
Чтобы наличие реквизита проверялось при обработке и данные из него могли быть использованы, как описание товара, необходимо включить настройку
Если настройка включена и у товара есть реквизит с данными, то информация из него будет записана в описание товара, то есть в post_content
, а данные из «Товар->Описание» (если есть) попадут в краткое описание, то есть в post_excerpt
.
Пример xml.
<Товар>
...
<Описание>Это попадет в краткое описание</Описание>
...
<ЗначенияРеквизитов>
...
<ЗначениеРеквизита>
<Наименование>ОписаниеВФорматеHTML</Наименование>
<Значение><p>Это попадет в описание, html теги тут кодированы,
но перед записью в данные товара, они будут декодированы</p></Значение>
</ЗначениеРеквизита>
...
</ЗначенияРеквизитов>
...
</Товар>
Поведение 4. Описание из отдельного html файла, а краткое из `Товар->Описание`
Еще один вариант, в рамках которого можно заполнить и описание и краткое описание, это передача данных для описание в виде html файла.
Для того, чтобы заполнить описание на сайте, можно добавить html файл к позиции номенклатуры (к сожалению, не все конфигурации включают эти данные в выгрузку), таким образом, в данных выгрузки поступит сам файл, а также реквизит «Файл» со значением, в котором содержится относительный путь.
Чтобы обработка этих данных произошла, необходимо включить настройку
Если настройка включена и у товара есть реквизит с информацией о файле, ну и конечно же сам файл, который указан, поступил в выгрузке, то содержимое из файла будет записано в описание товара, то есть в post_content
, а данные из «Товар->Описание» (если есть) попадут в краткое описание, то есть в post_excerpt
.
<Товар>
...
<Описание>Это попадет в краткое описание</Описание>
...
<ЗначенияРеквизитов>
...
<ЗначениеРеквизита>
<Наименование>Файл</Наименование>
<Значение>import_files/f5/f54a38a3-e251-11ea-9e44-00155d466409_00155d468203.html</Значение>
</ЗначениеРеквизита>
...
</ЗначенияРеквизитов>
...
</Товар>
Поведение 5. Описание по поведению 1, краткое описание по данным описания.
Предположим, настройки по описанию не применены, то есть описание для товара на сайте заполняется из «Товар->Описание». Помимо этого, требуется и в краткое описание заполнить тоже самое.
В этом случае, воспользуемся парой фильтров, чтобы записать в краткое описание значение, которое при обработке уже попало, как содержимое для описания товара.
Пример:
// набор параметров при обновлении поста товара
\add_filter('itglx_wc1c_update_post_product_params','postProductParams');
// набор параметров при создании поста товара
\add_filter('itglx_wc1c_insert_post_new_product_params', 'postProductParams');
function postProductParams($params)
{
// заполним краткое описание по данным описания
if (!empty($params['post_content'])) {
$params['post_excerpt'] = $params['post_content'];
}
return $params;
}
Поведение 6. Краткое описание по поведению 2, описание по данным из реквизита.
Предположим, для заполнения краткого описания товара используется «Товар->Описание», то есть включена настройка, а для описания в данных товара есть какой-то нестандартный реквизит «РеквизитДляПолногоОписания».
<Товар>
...
<Описание>Это попадет в краткое описание</Описание>
...
<ЗначенияРеквизитов>
...
<ЗначениеРеквизита>
<Наименование>РеквизитДляПолногоОписания</Наименование>
<Значение><p>Это попадет в описание, html теги тут кодированы,
но перед записью в данные товара, они будут декодированы</p></Значение></ЗначениеРеквизита>
...
</ЗначенияРеквизитов>
...
</Товар>
Воспользуемся все теми же фильтрами, чтобы направить значение из реквизита в основное описание товара, то есть в post_content
Пример:
// набор параметров при обновлении поста товара
\add_filter('itglx_wc1c_update_post_product_params','postProductParams', 10, 2);
// набор параметров при создании поста товара
\add_filter('itglx_wc1c_insert_post_new_product_params', 'postProductParams', 10, 2);
function postProductParams($params, $element)
{
foreach ($element->ЗначенияРеквизитов->ЗначениеРеквизита as $requisite) {
$requisiteName = trim((string) $requisite->Наименование);
// если это нужный реквизит, то используем его значение для описания
if ($requisiteName === 'РеквизитДляПолногоОписания') {
$params['post_content'] = html_entity_decode(trim((string) $requisite->Значение));
break;
}
}
return $params;
}
Поведение 7. Краткое описание по поведению 2, описание по данным из свойства.
Предположим, для заполнения краткого описания товара используется «Товар->Описание», то есть включена настройка, а для описания в данных товара есть какое-то строковое (то есть не Справочник) свойство «Описание для сайта», которое имеет GUID — ffe29f44-a7f1-11ea-a08c-b42e99cfeeed. Подробнее по данным свойств — открыть
<Товар>
...
<Описание>Это попадет в краткое описание</Описание>
...
<ЗначенияСвойств>
...
<ЗначенияСвойства>
<Ид>ffe29f44-a7f1-11ea-a08c-b42e99cfeeed</Ид>
<Значение><p>Это попадет в описание, html теги тут кодированы,
но перед записью в данные товара, они будут декодированы</p></Значение></ЗначенияСвойства>
...
</ЗначенияСвойств>
...
</Товар>
Во-первых, проигнорируем основные данные свойства при обработке, чтобы не создавать атрибут — пример есть внизу статьи по ссылке выше.
Во-вторых, воспользуемся все теми же фильтрами, чтобы направить значение из свойства в основное описание товара, то есть в post_content
Пример:
// набор параметров при обновлении поста товара
\add_filter('itglx_wc1c_update_post_product_params','postProductParams', 10, 2);
// набор параметров при создании поста товара
\add_filter('itglx_wc1c_insert_post_new_product_params', 'postProductParams', 10, 2);
function postProductParams($params, $element)
{
foreach ($element->ЗначенияСвойств->ЗначенияСвойства as $option) {
$guid = trim((string) $option->Ид);
// если это нужное свойство, то используем его значение для описания
if ($guid === 'ffe29f44-a7f1-11ea-a08c-b42e99cfeeed') {
$params['post_content'] = html_entity_decode(trim((string) $option->Значение));
break;
}
}
return $params;
}
Поведение 8. Описания по значению из кастомных узлов
Предположим, ваша конфигурация в 1С доработана и описания, которые должны попасть в товар на сайте, содержатся в каких-то кастомных узлах, например, «Товар->ОсновноеОписание» и «Товар->КраткоеОписание«.
Пример xml в данных товара.
<Товар> ... <ОсновноеОписание>Это попадет в описание</ОсновноеОписание> <КраткоеОписание>Это попадет в краткое описание</КраткоеОписание> ... </Товар>
Воспользуемся все теми же фильтрами и заполним описания по значению из этих узлов.
Пример:
// набор параметров при обновлении поста товара
\add_filter('itglx_wc1c_update_post_product_params','postProductParams', 10, 2);
// набор параметров при создании поста товара
\add_filter('itglx_wc1c_insert_post_new_product_params', 'postProductParams', 10, 2);
function postProductParams($params, $element)
{
$params['
post_content'] = html_entity_decode(trim((string) $element->
ОсновноеОписание));$params['
post_excerpt'] = html_entity_decode(trim((string) $element->
КраткоеОписание));return $params;
}