Перенос записей из Wordpress в Битрикс

29.08.2016  09:30

Задача:
Перенести из Wordpress все записи в Битрикс.

Решение:
Накатываем в Вордпрессе плагин Export Featured Images, делаем экспорт записей в XML файл. А теперь, самое интересное — распарсить XML и засунуть записи в инфоблок в Битриксе.
Поехали:

$DOCUMENT_ROOT = $_SERVER["DOCUMENT_ROOT"];
define("NO_KEEP_STATISTIC", true);
define("NOT_CHECK_PERMISSIONS", true);
require($DOCUMENT_ROOT."/bitrix/modules/main/include/prolog_before.php");
set_time_limit(0);
ini_set('max_execution_time', '36000');
// ini_set('memory_limit', '512M');
$IBLOCK_ID = 14;
$update = true;
//////////////
CModule::IncludeModule("iblock");
CModule::IncludeModule("catalog");
CModule::IncludeModule("sale");
$obE = new CIBlockElement();
$file = $_SERVER["DOCUMENT_ROOT"].'/scripts/wordpress.2016-06-06.xml';
$xml = simplexml_load_file($file);
function castr_str ($text,$length) {
	$temp_text = explode(" ",$text);
	$temp1_string = '';
	for ($h=0; $h 5) $text = $temp1_string.'...';
	else $text = $temp1_string;
	return($text);
}
function xmlObjToArr($obj) {
        $namespace = $obj->getDocNamespaces(true);
        $namespace[NULL] = NULL;
        $children = array();
        $attributes = array();
        $name = strtolower((string)$obj->getName());
        $text = trim((string)$obj);
        if( strlen($text) <= 0 ) {
            $text = NULL;
        }
        // get info for all namespaces
        if(is_object($obj)) {
            foreach( $namespace as $ns=>$nsUrl ) {
                // atributes
                $objAttributes = $obj->attributes($ns, true);
                foreach( $objAttributes as $attributeName => $attributeValue ) {
                    $attribName = strtolower(trim((string)$attributeName));
                    $attribVal = trim((string)$attributeValue);
                    if (!empty($ns)) {
                        $attribName = $ns . ':' . $attribName;
                    }
                    $attributes[$attribName] = $attribVal;
                }
                // children
                $objChildren = $obj->children($ns, true);
                foreach( $objChildren as $childName=>$child ) {
                    $childName = strtolower((string)$childName);
                    if( !empty($ns) ) {
                        $childName = $ns.':'.$childName;
                    }
                    $children[$childName][] = xmlObjToArr($child);
                }
            }
        }
        return array(
            'name'=>$name,
            'text'=>$text,
            'attributes'=>$attributes,
            'children'=>$children
        );
}
$array = xmlObjToArr($xml);
$count = 0;
$count_err = 0;
$tags = array();
foreach ($array['children'] as $item) {
	foreach ($item[0]['children']['item'] as $post) {
		$text = $post['children']['content:encoded'][0]['text'];
		if (!empty($text)) {
			$atext = strip_tags($text);
			$atext = castr_str($atext,210);
		}
		$date = $post['children']['wp:post_date'][0]['text'];
		list($day,$time) = explode(' ',$date);
		list($year,$month,$dayc) = explode('-',$day);
		$date = $dayc.'.'.$month.'.'.$year.' '.$time;
		$code = $post['children']['wp:post_name'][0]['text'];
		$name = $post['children']['title'][0]['text'];
		$status = $post['children']['wp:status'][0]['text'];
		if ($status == 'trash') $active = "N";
		else $active = "Y";
		if (empty($name)) {//если название пустое Битрикс не даст сохранить элемент
			$name = 'Без названия';
			$active = 'N';
		}
		if (empty($code)) {//сгенерируем символьный код, если он пустой
			$arParams = array("replace_space"=>"-","replace_other"=>"-");
			$code = Cutil::translit($name,"ru",$arParams);
		}
		$link = $post['children']['link'][0]['text'];//old url
		$keywords = $post['children']['wp:postmeta'][2]['children']['wp:meta_value'][0]['text'];
		unset($tags,$title,$description,$keywords);
		foreach ($post['children']['wp:postmeta'] as $k => $meta) {//титлы, дискрипшены, кейвордзы
			if ($meta['children']['wp:meta_key'][0]['text'] == '_aioseop_title') $title = $post['children']['wp:postmeta'][$k]['children']['wp:meta_value'][0]['text'];
			if ($meta['children']['wp:meta_key'][0]['text'] == '_aioseop_description') $description = $post['children']['wp:postmeta'][$k]['children']['wp:meta_value'][0]['text'];
			if ($meta['children']['wp:meta_key'][0]['text'] == '_aioseop_keywords') $keywords = $post['children']['wp:postmeta'][$k]['children']['wp:meta_value'][0]['text'];
		}
		$SECTION_ID = 13;//другое
		foreach ($post['children']['category'] as $k2 => $tag) {//распихивание записей по рубрикам, совпадающим с тегами
			if ($tag['attributes']['domain'] == 'post_tag') $tags[] = $tag['text'];
			$tag['text'] = strip_tags($tag['text']);
			if ($tag['text'] == 'разработка сайтов' || $tag['text'] == 'аудит') $SECTION_ID = 12;
			if ($tag['text'] == 'SEO') $SECTION_ID = 14;
			if ($tag['text'] == 'контекстная реклама') $SECTION_ID = 15;
			if ($tag['text'] == 'продвижение в соцсетях' || $tag['text'] == 'SMM' || $tag['text'] == 'продвижение в facebook' || $tag['text'] == 'продвижение в одноклассниках') $SECTION_ID = 16;
			if ($tag['text'] == 'аналитика' || $tag['text'] == 'аудит') $SECTION_ID = 17;
			if ($tag['text'] == 'конверсия') $SECTION_ID = 18;
		}
		if (!empty($tags)) $tags_txt = implode(",", $tags);
		else $tags_txt = '';
			$arSelect = array(
				"ID",
				"NAME",
				"IBLOCK_ID",
				"IBLOCK_SECTION_ID",//added
				"*",//added
				"DETAIL_TEXT",
				"ACTIVE",
				"ACTIVE_DATE",
				"SORT",
				"DETAIL_PICTURE"
			);
			$arFilter = array(
				"IBLOCK_ID" => $IBLOCK_ID,
				"IBLOCK_ACTIVE" => "Y",
				"CODE" => $code,
				//"ACTIVE_DATE" => "Y",
				//"ACTIVE" => "Y",
			);
			$r = CIBlockElement::GetList(
				array(), 
				$arFilter, 
				false, 
				false, 
				$arSelect
			);
			$arFields = Array(
				"ACTIVE" => $active,
				"IBLOCK_ID" => $IBLOCK_ID,
				"NAME" => $name,
				"CODE" => $code,
				"PREVIEW_TEXT" => $atext,
				"PREVIEW_TEXT_TYPE" => 'html',
				"DETAIL_TEXT" => $text,
				"DETAIL_TEXT_TYPE" => 'html',
				"TAGS" => $tags_txt,
				"DATE_CREATE" => $date,
				"IPROPERTY_TEMPLATES"=>Array(
					"ELEMENT_META_TITLE" => $title,
					"ELEMENT_META_DESCRIPTION" => $description,
					"ELEMENT_META_KEYWORDS" => $keywords,
				)
			);
			if ( $arCurrentItem = $r->GetNext() ) {//update
				$arFields_update = $arFields;
				$arFields_update["SECTION_ID"] = $SECTION_ID;
				$arFields_update["IBLOCK_SECTION_ID"] = $SECTION_ID;
				$obE->Update($arCurrentItem["ID"], $arFields_update);
				echo ''.$name.' update
'; } else {//insert $arFields_insert = $arFields; $arFields_insert["CODE"] = $code; $arFields_insert["SECTION_ID"] = $SECTION_ID; if ( $ID = $obE->Add($arFields_insert) ) { //CIBlockElement::SetPropertyValuesEx($ID, $IBLOCK_ID, $arProps_add); echo ''.$name.' add
'; $count++; } else { echo $name.' ошибка добавления
'; $count_err++; } } } } echo 'Успешно: '.$count.'
'; echo 'Ошибок: '.$count_err;

Вот таким вот кандебобером. А перенос картинок опишу следующим постом.
Андрей Панёвин
Здравствуйте! Я — Андрей Панёвин и занимаюсь профессиональной разработкой сайтов на платформе 1С-Битрикс (исключительно программирование). Есть вопросы по статье? Могу подсказать и помочь по скайпу (andrey.panevin.ru), WhatsApp (+7-911-091-0670) или перепиской в ВК.
1000 р./час.



перейти в Блог | Блог (стр. 8)

Ударим лайками по бездорожью, разгильдяйству и бюрократизму!


Ключевые слова (тэги): 1С-Битрикс 48  PHP 60  web-программирование 84  Wordpress 1  XML 2  

Вам есть что сказать — ну я же чую.
Высказаться о наболевшем, я выслушаю:
Имя


email (не публикуется)