Возник как-то вопрос о том, каким образом можно перенести часть базы из 1с v7.7 в wordpress. Необходимо было сделать один из справочников из 1С в wordpress в виде каталога.

Итак разберёмся. В wordpress можно экспортировать данные файлом xml, определённым образом построенным. В 1С базы обычно хранятся в файлах dbf. Существует несколько путей решения, можно работать с dbf напрямую (используя инструмент dbase ) или же переконвертировать нашу базу в удобоваримый формат (xml, mysql или даже txt), благо конвертеров из одного формата в другой хватает на просторах интернета. Если пойти первым путём, то сперва стоит покопаться в файле 1cv77.dd, это словарь данных, который описывает таблицы БД, открывается обычным блокнотом. По второму пути – соответственно поискать необходимый конвертер в интернете.

Моя задача осложнялась тем, что база хранилась в формате MS SQL(не путать с MySQL :) ), и доступ к базе был только через интерфейс 1С. Через какое-то время нашёл решение - tool2dbf.zip - обработка выгрузки любого справочника платформы 1С:Предприятие в таблицу формата *.DBF. Позволяет выгрузить любую таблицу в dbf файл. С dbf я возиться не стал и воспользовался конвертировщиком в xml . С получившимся файлом удобно работать используя SimpleXML (ещё один удобный инструмент php, предназначен для работы с xml, как и следует из названия). Для пример кусок получившегося xml файла:

<Record>
  <CODE>12969</CODE>
  <DESCR>Соед.шина 100/3</DESCR>
  <PARENT>12967</PARENT>
  <GROUP/>
  <FULLDESCR>Соед.шина 100/3</FULLDESCR>
  <NDS>8</NDS>
  <NP/>
</Record>

Теперь необходимо выстроить этот файл таким образом, чтобы его воспринял wordpress. Структуру внутри wordpress будем строить такую: наименование – это собственно пост, ну а папка, в которой лежит это наименование – это категория. Структруа же нашего xml файла содержит примерно такие поля: код(CODE), короткое описание(DESCR), код родителя(PARENT), группа (GROUP, пусто, если не группа, и 1, если группа), полное описание(FULLDESCR) и некоторые другие поля, которые нам не важны.
Пример файла, который необходим для импорта, вы можете получить просто экспортнув свои данные через админку. В этом файле содержится много полей для каждого поста, я же пошёл путём минимализма и проверил какой минимум необходим при импорте, чтобы wordpress воспринял посты нормально. В итоге получилась примерно следующая схема для поста:

 <item>
    <title>Заголовок</title>
    <category>Категория</category>
    <content:encoded><![CDATA[Текст]]></content:encoded>
    <wp:status>publish</wp:status>
    <wp:post_type>post</wp:post_type>
</item>

Первые пункты понятны из описания, пункт wp:status отвечает за то, опубликован пост или ещё находится в черновиках, ну а последний пункт – это соответственно тип данных(пост или страница).
Категории же выглядят следующим образом:

<wp:category><wp:category_parent>Родительская рубрика</wp:category_parent>
<wp:cat_name>Имя рубрики</wp:cat_name></wp:category>

Стоит отметить, что такая запись отличается, от стандартной, которую вы увидите при экспорте в xml. Например:

<wp:category><wp:category_nicename>имя для урла</wp:category_nicename>
<wp:category_parent> Родительская рубрика </wp:category_parent>
<wp:cat_name><![CDATA[Имя]]></wp:cat_name></wp:category>

И кусок из item:

<item>
<title>Заголовок</title>
<link>ссылка</link>
<pubDate>дата</pubDate>
<dc:creator><![CDATA[автор]]></dc:creator>
<category><![CDATA[категория]]></category>
<category domain="category" nicename="имя для урла"><![CDATA[категория]]></category>

