1、新建wordpress站点
我们可以在当前的站点中,新建一个以WordPress程序内核的站点。我们的目的是需要将DEDECMS程序数据迁移到WP,转换成WP支持的数据库,我们有数据库和URL地址保持不变,那就不用担心,当然有些情况,比如TAG和一些功能可能会缺失,当然还是有一些遗憾的,但是至少我们的文章URL不变,这个已经解决我们大部分的问题。
2、在wordpress根目录下新站dedecms_to_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";
3、运行转换程序脚本
php dedecms_to_wordpress.php
转换之后,看一下伪静态链接是否一样。
上面是“织梦cms数据转换wordpress流程介绍”的全面内容,想了解更多关于 织梦cms 内容,请继续关注web建站教程。
当前网址:https://m.ipkd.cn/webs_2075.html
声明:本站提供的所有资源部分来自互联网,如果有侵犯您的版权或其他权益,请发送到邮箱:admin@ipkd.cn,我们会在看到邮件的第一时间内为您处理!