14

Перенос данных с DLE на WordPress

Опубликовано : 03-02-2011 пользователем : alex-saratov | категория : CMS, Новости

Метки: ,

CMS WordPress стала буквально стандартом для большинства блоггеров. Обладая простым и понятным интерфейсом, позволяет за короткое время построить приличный информативный сайт. Пользователю даже не обязательно обладать навыками оформления сайтов: в сети можно найти огромное количество шаблонов (тем) для WordPress.
После длительной работы с WordPress, новостной движок DLE и его система недружелюбного обновления меня полностью разочаровала. Итак мигрируем на WordPress.
Почитав, какие средства есть для переноса данных понял что их практически нет. Есть платный скрипт, но без гарантий. Без гарантий лучше сделать самому.
Без проблем получилось сразу перенести: категории, пользователей, посты и комментарии. И все это только посредством MySQL. После чего пересчитать количество комментариев скриптом на PHP.

DELETE FROM `wp_users` WHERE `wp_users`.`ID` != 1;
INSERT INTO wp_users	(ID, user_login, user_nicename, user_email, user_registered, display_name) SELECT user_id, name, name, email, FROM_UNIXTIME( reg_date ), name FROM dle_users WHERE 	user_id != 1;

TRUNCATE  `wp_terms`;
INSERT INTO `wp_terms` (`term_id`, `name`, `slug`) SELECT `id`, `name`, `alt_name` FROM `dle_category`;

TRUNCATE  `wp_term_taxonomy`;
INSERT INTO `wp_term_taxonomy` (`term_taxonomy_id`, `term_id`, `description`, `parent`) SELECT	`id`, `id`, `descr`, `parentid` FROM `dle_category`;
UPDATE  `wp_term_taxonomy` SET `taxonomy`='category';

TRUNCATE  `wp_term_relationships`;
INSERT INTO wp_term_relationships (object_id, term_taxonomy_id) SELECT id, category FROM dle_post;

TRUNCATE  wp_posts;
INSERT INTO wp_posts (id, post_author, post_date, post_content, post_title, post_name) SELECT d_p.id, d_u.user_id, d_p.date, CONCAT(d_p.short_story, '<!--more-->' ,d_p.full_story), d_p.title, d_p.alt_name FROM dle_post as d_p, dle_users as d_u WHERE d_p.autor = d_u.name;

TRUNCATE  `wp_comments`;
INSERT INTO wp_comments	(comment_ID,comment_post_ID, comment_author, comment_author_email, comment_date, comment_content) SELECT id, post_id, autor, email, date, text FROM dle_comments;

Прокомментирую сделанное.

Таблицы я очищаю специально, что не сбить идентификаторы записей.

Переношу всех пользователей кроме админа, для чего так понятно. Пароли не смог перенести из-за особенностей кодирования. Думаю это не вопрос, т.к. можно воспользоваться восстановлением пароля.

Для себя я объединял поля полной и короткой новости в одно как в WordPress, но может кому не нужно потому CONCAT(d_p.short_story, ‘<!—more—>’ ,d_p.full_story) можно заменить на  d_p.full_story.

Остальное комментировать не нужно. Скрипт пересчета комментариев вставлять не вижу смысла, гуглом нашел с первого запроса, но если попросите выложу в блог.

ВАЖНО! Копипасторы — не поленитесь при копировании статьи укажите ссылку откуда взяли.

Комментариев (14)

Спасибо большое. Просто но эффективно.
Однако после переноса роли пользователей пришлось вручную устанавливать, конечное хотелось бы супер продуманный скрипт, чтобы руками ничего не делать, но перенести одним лишь запросом тоже приятно.

Здравствуйте.
Спасибо за Ваш труд :)
Мне очень необходим Ваш совет.
Я пытаюсь сделать все наоборот (WordPress -> DLE). Зачем? Да я и сам не понимаю :) Попросил друг и я никак не смог его отговорить. В принципе все получается, но возникли проблемы с присваиванием категорий новостям, похоже я просто запутался :)
Сам я в sql ну прям очень новичок :)
Надеюсь на вашу помощь :) Заранее благодарю.

TO: Redirect

Переходя с DLE на WordPress я нашел множество скриптов для перехода в интересующем Вас направлении, а вот наоборот не было практически ничего.
А с категориями там помоему нет ничего сложного. Отдельная таблица категорий, где видна иерархия а в таблице постов указывается одна категория по сравнению с WordPress где один пост может быть в разных разделах.

Странно, но мне посчастливилось найти только платные скрипты :) А платить за то, что могу сделать сам мне как то не хочется, да и опыт не помешает :)
В категориях вроде разобрался, понадобился лишь свежий выспавшийся взгляд :)
Спасибо за ответ :)

Ура! Эта штука работает! :)

Автору — огромное спасибо.

Что я допилил в процессе под свои нужды:

1) Разделил превью новости и саму новость не только —more—, но и —noteaser— , т.к. в превью у меня уже прописана часть полной новости.
2) Включил только опубликованные посты из ДЛЕ — много спама от публикователей Вареза.

TRUNCATE wp_posts;
INSERT INTO wp_posts (id, post_author, post_date, post_content, post_title, post_name) SELECT d_p.id, d_u.user_id, d_p.date, CONCAT(d_p.short_story, ‘‘ ,d_p.full_story), d_p.title, d_p.alt_name FROM dle_post as d_p, dle_users as d_u WHERE d_p.autor = d_u.name and d_p.approve = 1;

