Импорт товаров из WooCommerce в 1С-Битрикс

  • Vadim Tsukanov
    Разработчик
  • Дата публикации
    09.03.2022
  • Категория
    1С-Битрикс
перенос товаров битрикс
Задача:Перенести каталог товаров с WooCommerce на 1С Битрикс

Рано или поздно, но все, кто открывал магазин на територии СНГ понимает, что лучше, чем битрикс, для онлайн коммерции ничего нет, и начинается целая куча проблем по переносу товаров и прочего…

Возможно, вы знаете более удобные варианты, однако мы решили все следующим образом:

  1. Подготавливаем выгрузку на стороне wordpress
add_action( 'wp_ajax_bitrixLoad', 'bitrixLoad' );
add_action( 'wp_ajax_nopriv_bitrixLoad', 'bitrixLoad' );

function bitrixLoad()
{
    $result = array();
    $args['post_type'] = 'product';
    $args['post_status'] = 'publish';
    $args['posts_per_page'] = 200;

    $key = 0;
    $query = new WP_Query( $args );
    if ( $query->have_posts() ) {
    	while ( $query->have_posts() ) {
    		$query->the_post();
            $key++;
            $product = wc_get_product(get_the_ID());
            $categories = get_the_terms(get_the_ID(),'product_cat');
            $productCategoriesIds = array();
            foreach ($categories as $category) {
                $productCategoriesIds[] = $category->term_id;
            }

            $bitrixSections = changeWpCategoryIdToBitrixSectionId($productCategoriesIds);
            //прописать все категории
            $brand = get_the_terms(get_the_ID(),'pwb-brand');
            $tag = get_the_terms(get_the_ID(),'product_tag');

            $image = get_the_post_thumbnail_url(get_the_ID(),'full');
            $attachmentIds = $product->get_gallery_image_ids();
            $morePhoto = array();
             foreach( $attachmentIds as $attachmentId ) {
                 $morePhoto[] = wp_get_attachment_url($attachmentId);
             }

            $result[$key]['NAME'] = $product->get_title();
            $result[$key]['PREVIEW_IMAGE'] = $image;
            $result[$key]['MORE_PHOTO'] = $morePhoto;
            $result[$key]['BRAND'] = changeWpBrandIdToBitrixBrandId($brand[0]->term_id);
            $result[$key]['CATEGORY'] = $bitrixSections;
            $result[$key]['TAG'] = changeWpTypeIdToBitrixTypeId($tag[0]->term_id);
            $result[$key]['PRICE'] = $product->get_price();
            $result[$key]['PREVIEW_TEXT'] = get_the_content();
            $result[$key]['HOW_TO_USE_TEXT'] = get_field('primenenie');
            $result[$key]['SOSTAV_TEXT'] = get_field('sostav');
            $result[$key]['TIME_TO_USE_TEXT'] = get_field('srok_godnosti');
            $result[$key]['VOLUME'] = get_field('obem');
            $result[$key]['SKU'] = $product->get_sku();
    	}

    }
    wp_reset_postdata();

    echo json_encode($result);
    wp_die();
}

Методы типа changeWpBrandIdToBitrixBrandId($brand[0]->term_id) имеют следующий код:

function changeWpBrandIdToBitrixBrandId($productBrandId)
{
    //key - in wp, value - bitrix
    $compareArray = array(
        '36' => 318,
        '86' => 319,
        '81' => 320,
        '66' => 321,
        '82' => 322,
        '31' => 323,
        '84' => 324,
        '98' => 325,
        '16' => 326,
        '44' => 327,
        '46' => 328,
        '42' => 329,
        '50' => 334,
        '101' => 330,
        '100' => 331,
        '85' => 332,
        '27' => 333,
        '87' => 335,
        '95' => 336,
        '91' => 337,
        '88' => 338,
        '53' => 339,
        '96' => 340,
        '54' => 341,
        '28' => 342,
        '69' => 343,
        '73' => 344,
        '74' => 345,
        '89' => 346,
        '90' => 347,
        '56' => 348,
    );
    $bitrixBrandId = $compareArray[$productBrandId];
    return $bitrixBrandId;
}

По сути, это массив соответствий категорий, в битриксе категории уже завели руками. Делать все на автомате мы не решились, т.к. некоторые вопросы было быстрее решить таким массивом, чем пилить полную автоматику

По сути — все стало готово, теперь пилим принимающую сторону:

1.Создаем папку, в ней файл index.php со след содержимым

<?php
require_once($_SERVER['DOCUMENT_ROOT']."/bitrix/modules/main/include/prolog_before.php");

$arResult = file_get_contents('https://site.name/wp-admin/admin-ajax.php?action=bitrixLoad');
$arResult = json_decode($arResult,true);

CModule::IncludeModule("catalog");
CModule::IncludeModule("iblock");

foreach ($arResult as $key => $item) {
    $photos = array();
    if(!empty($item["MORE_PHOTO"])){
        foreach ($item["MORE_PHOTO"] as $key2 => $image) {
            $arFile = CFILE::MakeFileArray($image);
            $photos[]=CFile::SaveFile($arFile, "products");
        }
    }

    $el = new CIBlockElement;

    $PROP = array();
    $PROP[26] = $photos;
    $PROP[27] = $item['BRAND'];
    $PROP[25] = $item['TAG'];
    $PROP[28] = $item["HOW_TO_USE_TEXT"];
    $PROP[29] = $item["SOSTAV_TEXT"];
    $PROP[30] = $item["TIME_TO_USE_TEXT"];
    $PROP[31] = $item["VOLUME"];

    $arParams = array("replace_space"=>"-","replace_other"=>"-");
    $itemCode = $item['NAME'].$item["VOLUME"];
    $arLoadProductArray = Array(
        "MODIFIED_BY"    => $USER->GetID(),
        "IBLOCK_SECTION" => $item['CATEGORY'],
        "IBLOCK_ID"      => 4,
        "PROPERTY_VALUES"=> $PROP,
        "NAME"           => $item['NAME'],
        "CODE"           => Cutil::translit($itemCode,"ru",$arParams),
        "ACTIVE"         => "Y",
        "PREVIEW_TEXT"   => $item["PREVIEW_TEXT"],
        "PREVIEW_PICTURE"  => CFILE::MakeFileArray($item["PREVIEW_IMAGE"]),
    );


    if($productId = $el->Add($arLoadProductArray)){

        CCatalogProduct::Add(array('ID'=>$productId));
        CPrice::SetBasePrice($productId,$item['PRICE'],'RUB');
        $arFields['PRODUCT_ID'] = $productId;
        $arFields['BARCODE'] = $item['SKU'];
        CCatalogStoreBarCode::add($arFields);
    }else{
        echo '<pre>';
        var_dump($el->LAST_ERROR);
        echo '</pre>';
        echo $item['NAME'];
    }
}

Метод CCatalogStoreBarCode::add($arFields); не документирован, этот метод для добавления штрихкодов товарам, узнать о нем можно только от поддержки, либо изучим код внутренних методов.

Метод CCatalogProduct::Add(array('ID'=>$productId)); необходим для того, чтобы добавить элементу признак товара, по умолчанию — простого.

Вот таким не хитрым способом можно перенести товары с одной системы в другую.

Еще нет коммментариев. Будь первым!

Оформить заказ в Devstages