-
Vadim TsukanovРазработчик
-
Дата публикации09.03.2022
-
Категория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));
необходим для того, чтобы добавить элементу признак товара, по умолчанию — простого.
Вот таким не хитрым способом можно перенести товары с одной системы в другую.