Skip to main content

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

6 сентября, 2021 19:16
Просмотров 78
Section background

Одной из важных составляющих товара на сайте, является описание.  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</Наименование>
<Значение>&lt;p&gt;Это попадет в описание, html теги тут кодированы,
но перед записью в данные товара, они будут декодированы&lt;/p&gt;</Значение>
</ЗначениеРеквизита>
...
</ЗначенияРеквизитов>
...
</Товар>

Поведение 4. Описание из отдельного html файла, а краткое из `Товар->Описание`

Еще один вариант, в рамках которого можно заполнить и описание и краткое описание, это передача данных для описание в виде html файла.

Для того, чтобы заполнить описание на сайте, можно добавить html файл к позиции номенклатуры (к сожалению, не все конфигурации включают эти данные в выгрузку), таким образом, в данных выгрузки поступит сам файл, а также реквизит «Файл» со значением, в котором содержится относительный путь.

Чтобы обработка этих данных произошла, необходимо включить настройку 

Если настройка включена и у товара есть реквизит с информацией о файле, ну и конечно же сам файл, который указан, поступил в выгрузке, то содержимое из файла будет записано в описание товара, то есть в post_content, а данные из «Товар->Описание» (если есть) попадут в краткое описание, то есть в post_excerpt.

Пример xml.
 
<Товар>
...
<Описание>Это попадет в краткое описание</Описание>
...
<ЗначенияРеквизитов>
...
<ЗначениеРеквизита>
<Наименование>Файл</Наименование>
<Значение>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, описание по данным из реквизита.

Предположим, для заполнения краткого описания товара используется «Товар->Описание», то есть включена настройка, а для описания в данных товара есть какой-то нестандартный реквизит «РеквизитДляПолногоОписания».

Пример xml.
 
<Товар>
...
<Описание>Это попадет в краткое описание</Описание>
...
<ЗначенияРеквизитов>
...
<ЗначениеРеквизита>
<Наименование>РеквизитДляПолногоОписания</Наименование>
<Значение>&lt;p&gt;Это попадет в описание, html теги тут кодированы,
но перед записью в данные товара, они будут декодированы&lt;/p&gt;</Значение>

</ЗначениеРеквизита>
...
</ЗначенияРеквизитов>
...
</Товар>

Воспользуемся все теми же фильтрами, чтобы направить значение из реквизита в основное описание товара, то есть в 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. Подробнее по данным свойств — открыть

Пример xml в данных товара.
 
<Товар>
...
<Описание>Это попадет в краткое описание</Описание>
...
<ЗначенияСвойств>
...
<ЗначенияСвойства>
<Ид>ffe29f44-a7f1-11ea-a08c-b42e99cfeeed</Ид>
<Значение>&lt;p&gt;Это попадет в описание, html теги тут кодированы,
но перед записью в данные товара, они будут декодированы&lt;/p&gt;</Значение>

</ЗначенияСвойства>
...
</ЗначенияСвойств>
...
</Товар>

Во-первых, проигнорируем основные данные свойства при обработке, чтобы не создавать атрибут — пример есть внизу статьи по ссылке выше.

Во-вторых, воспользуемся все теми же фильтрами, чтобы направить значение из свойства в основное описание товара, то есть в 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;
}

Поделиться: