Перенос записей из Drupal 6 в wordpress

Решив, что drupal6 уже устарел, что не хочу заморачиваться с дизайном и поставить какой нибудь стандартный шаблон и для блога мне вполне хватит функциональности wordpress, я стал осуществлять перенос.
Стал искать модули, чтобы выполнить такой перенос. Но натыкался только на статью, о том, как сделать вручную на чистом SQL.
В конце концов эти публикации я и использовал, для того, чтобы выполнить перенос.
Надо сказать, что drupal был практически без настроек. Я не пользовался нестандартными фильтрами ввода и дополнительными полями.
И если перенос дополнительных полей можно описать через SQL, то с фильтрами ввода все гораздо хуже. Часть кода в этом случае пришлось бы писать на php.

Итак, вот источник с параллельным переводом на русский: http://translated.by/you/convert-import-a-drupal-6-based-website-to-wordpress-v2-7/into-ru/trans/

В статье речь идет о версии 2.7, но код подошел и к версии 3.3. База данных за это время не претерпела особых изменений.

В результате выполнения SQL команд база данных была действительно импортирована. Но ссылки на статьи были написаны по русски а мне надо с транслитерацией. Первоисточник то английский, транслитерацию в SQL скрипте предусмотрена не была.

Довольно быстро нашел и функцию транслитерации, на чистом SQL: http://limiter.ru/mysql-transliteraciya-perevod-russkogo-v-translit.html

Вот собственно скрипт, который получился:

DELIMITER $$

DROP FUNCTION IF EXISTS `_fwp_transliterate_2` $$
CREATE FUNCTION `_fwp_transliterate_2`( str TEXT) RETURNS text CHARSET cp1251
DETERMINISTIC
SQL SECURITY INVOKER
BEGIN
declare str2 varchar(2);
declare str3 text;
declare len int(11);
declare i int(11);
set str3 = '';
set i = 1;
set len = length(str);
/*идем циклом по символам строки*/
while i < = len do /*выполняем преобразование припомощи ф-ии ELT */
set str2 = elt(
instr(
' ,./АаАБбВвГгДдЕеЁёЖжЗзИиЙйКкЛлМмНнОоПпРрСсТтУуфХхцЦЧчШшЩщЪъыЫЬьЭэЮюЯя[\]_{}',
substr(str,i,1)
),
'-',
'',
'',
'',
'A',
'a',
'A',
'B',
'b',
'V',
'v',
'G',
'g',
'D',
'd',
'E',
'e',
'JO',
'jo',
'ZH',
'zh',
'Z',
'z',
'I',
'i',
'J',
'j',
'K',
'k',
'L',
'l',
'M',
'm',
'N',
'n',
'O',
'o',
'P',
'p',
'R',
'r',
'S',
's',
'T',
't',
'U',
'u',
'f',
'H',
'h',
'c',
'C',
'CH',
'ch',
'SH',
'sh',
'SH',
'sh',
'\'',
'',
'y',
'Y',
'',
'',
'E',
'e',
'YU',
'yu',
'YA',
'ya',
'',
'',
'',
'-',
'',
''
);
if str2 is null then /* если преобразование не прошло успешно добавляем в рез-т исходный символ */
set str2 = substr(str,i,1);
end if;
set str3 = concat(str3,str2);
set i = i + 1;
end while;

return lower(str3);

END $$

DELIMITER ;

TRUNCATE TABLE wp_comments;
TRUNCATE TABLE wp_links;
TRUNCATE TABLE wp_postmeta;
TRUNCATE TABLE wp_posts;
TRUNCATE TABLE wp_term_relationships;
TRUNCATE TABLE wp_term_taxonomy;
TRUNCATE TABLE wp_terms;

INSERT INTO wp_terms (term_id, `name`, slug, term_group)
SELECT
 d.tid, d.name, REPLACE(LOWER(d.name), ' ', '-'), 0
FROM drup_term_data d
INNER JOIN drup_term_hierarchy h
 USING(tid)
;

