Полный перенос базы данных DLE в WordPress, включая теги.

02.06.2017

Об этом уже много информации можно найти в интернете, но перенос тегов всегда обходят стороной…

Для начала, давайте разберемся с таблицами. В Dle для тегов используется всего одна таблица dle_tags, в ней три поля:

  • id
    Это идентификатор тега.
  • news_id
    Идентификатор поста к которому прикреплен тег.
  • tag
    Сам тег

В WordPress тегами управляют следующие таблицы:
wp_terms с полями:

  • term_id (это будет id из dle_tags)
  • name (это tag из dle_tags)
  • slug(tag)

wp_term_taxonomy:

  • term_taxonomy_id (id)
  • term_id (id)
  • taxonomy ('post_tag')

wp_term_relationships:

  • object_id (news_id)
  • term_taxonomy_id (id)

Это не все поля которые имеются в данных таблицах, но нам понадобятся только они.  Итак, всё что нам остается это раскидать данные из имеющихся в  тех трех полях dle_tags по строкам в таблицы wp.

Исключение составляет только поле taxonomy в таблице  wp_term_taxonomy, это просто название таксономии его нужно заполнить текстом post_tag.

Следующий sql код как раз всё это и выполняет:

61
62
63
INSERT INTO wp_terms (term_id, name, slug) SELECT id, tag, tag FROM dle_tags;
INSERT INTO wp_term_relationships (object_id, term_taxonomy_id) SELECT news_id, id FROM dle_tags;
INSERT INTO wp_term_taxonomy (term_taxonomy_id, term_id, taxonomy) SELECT dle.id, dle.id, 'post_tag' FROM dle_tags AS dle;

Внимание! Не забудьте сделать бекап исходной базы данных Dle. Данный sql запрос не может быть универсальным, обезопасьте себя от потери данных.

Целиком код переноса бд DLE в WordPress такой:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
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`;
INSERT INTO wp_terms (term_id, name, slug) SELECT id, tag, tag FROM dle_tags;
 
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';
INSERT INTO wp_term_taxonomy (term_taxonomy_id, term_id, taxonomy) SELECT dle.id, dle.id, 'post_tag' FROM dle_tags AS dle;
 
TRUNCATE  `wp_term_relationships`;
INSERT INTO wp_term_relationships (object_id, term_taxonomy_id) SELECT id, category FROM dle_post;
INSERT INTO wp_term_relationships (object_id, term_taxonomy_id) SELECT new_id, id FROM dle_tags;
 
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;
 
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;

Вот и всё, все посты перенесены в Wp вместе с тегами.

Единственная загвоздка в том, что dle каждому тегу присваивает свой id, т.е. если у вас есть 100 постов с тегом «Ананас», то после переноса в вордпрессе вы увидите 100 одинаковых тегов «Ананас», но id у них будут разные. Решается это плагином «Term Management Tools«. Вы просто выбираете все одинаковые теги в вордпрессе и в выпадающем меню нажимаете «Merge», теги объединятся в единственный тег не потеряв при этом привязки к постам.

Надеюсь эта статья помогла вам перенести теги из Dle в WordPress, если же нет, то задавайте вопросы в комментариях и я постараюсь вам помочь 🙂

5 комментариев

  1. @Станислав пишет:

    Добрый день!
    При исполнении вашего запроса постоянно выдаёт ошибку

    1064 — You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near ‘term_taxonomy_id, term_id) SELECT id, id FROM dle_tags VALUES ‘post_tag» at line 1

    Можете подсказать в чем ошибка? Спасибо

    • @rinamina пишет:

      Здравствуйте. Пожалуйста, скажите ваш запрос полностью.

  2. @Станислав пишет:

    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`;
    INSERT INTO wp_terms (term_id, name, slug) SELECT id, tag, tag FROM dle_tags;

    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’;
    INSERT INTO wp_term_taxonomy (term_taxonomy_id, term_id, taxonomy) SELECT id, id FROM dle_tags VALUES ‘post_tag’;

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

    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;

    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;

    • @Станислав пишет:

      Текст один-в-один с вашего сайта же

      Единственное что исправлено new_id на news_id

      • @rinamina пишет:

        Да, действительно, ошибка в моем коде. Исправила, теперь всё должно работать корректно. Прошу прощения, половину писала по памяти)

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *

Сообщить об опечатке

Текст, который будет отправлен нашим редакторам: