织梦cms数据转换wordpress流程介绍

622 ℃

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

转换之后,看一下伪静态链接是否一样。

wordpress利用mysql让文章 ID重新排列

wordpress如何在搜索结果中排除指定分类的文章

wordpress如何设置自动发布文章功能

wordpress如何用代码自动清空回收站

新站需要保持多少个外链(有什么要求)

标签: wordpress, 新站

上面是“织梦cms数据转换wordpress流程介绍”的全面内容,想了解更多关于 织梦cms 内容,请继续关注web建站教程。

当前网址:https://m.ipkd.cn/webs_2075.html

声明:本站提供的所有资源部分来自互联网,如果有侵犯您的版权或其他权益,请发送到邮箱:admin@ipkd.cn,我们会在看到邮件的第一时间内为您处理!

js如何随机生成颜色并赋值css样式
wordpress怎么单独设置关键词(description)和描述(keywords)
css如何实现强制英文不换行
Vue.watch函数的进阶用法介绍
网站优化SEO双标题有什么用?