• Во-первых хотел выразить признательность за столь необходимый плагин!
    Для нескольких частных предпринимателей, с которыми я работаю, это лучших из всех доступных вариантов и по цене и по качеству.

    Теперь о небольшой проблеме.

    Тестировал выгрузку из 1С: УНФ 1.5 Все сработало прекрасно. Конфликтов при выгрузке не возникло, 1С сообщило об успешной выгрузке.
    Однако на сайт выгрузился только один вид цен из двух необходимых и указанных для выгрузки.

    Известно, что в woocommerce 2 вида цен: sale price и regular price.
    Скажите, возможно ли как-то сделать так, чтобы при выгрузке двух цен первая попадала в Sale price, а вторая в regular?

    https://www.ads-software.com/plugins/woocommerce-and-1centerprise-data-exchange/

Viewing 15 replies - 1 through 15 (of 77 total)
  • Вам удалось решить эту проблему?

    Thread Starter Mad Koala

    (@mad_koala)

    Увы нет.
    Ошибся, будто несколько цен стандартный функционал wordpress. Для этого на моих сайтах использовался плагин, с которым 1с Data Exchange естественно не умеет работать (

    Это решается с помощью огромного костыля, когда на ту же бд ставится еще один сайт с другим префиксом таблиц в wp-config
    Уже туда делается выгрузка с другими ценами и пишется скрипт, который переносит цены оттуда в поле второй цены первого сайта

    Можно решить более просто. Отредактируйте файл offers.php, находится в каталоге плагина /wp-content/plugins/woocommerce-and-1centerprise-data-exchange/exchange

    у меня стояла задача синхронизации нескольких цен для оптовых клиентов.

    В моем случае, сделал так:

    Добавил сначала эти цены в выдачу. По умолчанию там только первая выводится и сохраняется в regular_price

    Для этого в функции wc1c_offers_end_element_handler добавляете небольшой код:

    elseif (@$names[$depth - 1] == 'Цены' && $name == 'Цена') {
        if (!isset($wc1c_offer['Цена']) && (!isset($wc1c_price['ИдТипаЦены']) || $wc1c_price['ИдТипаЦены'] == $wc1c_price_type['Ид'])) $wc1c_offer['Цена'] = $wc1c_price;
    	elseif (isset($wc1c_price['ИдТипаЦены']) && $wc1c_price['ИдТипаЦены'] != $wc1c_price_type['Ид']) {
    		$wc1c_offer['Цены'][$wc1c_price['ИдТипаЦены']] = $wc1c_price;
    	}
      }

    Заметьте, добавлено только условие elseif

    Далее решаем, что делать с этими новыми данными.

    Поскольку для вывода оптовых цен я выбрал плагин Prices by User Role. То формат записи этих цен я подгонял под формат этого плагина.

    Далее в функции wc1c_replace_offer_post_meta обрабатываем эти данные:

    $prices = array(
    	'2aktsiya' => (isset($offer['Цены']['386cb545-136d-11e6-8985-001e67092268']['ЦенаЗаЕдиницу']) ? wc1c_parse_decimal($offer['Цены']['386cb545-136d-11e6-8985-001e67092268']['ЦенаЗаЕдиницу']) : wc1c_parse_decimal($offer['Цена']['ЦенаЗаЕдиницу'])),
    	'8opt1' => (isset($offer['Цены']['2d9ee883-f680-11e5-8ee8-001e67092268']['ЦенаЗаЕдиницу']) ? wc1c_parse_decimal($offer['Цены']['2d9ee883-f680-11e5-8ee8-001e67092268']['ЦенаЗаЕдиницу']) : wc1c_parse_decimal($offer['Цена']['ЦенаЗаЕдиницу'])),
    	'7opt2' => (isset($offer['Цены']['2d9ee884-f680-11e5-8ee8-001e67092268']['ЦенаЗаЕдиницу']) ? wc1c_parse_decimal($offer['Цены']['2d9ee884-f680-11e5-8ee8-001e67092268']['ЦенаЗаЕдиницу']) : wc1c_parse_decimal($offer['Цена']['ЦенаЗаЕдиницу'])),
    	'6opt3' => (isset($offer['Цены']['2d9ee885-f680-11e5-8ee8-001e67092268']['ЦенаЗаЕдиницу']) ? wc1c_parse_decimal($offer['Цены']['2d9ee885-f680-11e5-8ee8-001e67092268']['ЦенаЗаЕдиницу']) : wc1c_parse_decimal($offer['Цена']['ЦенаЗаЕдиницу'])),
    	'5opt4' => (isset($offer['Цены']['2d9ee886-f680-11e5-8ee8-001e67092268']['ЦенаЗаЕдиницу']) ? wc1c_parse_decimal($offer['Цены']['2d9ee886-f680-11e5-8ee8-001e67092268']['ЦенаЗаЕдиницу']) : wc1c_parse_decimal($offer['Цена']['ЦенаЗаЕдиницу'])),
    	'4opt5' => (isset($offer['Цены']['2d9ee887-f680-11e5-8ee8-001e67092268']['ЦенаЗаЕдиницу']) ? wc1c_parse_decimal($offer['Цены']['2d9ee887-f680-11e5-8ee8-001e67092268']['ЦенаЗаЕдиницу']) : wc1c_parse_decimal($offer['Цена']['ЦенаЗаЕдиницу']))
      );
      $post_meta['festiUserRolePrices'] = '{';
      if ($prices) {
        foreach ($prices as $prices_name => $prices_value) {
    	  $post_meta['festiUserRolePrices'] .= '"'.$prices_name.'":"'.$prices_value.'",';
        }
      $post_meta['festiUserRolePrices'] = substr($post_meta['festiUserRolePrices'], 0, -1);
      $post_meta['festiUserRolePrices'] .= '}';
      $current_post_meta = get_post_meta($post_id);
        foreach ($current_post_meta as $meta_key => $meta_value) {
          $current_post_meta[$meta_key] = $meta_value[0];
        }
    
        foreach ($current_post_meta as $meta_key => $meta_value) {
          if (array_key_exists($meta_key, $post_meta)) continue;
    	  if($meta_key != 'festiUserRolePrices') continue;
          delete_post_meta($post_id, $meta_key);
        }
      }

    Эти данные можно записывать в любом формате. У меня теперь все нормально выводится и синхронизируется

    В вашем случае все проще:

    Вторую часть кода делаете так:

    $post_meta['_sale_price'] = isset($offer['Цены']['386cb545-136d-11e6-8985-001e67092268']['ЦенаЗаЕдиницу']) ? wc1c_parse_decimal($offer['Цены']['386cb545-136d-11e6-8985-001e67092268']['ЦенаЗаЕдиницу']) : '';

    Естественно вместо 386cb545-136d-11e6-8985-001e67092268 нужно написать Ид цены-скидки, можно найти в offers.xml

    Cпасибо, faysh! То, что нужно! Давно хотел сделать выгрузку со скидками.

    faysh, не получается что-то. Подскажите пожалуйста, “Вторую часть кода делаете так:” этот код куда нужно размещать?
    Спасибо!

    vitalmaster, у вас получилось?

    В функцию wc1c_replace_offer_post_meta. Сколько у вас видов цен?

    2 вида. Вот из .xml:
    <ТипЦены>
    <Ид>41adf844-6845-11e6-9e75-ec9afa83b90e</Ид>
    <Наименование>Распродажная цена</Наименование>
    <Валюта>руб</Валюта>
    <Налог>
    <Наименование>НДС</Наименование>
    <УчтеноВСумме>false</УчтеноВСумме>
    </Налог>
    </ТипЦены>
    <ТипЦены>
    <Ид>75a9dd1f-3641-11e3-ada4-000c29b3b732</Ид>
    <Наименование>Основная цена продажи</Наименование>
    <Валюта>руб</Валюта>
    <Налог>
    <Наименование>НДС</Наименование>
    <УчтеноВСумме>false</УчтеноВСумме>
    </Налог>
    </ТипЦены>

    А вот товар:
    <Предложение>
    <Ид>eff38901-684b-11e6-9e75-ec9afa83b90e</Ид>
    <Наименование>Пистолет Техно-Сонус Newborn 126</Наименование>
    <БазоваяЕдиница Код=”796″ НаименованиеПолное=”Штука” МеждународноеСокращение=”PCE”>шт</БазоваяЕдиница>
    – <Цены>
    – <Цена>
    <Представление>100 руб. за шт</Представление>
    <ИдТипаЦены>41adf844-6845-11e6-9e75-ec9afa83b90e</ИдТипаЦены>
    <ЦенаЗаЕдиницу>100.00</ЦенаЗаЕдиницу>
    <Валюта>руб</Валюта>
    <Единица>шт</Единица>
    <Коэффициент>1</Коэффициент>
    </Цена>
    – <Цена>
    <Представление>200 руб. за шт</Представление>
    <ИдТипаЦены>75a9dd1f-3641-11e3-ada4-000c29b3b732</ИдТипаЦены>
    <ЦенаЗаЕдиницу>200.00</ЦенаЗаЕдиницу>
    <Валюта>руб</Валюта>
    <Единица>шт</Единица>
    <Коэффициент>1</Коэффициент>
    </Цена>
    </Цены>
    </Предложение>

    У вас после добавления первой части кода, в выдаче появится объект-массив только с одной ценой — Распродажная цена

    Основная цена будет и так записываться в regular_price

    Добавляя вторую часть, должны получить и вторую цену уже в поле saleprice.

    Скажите, без манипуляций с кодом, у вас хотя бы основная цена загружается? Плагин корректно работает?

    Да, цена загружается, но значение берется из распродажной цены. Спасибо большое, что так быстро отвечаете!

    Первую часть кода я прописал в конце указанной вами функции:

    elseif (@$names[$depth – 1] == ‘Цены’ && $name == ‘Цена’) {
    $wc1c_price = array();
    }

    /* Выгрузка двух типов цен – розничная и распродажная */
    elseif (@$names[$depth – 1] == ‘Цены’ && $name == ‘Цена’) {
    if (!isset($wc1c_offer[‘Цена’]) && (!isset($wc1c_price[‘ИдТипаЦены’]) || $wc1c_price[‘ИдТипаЦены’] == $wc1c_price_type[‘Ид’])) $wc1c_offer[‘Цена’] = $wc1c_price;
    elseif (isset($wc1c_price[‘ИдТипаЦены’]) && $wc1c_price[‘ИдТипаЦены’] != $wc1c_price_type[‘Ид’]) {
    $wc1c_offer[‘Цены’][$wc1c_price[‘ИдТипаЦены’]] = $wc1c_price;
    }
    }

    И вторую часть кода тоже в конце указанной вами функции:

    $stock_status = $quantity > 0 ? ‘instock’ : ‘outofstock’;
    @wc_update_product_stock_status($post_id, $stock_status);
    }

    /* Выгрузка двух типов цен – розничная (75a9dd1f-3641-11e3-ada4-000c29b3b732) и распродажная (41adf844-6845-11e6-9e75-ec9afa83b90e)*/
    $post_meta[‘_sale_price’] = isset($offer[‘Цены’][’41adf844-6845-11e6-9e75-ec9afa83b90e’][‘ЦенаЗаЕдиницу’]) ? wc1c_parse_decimal($offer[‘Цены’][’41adf844-6845-11e6-9e75-ec9afa83b90e’][‘ЦенаЗаЕдиницу’]) : ”;

    do_action(‘wc1c_post_offer_meta’, $post_id, $offer, $is_full);
    }

    В 1с задаю:
    Установки цен номенклатуры.
    Выбираю Тип цен: Основная цена продажи; Распродажная цена.
    Добавляю товары и указываю две цены в них.
    https://dl.dropboxusercontent.com/u/35130086/screen.png

    Буду у компа, сам подробно напишу, что, куда поставитьв вашем случае.

    faysh, спасибо большое!

Viewing 15 replies - 1 through 15 (of 77 total)
  • The topic ‘Выгрузка нескольких видов цен’ is closed to new replies.