INSERT INTO wp_term_taxonomy (term_id, taxonomy, description, parent)
SELECT
 d.tid `term_id`,
 `category` `taxonomy`,
 d.description `description`,
 h.parent `parent`
FROM drup_term_data d
INNER JOIN drup_term_hierarchy h
 USING(tid)
;

INSERT INTO
    wp_posts (id, post_date, post_content, post_title,
    post_excerpt, post_name, post_modified)
SELECT DISTINCT
    n.nid, FROM_UNIXTIME(created), body, n.title,
    teaser,
    _fwp_transliterate_2(n.title),
    FROM_UNIXTIME(changed)
FROM drup_node n, drup_node_revisions r
WHERE n.vid = r.vid;

INSERT INTO `wp_term_relationships` (`object_id`, `term_taxonomy_id`)
SELECT `nid`, `tid` FROM `drup_term_node`;

UPDATE wp_term_taxonomy tt
SET `count` = (
 SELECT COUNT(tr.object_id)
 FROM wp_term_relationships tr
 WHERE tr.term_taxonomy_id = tt.term_taxonomy_id
);

INSERT INTO wp_comments (comment_post_ID, comment_date, comment_content, comment_parent, comment_author, comment_author_email, comment_author_url, comment_approved)
SELECT nid, FROM_UNIXTIME(timestamp), comment, thread, name, mail, homepage, status FROM drup_comments;

UPDATE `wp_posts` SET `comment_count` = (SELECT COUNT(`comment_post_id`) FROM `wp_comments` WHERE `wp_posts`.`id` = `wp_comments`.`comment_post_id`);

На этом можно и закончить. Или привести несколько примечаний или шагов о использовании скрипта:

Пошаговая инструкция:

1. Установить и настроить wordpress
2. Сделать резервные копии БД drupal-а и wordpress-а
3. Залить БД drupal-а в БД wordpress-а
4. Отредактировать приведенный выше скрипт:
— заменить префикс wp_ на префикс таблиц БД wordpress-а.
— заменить префикс drup_ на префикс таблиц БД drupal-а.
5. Выполнить полученный скрипт.

Примечания:
Все операции по резервному копированию и выполнению скриптов можно выполнять из PhpMyAdmin, однако это не всегда удобно. На больших базах данных могут выдаваться различные ошибки: о превышении допустимого времени выполнения или о слишком большом размере переданного файла. Поэтому как правило для резервного копирования и восстановления из копии, с Mysql я работаю через SSH консоль c использованием утилит mysql и mysqldump.
Выполнить собственно конвертирующий скрипт можно как из консоли, так и через PhpMyAdmin.

Вот например скрипт создающий дампы двух баз данных и копирующий их в третью:

pass='password1'
user='user1'
db='db1'
host='server1'

pass2='password2'
user2='user2'
db2='db2'
host2='server2'

pass3='password3'
user3='user3'
db3='db3'
host3='server3'

sqlfile=$db'_'`date +%Y_%m_%d`'.sql'
sqlfile2=$db2'_'`date +%Y_%m_%d`'.sql'

echo 'dump first db'
mysqldump --host=$host --user=$user -p$pass $db > $sqlfile
echo 'dump second db'
mysqldump --host=$host2 --user=$user2 -p$pass2 $db2 > $sqlfile2
echo 'upload first sql file to db3'
mysql --host=$host3 --user=$user3 -p$pass3 $db3 < $sqlfile
echo 'upload second sql file to db3'
mysql --host=$host3 --user=$user3 -p$pass3 $db3 < $sqlfile2
echo 'end'

После выполнения скрипта две первые базы будут скопированы в третью? а в текущей папке будут созданы sql файлы с дампами.

  • И каков конечный результат? Материалы из друпала появляются в сайте вордпресса?

    • VladimirDolgov

      В целом — да. есть некоторые недоработки. но я их дальше исправлял вручную.
      Лиды записей, например, сами не отделялись.

  • versitel

    здравствуйте! извиняюсь за глупый вопрос, но куда этот скрипт нужно закинуть, чтоб выполнить? и как его запустить ?)