问题场景
其实早在去年Dedecms就有了这样的一则公告,针对个人非营利网站外,均需要购买商业使用授权
![图片[1]-如何将Dedecms数据导入WordPress实现完美迁移-FancyPig's blog](https://static.iculture.cc/wp-content/uploads/2022/11/20221130150520895.png?x-oss-process=image/auto-orient,1/format,webp/watermark,image_cHVibGljL2xvZ28ucG5nP3gtb3NzLXByb2Nlc3M9aW1hZ2UvcmVzaXplLFBfMTA,x_10,y_10)
故很多热心网友在做一些本地自媒体时,使用了Dedecms都处于担惊受怕的状态。
解决方案
今天我给热心网友推荐了WordPress的wpcom JustNews主题,同时我们也将在下面分享迁移方案,在保留原有数据的同时,完成快速站点的转换。
安装WordPress
我们首先需要下载wordpress最新版本
![图片[2]-如何将Dedecms数据导入WordPress实现完美迁移-FancyPig's blog](https://static.iculture.cc/wp-content/uploads/2022/11/20221130151013311-1024x620.png?x-oss-process=image/auto-orient,1/format,webp/watermark,image_cHVibGljL2xvZ28ucG5nP3gtb3NzLXByb2Nlc3M9aW1hZ2UvcmVzaXplLFBfMTA,x_10,y_10)
然后将其上传到站点根目录,并解压
![图片[3]-如何将Dedecms数据导入WordPress实现完美迁移-FancyPig's blog](https://static.iculture.cc/wp-content/uploads/2022/11/20221130151204809-1024x204.png?x-oss-process=image/auto-orient,1/format,webp/watermark,image_cHVibGljL2xvZ28ucG5nP3gtb3NzLXByb2Nlc3M9aW1hZ2UvcmVzaXplLFBfMTA,x_10,y_10)
![图片[4]-如何将Dedecms数据导入WordPress实现完美迁移-FancyPig's blog](https://static.iculture.cc/wp-content/uploads/2022/11/20221130151225357-1024x504.png?x-oss-process=image/auto-orient,1/format,webp/watermark,image_cHVibGljL2xvZ28ucG5nP3gtb3NzLXByb2Nlc3M9aW1hZ2UvcmVzaXplLFBfMTA,x_10,y_10)
然后将wordpress里的内容拷贝至站点根目录
![图片[5]-如何将Dedecms数据导入WordPress实现完美迁移-FancyPig's blog](https://static.iculture.cc/wp-content/uploads/2022/11/20221130151753932.png?x-oss-process=image/auto-orient,1/format,webp/watermark,image_cHVibGljL2xvZ28ucG5nP3gtb3NzLXByb2Nlc3M9aW1hZ2UvcmVzaXplLFBfMTA,x_10,y_10)
顺手把SSL证书也配置上
![图片[6]-如何将Dedecms数据导入WordPress实现完美迁移-FancyPig's blog](https://static.iculture.cc/wp-content/uploads/2022/11/20221130151439476.png?x-oss-process=image/auto-orient,1/format,webp/watermark,image_cHVibGljL2xvZ28ucG5nP3gtb3NzLXByb2Nlc3M9aW1hZ2UvcmVzaXplLFBfMTA,x_10,y_10)
然后就是正常安装过程,安装全新的wordpress站点。
安装完成后,我们开始做数据迁移,将下面的迁移脚本update_wordpress.php拷贝到站点根目录下
并按需修改数据库名、数据库用户、密码、dede系统表前缀(可以直接借鉴data/common.inc.php文件)
![图片[7]-如何将Dedecms数据导入WordPress实现完美迁移-FancyPig's blog](https://static.iculture.cc/wp-content/uploads/2022/11/20221130151847176.png?x-oss-process=image/auto-orient,1/format,webp/watermark,image_cHVibGljL2xvZ28ucG5nP3gtb3NzLXByb2Nlc3M9aW1hZ2UvcmVzaXplLFBfMTA,x_10,y_10)
然后点击终端
![图片[8]-如何将Dedecms数据导入WordPress实现完美迁移-FancyPig's blog](https://static.iculture.cc/wp-content/uploads/2022/11/20221130152016667-1024x813.png?x-oss-process=image/auto-orient,1/format,webp/watermark,image_cHVibGljL2xvZ28ucG5nP3gtb3NzLXByb2Nlc3M9aW1hZ2UvcmVzaXplLFBfMTA,x_10,y_10)
然后运行脚本
php update_wordpress.php
![图片[9]-如何将Dedecms数据导入WordPress实现完美迁移-FancyPig's blog](https://static.iculture.cc/wp-content/uploads/2022/11/20221130152130445.png?x-oss-process=image/auto-orient,1/format,webp/watermark,image_cHVibGljL2xvZ28ucG5nP3gtb3NzLXByb2Nlc3M9aW1hZ2UvcmVzaXplLFBfMTA,x_10,y_10)
差不多一分钟就搞定了,1247篇文章
![图片[10]-如何将Dedecms数据导入WordPress实现完美迁移-FancyPig's blog](https://static.iculture.cc/wp-content/uploads/2022/11/20221130152208493.png?x-oss-process=image/auto-orient,1/format,webp/watermark,image_cHVibGljL2xvZ28ucG5nP3gtb3NzLXByb2Nlc3M9aW1hZ2UvcmVzaXplLFBfMTA,x_10,y_10)
这时数据已经迁移完成了,我们下一步就是找一个自己喜欢的模板,然后进行细节优化就好了
迁移脚本
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](https://static.iculture.cc/wp-content/uploads/2022/11/20221130154311320-1024x500.png?x-oss-process=image/auto-orient,1/format,webp/watermark,image_cHVibGljL2xvZ28ucG5nP3gtb3NzLXByb2Nlc3M9aW1hZ2UvcmVzaXplLFBfMTA,x_10,y_10)
© 版权声明
THE END
- 最新
- 最热
只看作者