Данные по цене из 1С — цена товара на сайте

Одним из важных моментов, ради которого производится выгрузка из 1С на сайт, является установка и обновление цен, так как цены достаточно часто меняются и ведение их отдельно на сайте, явно приводит к расхождениям в актуальности, да и попросту это неудобно.
В выгрузке информация по ценам состоит из двух частей: справочная информация о типах (видах) цен, которые присутствуют в выгрузке, а также непосредственно информация о конкретных значениях.
Пример данных о типах цен из выгрузки
Это справочная информация о том, какие типы (виды) цен есть в выгрузке, эта информация используется в дальнейшем в интерфейсе, для построения полей. Информация о наборе типов цен сохраняется в опцию `all_prices_types`.
Вторая часть это конкретные значения, которые передаются в предложении и они относятся либо к товару, либо к вариации, если применяется учет по характеристикам и соответственно будут записаны либо к товару, либо к вариации.
Пример данных по ценам у торгового предложения по товару
Набор цен в предложении может быть меньше или иметь нулевые значения, когда цены не были установлены. Помимо того, что в 2 стандартных поля товара могут быть записаны значения по настроенным типам цен, в мету по ключу `_all_prices` записывается весь набор значений, в виде массива, где ключ это GUID типа цен, а значение, это значение цены.
Пример отображения вкладки с ценами на странице товара
Предположим, в выгрузке есть 3 типа цен — «Тип 1», «Тип 2» и «Тип 3», также есть простой товар и перед нами стоит задача отобразить все цены этого товара на вкладке на его странице.
// (1) добавим нашу вкладку в набор вкладок товара
\add_filter('woocommerce_product_tabs', function ($tabs) {
$tabs['woocommerce1cPriceTab'] = [
'title' => __('Вкладка с ценами', 'child-theme'),
'priority' => 50,
'callback' => 'woocommerce1cPriceTab'
];
return $tabs;
});
// (2) метод, который формирует содержимое нашей вкладки
function woocommerce1cPriceTab() {
// получим набор типов цен
$allPriceTypes = \get_option('all_prices_types', []);
// получим данные по ценам в товаре
$allProductPrices = \get_post_meta(get_the_ID(), '_all_prices', true);
echo '<ul>';
// пробежим по набору типов цен и отобразим каждый в виде названия типа цен
// и значения цены в этом товареforeach ($allPriceTypes as $guid => $priceType) {
echo '<li>'
. '<strong>'
. \esc_html($priceType['name'])
. '</strong>: '
. \wc_price(isset($allProductPrices[$guid]) ? $allProductPrices[$guid] : 0)
. '</li>';
}
echo '</ul>';
}
Таким образом, мы получим результат в виде вкладки на странице товара и данных по ценам этого товара в содержимом вкладки, то есть похожее на скриншот ниже (конечно вид зависит от вашей темы, а также это вообще может не сработать, если в теме не работает стандартный фильтр `woocommerce_product_tabs` для набора вкладок).
Пример записи какой-то из цен в кастомную мету товара/вариации
Достаточно не редко, возникает необходимость записать какую-то из цен в дополнительное поле товара/вариации. Например, эта необходимость может быть обусловлена наличием какого-то плагина для оптовых цен или чего-то подобного. Предположим, плагином записывается базовая цена из типа цен «Тип 1», а в выгрузке есть еще «Тип 2», значение по которому мы хотим записать в кастомную мету.
В этом нам поможет хук (action) `itglx_wc1c_after_set_product_price`, который срабатывает после обработки цен в каждом предложении. В данном случае, нам нужен только первый аргумент. Далее пример использования:
// в аргументе $productOrVariationID содержится ID товара, если простой или ID вариации
\add_action('itglx_wc1c_after_set_product_price', function ($productOrVariationID) {
// получим данные по ценам в товаре/вариации записанные из выгрузки
// данные представлены массивом, где ключ это GUID типа цен, а значение это значение цены
$allPrices = \get_post_meta($productOrVariationID, '_all_prices', true);
$priceType = 'GUID нужного нам типа цен';
\update_post_meta(
$productOrVariationID,
'наш мета ключ',
isset($allPrices[$priceType]) ? $allPrices[$priceType] : ''
);
});