如何将Dedecms数据导入WordPress实现完美迁移

问题场景

其实早在去年Dedecms就有了这样的一则公告,针对个人非营利网站外,均需要购买商业使用授权

图片[1]-如何将Dedecms数据导入WordPress实现完美迁移-FancyPig's blog

故很多热心网友在做一些本地自媒体时,使用了Dedecms都处于担惊受怕的状态。

解决方案

今天我给热心网友推荐了WordPress的wpcom JustNews主题,同时我们也将在下面分享迁移方案,在保留原有数据的同时,完成快速站点的转换。

安装WordPress

我们首先需要下载wordpress最新版本

图片[2]-如何将Dedecms数据导入WordPress实现完美迁移-FancyPig's blog

然后将其上传到站点根目录,并解压

图片[3]-如何将Dedecms数据导入WordPress实现完美迁移-FancyPig's blog
图片[4]-如何将Dedecms数据导入WordPress实现完美迁移-FancyPig's blog

然后将wordpress里的内容拷贝至站点根目录

图片[5]-如何将Dedecms数据导入WordPress实现完美迁移-FancyPig's blog

顺手把SSL证书也配置上

图片[6]-如何将Dedecms数据导入WordPress实现完美迁移-FancyPig's blog

然后就是正常安装过程,安装全新的wordpress站点。

安装完成后,我们开始做数据迁移,将下面的迁移脚本update_wordpress.php拷贝到站点根目录下

并按需修改数据库名、数据库用户、密码、dede系统表前缀(可以直接借鉴data/common.inc.php文件

图片[7]-如何将Dedecms数据导入WordPress实现完美迁移-FancyPig's blog

然后点击终端

图片[8]-如何将Dedecms数据导入WordPress实现完美迁移-FancyPig's blog

然后运行脚本

php update_wordpress.php
图片[9]-如何将Dedecms数据导入WordPress实现完美迁移-FancyPig's blog

差不多一分钟就搞定了,1247篇文章

图片[10]-如何将Dedecms数据导入WordPress实现完美迁移-FancyPig's blog

这时数据已经迁移完成了,我们下一步就是找一个自己喜欢的模板,然后进行细节优化就好了

迁移脚本

update_wordpress.php

<?php

// DedeCMS的数据库配置,内容与DedeCMS的这个配置文件内容相同:  data/common.inc.php
// ------------------------------------------------------------------------------------
// 以下 需要修改为你自己的
$cfg_dbhost      = 'localhost';
$cfg_dbname      = 'nxdb';        //库名
$cfg_dbuser      = 'root';        //数据库用户
$cfg_dbpwd       = 'root';        //密码
$cfg_dbprefix    = 'dede_';       //DEDE系统配置的 表前缀
$cfg_db_language = 'gbk';         //取值有两种 gbk 或者 utf8,具体决定于安装的DedeCMS的版本
$cfg_db_port     = 3306;


// ------------------------------------------------------------------------------------
// 以下为迁移程序,不要修改。
// ------------------------------------------------------------------------------------
require __DIR__ . '/wp-load.php';

function showlog($msg)
{
    printf("[%s] %s\n", date('Y-m-d H:i:s'), $msg);
}

$dede_db = null;

// 检查DedeCMS的数据库连接是否正确
function check_dede_config()
{
    global $cfg_dbhost, $cfg_dbuser, $cfg_dbpwd, $cfg_dbname, $cfg_db_port, $cfg_dbprefix, $cfg_db_language;
    global $dede_db;

    $dede_db = new mysqli($cfg_dbhost, $cfg_dbuser, $cfg_dbpwd, $cfg_dbname, $cfg_db_port);

    if ($dede_db->connect_errno) {
        showlog("DedeCMS数据库连接失败:" . $dede_db->connect_error);
        exit();
    } else {
        showlog("DedeCMS数据库连接成功");
    }

    if ( ! $dede_db->set_charset($cfg_db_language)) {
        showlog("DedeCMS数据库编码设置失败:" . $dede_db->error);
        exit();
    } else {
        showlog("DedeCMS数据库当前编码为:" . $dede_db->character_set_name());
    }

    if ( ! $dede_db->query('SELECT * FROM `' . $cfg_dbprefix . 'archives` LIMIT 1')) {
        showlog('DedeCMS数据库识别失败,检查表前缀参数是否正确。');
        exit();
    } else {
        showlog("DedeCMS数据库识别成功");
    }

    if ($cfg_db_language != 'utf8' || $dede_db->character_set_name() != 'utf8') {
        //需要转换字符编码
        if ( ! function_exists('iconv')) {
            showlog('PHP扩展库:iconv库未安装');
            exit();
        }
    }

    return true;
}

// 检查WordPress的数据是否正确,是否刚刚安装好,一切空白状态
function check_wp_config()
{
    global $wp_version;
    if ((float)$wp_version < 5.8) {
        showlog('WordPress系统版本小于5.8,程序退出');
        echo "\nWP最新版下载网址: https://cn.wordpress.org/download/\n\n";
        exit();
    } else {
        showlog('当前WordPress版本:' . $wp_version);
    }


    global $wpdb;

    $terms_count              = (int)$wpdb->get_var("SELECT COUNT(*) FROM " . $wpdb->base_prefix . 'terms');
    $termmeta_count           = (int)$wpdb->get_var("SELECT COUNT(*) FROM " . $wpdb->base_prefix . 'termmeta');
    $term_taxonomy_count      = (int)$wpdb->get_var("SELECT COUNT(*) FROM " . $wpdb->base_prefix . 'term_taxonomy');
    $term_relationships_count = (int)$wpdb->get_var("SELECT COUNT(*) FROM " . $wpdb->base_prefix . 'term_relationships');
    $posts_count              = (int)$wpdb->get_var("SELECT COUNT(*) FROM " . $wpdb->base_prefix . 'posts');
    if ($terms_count > 1 || $termmeta_count > 0 || $term_taxonomy_count > 1 || $term_relationships_count > 1 || $posts_count > 10) {
        showlog('WP已有数据,请使用全新安装的WordPress系统');
        echo "\nWP最新版下载网址: https://cn.wordpress.org/download/\n\n";
        exit();
    } else {
        showlog('确认当前是全新安装的WordPress系统,成功');

        //清除初始化安装时,自动创建的一丁点数据,保证绝对为空。否则无法保持 原文章ID值
        $wpdb->query("TRUNCATE " . $wpdb->base_prefix . 'terms');
        $wpdb->query("TRUNCATE " . $wpdb->base_prefix . 'termmeta');
        $wpdb->query("TRUNCATE " . $wpdb->base_prefix . 'term_taxonomy');
        $wpdb->query("TRUNCATE " . $wpdb->base_prefix . 'term_relationships');
        $wpdb->query("TRUNCATE " . $wpdb->base_prefix . 'posts');
        $wpdb->query("TRUNCATE " . $wpdb->base_prefix . 'postmeta');
        $wpdb->query("TRUNCATE " . $wpdb->base_prefix . 'comments');
    }
}


// 迁移文章内容
// 从 DedeCMS 的 archives 和 addonarticle 两个表,将文章栏目信息迁移到 WP 的 posts表。
function migrate_article()
{
    global $dede_db, $cfg_dbprefix;
    global $wpdb;

    $result        = $dede_db->query('SELECT COUNT(*) FROM `' . $cfg_dbprefix . 'archives` ');
    $row           = $result->fetch_row();
    $article_count = (int)$row[0];
    showlog("总共有 " . $article_count . " 篇文章内容");

    $result = $dede_db->query('SELECT MAX(`id`) FROM `' . $cfg_dbprefix . 'archives` ');
    $row    = $result->fetch_row();
    $maxid  = (int)$row[0];
    showlog("最大文章ID为 " . $maxid);


    //从哪一个ID开始迁移~~,如果数据量太大,而之前已经迁移过一部分了,或者太旧的文章不想要迁移了,那么可以修改这个值,从指定的ID开始继续
    $lastid   = 0;
    $do_count = 0;
    $step     = 10; //每次从数据库取多少篇文章

    $default_author_id = 1;

    $timeformat = 'Y-m-d H:i:s';

    $gmt_timezone   = new DateTimeZone('UTC');
    $local_timezone = wp_timezone(); //new DateTimeZone('PRC');

    while ($do_count < $article_count && $lastid < $maxid) {
        $result = $dede_db->query("SELECT * FROM `" . $cfg_dbprefix . "archives` WHERE `id`> {$lastid} ORDER BY `id` LIMIT " . $step);

        while ($obj = $result->fetch_object()) {
            if ($do_count % 100 == 0) {
                echo $obj->id;
                //printf("%s (%s)\n", $obj->id, $obj->title);
            } elseif ($do_count % 10 == 0) {
                echo ".";
            }

            $id          = $obj->id;
            $lastid      = $id;
            $create_time = $obj->pubdate;  //时间戳int
            $update_time = $obj->senddate; //时间戳int

            //文章创建时间
            $date = new DateTime();
            $date->setTimezone($local_timezone);   //本地时间
            $date->setTimestamp($create_time);     //本地时间戳int
            $post_date = $date->format($timeformat);
            $date->setTimezone($gmt_timezone);     //修改为UTC时间
            $post_date_gmt = $date->format($timeformat);

            //文章修改时间
            $date = new DateTime();
            $date->setTimezone($local_timezone);
            $date->setTimestamp($update_time);
            $post_modified = $date->format($timeformat);
            $date->setTimezone($gmt_timezone);
            $post_modified_gmt = $date->format($timeformat);

            //文章是否允许评论
            $comment_status = $obj->notpost == 1 ? "closed" : "open";


            $content_result = $dede_db->query("SELECT `body` FROM `" . $cfg_dbprefix . "addonarticle` WHERE `aid`= {$id} LIMIT 1");
            $content_obj    = $content_result->fetch_object();
            $post_content   = tt($content_obj->body);  //文章正文内容
            $content_result->close();

            $post_title = tt($obj->title); //标题
            $post_name  = strtolower(urlencode($post_title));  //标题转换为URL ENCODE的结果

            $guid = "";  //文章URL

            $sql = $wpdb->prepare("INSERT INTO `" . $wpdb->base_prefix
                . "posts` (`ID`, `post_author`, `post_date`, `post_date_gmt`, `post_content`, `post_title`, 
                `post_excerpt`, `post_status`, `comment_status`, `ping_status`, `post_password`, `post_name`, 
                `to_ping`, `pinged`, `post_modified`, `post_modified_gmt`, `post_content_filtered`, `post_parent`,
                `guid`, `menu_order`, `post_type`, `post_mime_type`, `comment_count`)
                VALUES (%d, %d, %s, %s,  %s, %s, 
                '', 'publish', %s, 'closed', '', %s, 
                '', '', %s, %s, '', '', 
                %s, 0, 'post', '', 0)",
                array(
                    $id,
                    $default_author_id,
                    $post_date,
                    $post_date_gmt,
                    $post_content,
                    $post_title,
                    $comment_status,
                    $post_name,
                    $post_modified,
                    $post_modified_gmt,
                    $guid
                ));
            $wpdb->query($sql);

            //设置各种附加属性到 postmeta 表

            if ($obj->shorttitle) { //shorttitle 文章副标题, 简略标题
                $sql = $wpdb->prepare("INSERT INTO `" . $wpdb->base_prefix
                    . "postmeta` (`post_id`, `meta_key`, `meta_value`) VALUES (%d, %s, %s)",
                    array($id, "shorttitle", tt($obj->shorttitle)));
                $wpdb->query($sql);
            }

            if ($obj->color) { //color 标题颜色
                $sql = $wpdb->prepare("INSERT INTO `" . $wpdb->base_prefix
                    . "postmeta` (`post_id`, `meta_key`, `meta_value`) VALUES (%d, %s, %s)",
                    array($id, "color", tt($obj->color)));
                $wpdb->query($sql);
            }

            if ($obj->writer && $obj->writer != 'admin' && $obj->writer != 'dede') { //writer 文章作者
                $sql = $wpdb->prepare("INSERT INTO `" . $wpdb->base_prefix
                    . "postmeta` (`post_id`, `meta_key`, `meta_value`) VALUES (%d, %s, %s)",
                    array($id, "writer", tt($obj->writer)));
                $wpdb->query($sql);
            }

            if ($obj->source && $obj->source != '未知') { //source 文章来源
                $sql = $wpdb->prepare("INSERT INTO `" . $wpdb->base_prefix
                    . "postmeta` (`post_id`, `meta_key`, `meta_value`) VALUES (%d, %s, %s)",
                    array($id, "source", tt($obj->source)));
                $wpdb->query($sql);
            }

            if ($obj->litpic) { //litpic  文章缩略图
                $sql = $wpdb->prepare("INSERT INTO `" . $wpdb->base_prefix
                    . "postmeta` (`post_id`, `meta_key`, `meta_value`) VALUES (%d, %s, %s)",
                    array($id, "litpic", tt($obj->litpic)));
                $wpdb->query($sql);
            }

            if ($obj->keywords) { //keywords 关键字 , 一般用于SEO的HTML文件头部分
                $sql = $wpdb->prepare("INSERT INTO `" . $wpdb->base_prefix
                    . "postmeta` (`post_id`, `meta_key`, `meta_value`) VALUES (%d, %s, %s)",
                    array($id, "keywords", tt($obj->keywords)));
                $wpdb->query($sql);
            }

            if ($obj->description) { //description 文章摘要
                $sql = $wpdb->prepare("INSERT INTO `" . $wpdb->base_prefix
                    . "postmeta` (`post_id`, `meta_key`, `meta_value`) VALUES (%d, %s, %s)",
                    array($id, "description", tt($obj->description)));
                $wpdb->query($sql);
            }
            if ($obj->click) { //click 	浏览次数
                $sql = $wpdb->prepare("INSERT INTO `" . $wpdb->base_prefix
                    . "postmeta` (`post_id`, `meta_key`, `meta_value`) VALUES (%d, %s, %s)",
                    array($id, "click", $obj->click));
                $wpdb->query($sql);
            }

            $do_count++;
        }

        $result->close();
    }

    echo "\n";
    showlog("文章内容迁移完成");
}

// 字符编码转换(如果需要的话)
function tt($str)
{
    global $cfg_db_language;
    if ($cfg_db_language == 'utf8') {
        return $str;
    } else {
        return iconv($cfg_db_language, 'UTF-8//IGNORE', $str); //将字符串的编码从GBK转到UTF-8
    }
}

// 计算程序运行耗时
function calc_elapse_time($start_time)
{
    $segs = microtime(true) - $start_time;

    $hours     = floor($segs / (60 * 60));
    $segs      -= $hours * 60 * 60;
    $mins      = floor($segs / 60);
    $segs      -= $mins * 60;
    $microsegs = floor(($segs - floor($segs)) * 1000);
    $segs      = floor($segs);

    return (empty($hours) ? "" : $hours . "小时") .
        (empty($mins) ? "" : $mins . "分钟") .
        $segs . "秒" .
        $microsegs . "毫秒";
}


//确认环境正确
check_dede_config();
check_wp_config();

//开始执行迁移操作
$start_time = microtime(true);
migrate_article();  // 迁移文章内容

echo "\n迁移完成,总共耗时 " . calc_elapse_time($start_time) . "\n\n";


补充说明:图片迁移

这里只需要将dedecms根目录的ueditor目录复制到Wordpress目录下就可以让图片正常访问了!

图片[11]-如何将Dedecms数据导入WordPress实现完美迁移-FancyPig's blog
© 版权声明
THE END
喜欢就支持一下吧
点赞11赞赏 分享
评论 共4条

请登录后发表评论