Перенос сайта с DLE на WordPress 2023

с DLE на WordPress

Однажды, с сайтом одного из проектов, с которыми я работаю случилась неприятность – его взломали и удалили все файлы с хостинга. Сайт был создан на платформе 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] и в появившемся окне переключаемся на вкладку “Замена”.

Notepad++ (замены)

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

  • найти: <!--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, чтобы проводить эксперименты, поэтому актуализировать эту информацию я не могу.