Возник как-то вопрос о том, каким образом можно перенести часть базы из 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 файла:
1 2 3 4 5 6 7 8 9 |
<Record> 12969 <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 воспринял посты нормально. В итоге получилась примерно следующая схема для поста:
1 2 3 4 5 6 7 |
<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 отвечает за то, опубликован пост или ещё находится в черновиках, ну а последний пункт – это соответственно тип данных(пост или страница).
Категории же выглядят следующим образом:
1 2 |
<wp:category><wp:category_parent>Родительская рубрика</wp:category_parent> <wp:cat_name>Имя рубрики</wp:cat_name></wp:category> |
Стоит отметить, что такая запись отличается, от стандартной, которую вы увидите при экспорте в xml. Например:
1 2 3 |
<wp:category><wp:category_nicename>имя для урла</wp:category_nicename> <wp:category_parent> Родительская рубрика </wp:category_parent> <wp:cat_name><![CDATA[Имя]]></wp:cat_name></wp:category> |
И кусок из item:
1 2 3 4 5 6 7 |
<item> <title>Заголовок</title> <link>ссылка</link> <pubDate>дата</pubDate> <dc:creator><![CDATA[автор]]></dc:creator> <category><![CDATA[категория]]></category> <category domain="category" nicename="имя для урла"><![CDATA[категория]]></category> |
По подобному принципу я пытался сделать импорт, но почему то статьи не привязывались к рубрикам. Немного поэксперементировав пришёл к решению, которое описал выше, главное чтоб у вас стоял и был автивирован плагин rustolat, он сделают всю работу по добавлению к рубрикам короткого названия на латинице для урла.
Исходный файл известен, файл, который мы должны изучить, тоже известен, приступим к преобразованию из одного в другой.
Алгоритм работы следующий:
1) собираем все рубрики, для этого нам поможет признак
2) после отсева рубрик собираем наши посты и присваиваем их определённой рубрике, рубрика указана id-шником в
Используем простое и удобное средство для работы с xml файлами SimpleXML, весь код:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 |
<?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 и далее наш получившийся файл. После завершения импорта можно взглянуть на результат своих трудов :).