Однажды, с сайтом одного из проектов, с которыми я работаю случилась неприятность – его взломали и удалили все файлы с хостинга. Сайт был создан на платформе Data Life Engine (DLE), разумеется, на ломаной (nulled) версии. Полагаю, нас взломали сами авторы движка. Бекапы конечно у нас были и тогда я понял, что в движке полно уязвимостей и пора выполнить перенос сайта с DLE на WordPress. О том, как это сделать, я хочу рассказать вам в этой статье. В интернете есть несколько статей на эту тему, однако в них описано не все и код для переноса не полностью переносит все, что нужно для полноценной работы, содержит косяк с переносом анонсов, да и плагины WordPress там указаны устаревшие.
Шаг первый: бекап и установка WordPress
Для начала, рекомендую сделать бэкап базы данных DLE и его файлов. Затем посмотрите настройки подключения к БД в файле engine\data\dbconfig.php. Нас интересует DBNAME, DBUSER и DBPASS – скопируйте их куда-нибудь. Теперь нужно выполнить несколько простых действий:
- Удаляем все файлы с корня сайта, кроме папки uploads и всех, созданных вами папок и файлов в корне, если такие есть.
- Скачиваем WordPress
- Распаковываем файлы движка в корень сайта. Все файлы и папки, начинающиеся на “wp-“, должны оказаться в корневой папке сайта, где от DLE осталась только папка uploads.
- Заходим на сайт в браузере, появится страница установки WordPress, при установке укажите параметры подключения к той же БД, где остались данные DLE (параметры подключения мы копировали).
- После успешной установки, авторизуемся в админке
- В разделе плагины нажимаем “Добавить новый”, в поиске в углу вводим “Cyr to Lat” и устанавливаем этот плагин.
- Затем нам нужно убрать префикс “/category/” из URL и для этого подойдет плагин “No Category Base (WPML)“
- Или мы можем вместо него сразу установить отличный плагин для СЕО – “Yoast SEO“, который, помимо прочего, тоже обладает нужной нам функцией.
- Активируем оба плагина. Если ставили Yoast SEO, то заходим в раздел SEO -> Дополнительно -> Постоянные ссылки и в первом пункте ставим “Убрать”.
- Далее нам нужно сделать структуру ЧПУ (человекопонятных URL) такой же, как была в DLE. Для этого в консоли WordPress идем в Настройки -> Постоянные ссылки, выбираем “Произвольно” и вписываем
/%category%/%post_id%-%postname%.html
. Это приведет ссылки к такому виду, в каком они были на DLE. Опять же, может быть на вашем сайте DLE не было категорий в ссылках, тогда вам достаточно будет вписать/%post_id%-%postname%.html
- Теперь вам нужно найти и установить нужный вам шаблон (тему). Сделать это можно через Внешний вид -> Темы. Можно выбрать, установить и посмотреть темы из большого количества бесплатных тем, либо загружать свои шаблоны в виде zip архивов, которые вы найдете в интернете.
- Важно: не пытайтесь создавать на этом шаге новые посты и рубрики в WordPress, они все равно исчезнут на следующем шаге и будут заменены теми, которые были в DLE.
Первый шаг переноса сайта с DLE на WordPress завершен, осталась половина задачи.
Шаг второй: Миграция базы данных
Начну с того, что принцип хэширования паролей пользователей на движках отличается, поэтому пароли с DLE на WordPress не мигрируют вообще! Если у вас есть пользователи и открыта регистрация, то после переноса сайта, сделайте рассылку на E-Mail с просьбой восстановить свои пароли через кнопку “Забыли пароль”.
Дополнительные поля в записях (если они есть) не будут перенесены, поэтому если хотите их перенести, вам придется найти их в таблицах DLE, понять, где они должны быть в таблицах WP и изменить SQL код, который представлен ниже, чтобы он и их переносил куда следует.
А вообще это должно решиться заменой d_p.full_story
в коде на CONCAT(d_p.full_story,d_p.xfields)
.
Записи, созданные пользователем, который был потом удален, тоже могут быть не перенесены. Рекомендую сначала проверить, чтобы всем записям был указан какой-нибудь автор (существующий пользователь). Добавить автора всем записям, где его нет можно следующим SQL запросом:
UPDATE 'dle_post' SET author='ЛОГИН АВТОРА' WHERE author=''
Теперь о SQL коде для миграции
Если вы зайдете в phpMyAdmin, вы увидите, что в базе данных есть таблицы, начинающиеся на “wp_” и на “dle_”. Если все так – значит вы нигде не ошиблись при установке WordPress.
Для нормальной работы сайта, мы хотим в автоматическом режиме перенести пользователей, категории, записи и комментарии в соответствующие таблицы WordPress.
Когда мне пришлось переносить сайт с DLE на WordPress, я читал другие статьи на эту тему и понял, что везде дают один и тот же код для миграции БД, однако этот код имеет существенные недостатки:
- Он не переносит полное имя и инфо о себе для пользователей
- Он не устанавливает необходимые записи прав, поэтому аккаунты пользователей могут работать некорректно
- Он выполняет слияние анонсов и полной версии записей в одну, из за чего при просмотре полной записи будет дублирование текста в начале (если вы использовали и анонсы и полные версии).
При переносе сайта с DLE на WordPress, я доработал этот код, теперь он переносит данные пользователей и добавляет аттрибуты прав. Что же касается анонсов записей, то тут все зависит от того, как вы использовали их и использовали ли вообще. Поэтому далее я предоставлю несколько вариантов SQL запроса для этих случаев.
Итак, в phpMyAdmin выбираем нашу базу данных, переходим на вкладку “SQL” и будем выполнять запросы по частям (так безопаснее, особенно, если у вас большой сайт):
Сперва переносим пользователей их данные и права. Всем будет установлена роль “Подписчик”.
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;
INSERT INTO `wp_usermeta` (user_id, meta_key, meta_value) SELECT user_id, first_name, 'fullname' FROM dle_users;
INSERT INTO `wp_usermeta` (user_id, meta_key, meta_value) SELECT user_id, description, 'info' FROM dle_users;
INSERT INTO `wp_usermeta` (user_id, meta_key, meta_value) SELECT user_id, admin_color, 'fresh' FROM dle_users;
INSERT INTO `wp_usermeta` (user_id, meta_key, meta_value) SELECT user_id, show_admin_bar_front, 'false' FROM dle_users;
INSERT INTO `wp_usermeta` (user_id, meta_key, meta_value) SELECT user_id, wp_capabilities, 'a:1:{s:10:"subscriber";b:1;}' FROM dle_users;
INSERT INTO `wp_usermeta` (user_id, meta_key, meta_value) SELECT user_id, 'wp_user_level', 0 FROM dle_users;
Затем переносим категории.
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;
Теперь можно переносить посты. Тут я предложу 3 варианта:
Если на вашем сайте текст постов находится только в короткой версии (анонсе):
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, d_p.short_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_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, 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_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;
И наконец, переносим комментарии:
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. Теперь вы можете удалить таблицы с префиксом dle_ из базы данных и смело посмотреть работу сайта. Если пути к картинками в DLE были прописаны правильно, они должны будут отображаться, ведь папку uploads с картинками мы оставили. Вам останется только сделать основные настройки сайта (заголовок, описание, другие настройки в консоли WordPress) и конечно поработать с шаблоном, чтобы все было как вы хотите.
С помощью этого кода, я успешно в 2012 году перенес с DLE на WordPress сайт проекта Club-FL с ~2000 записями и более 3000 пользователями.
Конечно стоит отметить, что такой перенос никогда не пройдет без осечек. В зависимости от набора установленных у вас на DLE плагинов и дополнительных функций в постах, в их отображении могут быть проблемы. Например могут быть проблемы с цитатами BLOCKQUOTE, блоками PRE и CODE (если вы такие используете), а также со спойлерами и лишними тегами при отображении картинок.
Если после переноса вы обнаружили какие-то из перечисленных проблем, то некоторые из них можно решить следующим образом (спасибо сайту kinorossia.ru):
В phpMyAdmin выбираем таблицу wp_posts и экспортируем ее в файл. Рекомендую открыть этот файл не блокнотом, а нормальным текстовым редактором, например Notepad++. Учтите, что при большом размере дампа, редактор может подвиснуть. Просто дайте ему время на обработку файла.
Теперь нажимаем комбинацию [Ctrl]+[F] и в появившемся окне переключаемся на вкладку “Замена”.
Ниже будут описаны замены, которые необходимо выполнить. Когда заполните поля, нужно нажимать кнопку “Заменить все” и ждать окончания обработки. Редактор может зависнуть на некоторое время, если файл слишком большой.
- найти:
<!--dle_image_begin:http
и заменить на:<a href="http
- найти:
.jpeg|--><img
и зменить на:.jpeg"><img
- найти:
.png|--><img
и зменить на:.png"><img
- найти:
.gif|--><img
и зменить на:.gif"><img
- найти:
<!--dle_image_end-->
и заменить на:</a>
- найти:
<!--colorstart:
и заменить на<span style="color:
- найти:
"><!--/colorstart-->
и заменить на:;">
- найти:
<!--/colorend-->
и заменить на:</span>
- найти:
<div class="quote"><!--QuoteEBegin-->
и заменить на:<blockquote>
- найти:
<!--QuoteEnd--></div>
и заменить на:</blockquote>
- найти:
\"
и заменить на:"
Теперь сохраните изменение в файле, вернитесь в phpMyAdmin, и выполните запрос:
SQL TRUNCATE wp_posts;
Затем можно импортировать ваш измененный дамп.
И последнее, что бы я хотел сказать в этой статье. В отличие от DLE, в движке WordPress из коробки отсутствует функция плавного увеличения изображения по клику (технология Highslide). Однако добавить ее очень просто и это описано в этой статье.
UPD 2023: статья отредактирована и дополнена. Что касается SQL запросов, то есть вероятность, что спустя столько лет и обновлений как DLE, так и WordPress, что-то может уже не подходить, но у меня больше нету сайтов на DLE, чтобы проводить эксперименты, поэтому актуализировать эту информацию я не могу.