По подобному принципу я пытался сделать импорт, но почему то статьи не привязывались к рубрикам. Немного поэксперементировав пришёл к решению, которое описал выше, главное чтоб у вас стоял и был автивирован плагин rustolat, он сделают всю работу по добавлению к рубрикам короткого названия на латинице для урла.
Исходный файл известен, файл, который мы должны изучить, тоже известен, приступим к преобразованию из одного в другой.
Алгоритм работы следующий:
1) собираем все рубрики, для этого нам поможет признак в файле, дополнительно не забываем собрать id-шники рубрик, они нам пригодятся на следующем шаге,
2) после отсева рубрик собираем наши посты и присваиваем их определённой рубрике, рубрика указана id-шником в , вот тут нам и пригодятся собранные id-шники с именами рубрик, чтобы заменить уже циферку на название.
Используем простое и удобное средство для работы с xml файлами SimpleXML, весь код:

<?php
// открытие XML-файла
$xml = simplexml_load_file('export.xml');
 
// собираем категории
$i=0;
foreach($xml->Information->Record as $rec)
{
    if($rec->GROUP==1)
    {
        $glav['Name'][$i]=(string)$rec->DESCR;
        $glav['id'][$i]=(string)$rec->CODE;
        $glav['PARENT'][$i]=(string)$rec->PARENT;
        $i++;
    }
}
 
// открываем выходной файл и заносим шапку
$fw=fopen('output.xml', 'w');
fwrite($fw, '<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:excerpt="http://wordpress.org/export/1.0/excerpt/"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:wp="http://wordpress.org/export/1.0/"
>
 
<channel>
');
 
// заносим категории в файл
for($i=0; $i<count($glav['id']); $i++)
{
    if($glav['PARENT'][$i]!='' and in_array($glav['PARENT'][$i], $glav['id']))
    {
        $glav['PARENT'][$i]=$glav['Name'][pos(array_keys($glav['id'], $glav['PARENT'][$i]))];
    }
    fwrite($fw, '<wp:category><wp:category_parent>'.$glav['PARENT'][$i].'</wp:category_parent><wp:cat_name>'.$glav['Name'][$i].'</wp:cat_name></wp:category>
    ');
}
 
// присваиваем постам имена их категорий вместо цифрового значения
$i=0;
foreach($xml->Information->Record as $rec)
{
    if($rec->GROUP=='')
    {
        $det['Name'][$i]=(string)$rec->FULLDESCR;
        $det['PARENT'][$i]=(string)$rec->PARENT;
        $i++;
    }
}
 
// заносим наши посты
for($i=0; $i<count($det['Name']); $i++)
{
    if($det['PARENT'][$i]!='' and in_array($det['PARENT'][$i], $glav['id']))
    {
        $det['PARENT'][$i]=$glav['Name'][pos(array_keys($glav['id'], $det['PARENT'][$i]))];
    }
    fwrite($fw, '
    <item>
    <title>'.$det['Name'][$i].'</title>
    <category>'.$det['PARENT'][$i].'</category>
    <content:encoded><![CDATA['.$det['Name'][$i].']]></content:encoded>
    <wp:status>publish</wp:status>
    <wp:post_type>post</wp:post_type>
</item>');
}
 
fwrite($fw, '</channel>
</rss>');
 
fclose($fw);
?>

Скрипт открывает файл export.xml и работает с ним через инструменты, а с выходным файлом – как с обычным текстовым. Собрав все категории сперва заносит их в файл, а потом поочерёдно ситывает и заносит наши пункты справочника в виде постов. Остаётся только произвести импорт через админку Инструменты -> Импорт, выбираем пункт WordPress и далее наш получившийся файл. После завершения импорта можно взглянуть на результат своих трудов :) .

5 комментария(ев)

  1. Ольга


    Хоть пару людей с пониманием нашлось


  2. Ольга


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


  3. visolXawa


    Я часто захожу сюда хотелось бы почаще видеть обновления .


  4. ZloiKomendant


    Где вы это всё берёте )))


  5. PoloAngelskoe


    Спасибо за ценную информацию. Мне это очень пригодилось.


Оставить комментарий