Спасибо за полезное дополнение.
Однако вопрос полной и не полной новости весьма не однозначен, ведь у всех они построены по разному. и объединить их одним лишь запросом сложно.
Зачастую проще записать только полную новость.

Перенос паролей можно реализовать следующим образом:
Идем в wp-includes\pluggable.php
Находим функцию wp_check_password и заменяем ее на
if ( !function_exists(‘wp_check_password’) ) :
/**
* Checks the plaintext password against the encrypted Password.
*
* Maintains compatibility between old version and the new cookie authentication
* protocol using PHPass library. The $hash parameter is the encrypted password
* and the function compares the plain text password when encrypted similarly
* against the already encrypted password to see if they match.
*
* For integration with other applications, this function can be overwritten to
* instead use the other package password checking algorithm.
*
* @since 2.5
* @global object $wp_hasher PHPass object used for checking the password
* against the $hash + $password
* @uses PasswordHash::CheckPassword
*
* @param string $password Plaintext user’s password
* @param string $hash Hash of the user’s password to check against.
* @return bool False, if the $password does not match the hashed password
*/
function wp_check_password($password, $hash, $user_id = ») {
global $wp_hasher;

// If the hash is still md5…
if ( strlen($hash) CheckPassword($password, $hash);

return apply_filters(‘check_password’, $check, $password, $hash, $user_id);
}
endif;
После этого WP будет понимать пароли дле, но после первого входа перехешировать под себя.

у меня в базе дыннх дле 51К новостей (это только опубликованных), юзаю запрос приведенный выше и в WP оказывается только 3085 новостей
что не так?

Может статистику запроса посмотреть?

я не очень понял вопрос

наверное вы это имели ввиду
DELETE FROM `wp_users` WHERE `wp_users`.`ID` !=1;# Затронутые ряды: 6239
INSERT INTO wp_users( ID, user_login, user_nicename, user_email, user_registered, display_name )
SELECT user_id, name, name, email, FROM_UNIXTIME( reg_date ) , name
FROM dle_users
WHERE user_id !=1;# Затронутые ряды: 6239
TRUNCATE `wp_terms` ;# MySQL вернула пустой результат (т.е. ноль рядов).
INSERT INTO `wp_terms` ( `term_id` , `name` , `slug` )
SELECT `id` , `name` , `alt_name`
FROM `dle_category` ;# Затронутые ряды: 122
TRUNCATE `wp_term_taxonomy` ;# MySQL вернула пустой результат (т.е. ноль рядов).
INSERT INTO `wp_term_taxonomy` ( `term_taxonomy_id` , `term_id` , `description` , `parent` )
SELECT `id` , `id` , `descr` , `parentid`
FROM `dle_category` ;# Затронутые ряды: 122
UPDATE `wp_term_taxonomy` SET `taxonomy` = ‘category’;# Затронутые ряды: 122
TRUNCATE `wp_term_relationships` ;# MySQL вернула пустой результат (т.е. ноль рядов).
INSERT INTO wp_term_relationships( object_id, term_taxonomy_id )
SELECT id, category
FROM dle_post;# Затронутые ряды: 51492
TRUNCATE wp_posts;# MySQL вернула пустой результат (т.е. ноль рядов).
INSERT INTO wp_posts( id, post_author, post_date, post_content, post_title, post_name )
SELECT d_p.id, d_u.user_id, d_p.date, CONCAT( d_p.short_story, ‘‘, d_p.full_story ) , d_p.title, d_p.alt_name
FROM dle_post AS d_p, dle_users AS d_u
WHERE d_p.autor = d_u.name;# Затронутые ряды: 3085
TRUNCATE `wp_comments` ;# MySQL вернула пустой результат (т.е. ноль рядов).
INSERT INTO wp_comments( comment_ID, comment_post_ID, comment_author, comment_author_email, comment_date, comment_content )
SELECT id, post_id, autor, email, date, text
FROM dle_comments;# Затронутые ряды: 3267

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

ну не может он натыкаться в 6 базах на пороге в 10% от общего числа новостей постоянно
я юзал 6 разных баз и везде добавляется только 10 процентов

Ну к сожалению нет ничего универсального. Данный запрос писал под себя и применял не один раз на разных базах, но с меньшим количеством постов. Кроме того вот что написано в руководстве

Если в команде INSERT со строками, имеющими много значений, указывается ключевое слово IGNORE, то все строки, имеющие дублирующиеся ключи PRIMARY или UNIQUE в этой таблице, будут проигнорированы и не будут внесены. Если не указывать IGNORE, то данная операция вставки прекращается при обнаружении строки, имеющей дублирующееся значение существующего ключа.

Т.е. при наличии дублирующихся ключей возможен останов обработки запроса. Однако если использовать ключевое слово IGNORE, то могут сбиться строки и соответственно их идентификаторы.

Я сталкивался с тем, что базы не с первого раза переносились и стоит изучить на чем оно останавливается, возможно перенести именно ту запись на которой остановилось отдельно и увидеть текст ошибки.
Если найдете ответ, на данный вопрос буду рад его услышать.

Публикация комментария

Вы должны быть авторизованы.