从Movable Type迁移到WordPress

這是一個記錄於2005年至2009年左右更新,此後僅偶爾進行Movable Type版本更新且內容被忽略的Movable Type部落格轉移至WordPress的日誌。

动机

由于我没有在使用,所以可以将其放置不管,但是 Movable Type 的许可证很难理解(目前是个人免费版),而且转换成 WordPress 后它似乎会自动适配移动端,而且我觉得 WordPress 的市场份额更大,所以我决定进行迁移。

转型的考虑

目前情况

当前的环境处于以下状态。

    • VPSで稼働

 

    HTTPSにはしておらず、HTTP

每个组件的版本如下。

コンポーネントバージョンOSCentOS 7.6Apache2.4.6PHP5.4.16MariaDB5.5.60Movable Typer.4207

由于此博客还托管了多个网站,因此Apache通过虚拟主机进行各种处理。

关于转型的担忧点

    • 画像ファイルが移行できるか

MTからアップロードした画像ファイルはMTがコンテンツを書き出すディレクトリーのimagesまたはassets_cディレクトリーにある
記事内では相対リンクではなく、http://blog.sotoiwa.com/images/090602_ma720.jpgのように絶対リンクで参照している
なので、imagesとassets_cをそのまま残せば大丈夫そう

記事のURLを維持できるか

アーカイブテンプレートの設定を確認すると、ブログ記事のアーカイプパスは%y/%m/%d%h%n.htmlを指定してあり、http://blog.sotoiwa.com/archives/2009/06/032327.htmlのようなパスとなっている
WordPressでも同じルールで記事のパスを設定すれば大丈夫そう

从Movable Type导出数据

从MT的管理界面中导出数据。

image.png

如果想要改变文章中的某个URL或者做其他操作,可以考虑在这个阶段对生成的文件进行批量替换,因为生成的文件是将每篇文章的内容连接起来的文本。

AUTHOR: sotoiwa
TITLE: Movable Type
BASENAME: movable_type
STATUS: Publish
ALLOW COMMENTS: 1
CONVERT BREAKS: __default__
ALLOW PINGS: 1
PRIMARY CATEGORY: computer
CATEGORY: computer
DATE: 08/09/2005 05:05:07 PM
-----
BODY:
Movable Typeのテスト。
-----
EXTENDED BODY:

-----
EXCERPT:

-----
KEYWORDS:

-----


-----
--------

安装WordPress

为了操作WordPress作为转移目的地,需要确认需求。

要件

PHP バージョン 7.3 以上。
MySQL バージョン 5.6 以上、または MariaDB バージョン 10.1 以上。
HTTPS 対応

于是,我们对现有环境进行调整以满足要求。

使用HTTPS

我们已在另一篇文章中总结了有关HTTPS支持的内容。

    Let’s EncryptでApacheをHTTPSに対応させる

在HTTPS支持后,通过MT的功能将网站URL在文章中也转换为https://,并确认在整合性正常的情况下运行,然后重新导出数据。可以选择在进行HTTPS支持之前使用已导出的文本进行批量替换,两种方法都可以。

将PHP升级到新版本。

由于CentOS默认的PHP版本是5.4,因此需要添加EPEL和Remi仓库来进行安装。

    • CentOS7のPHPのバージョンを5.6.x/7.0.x/7.1.x/7.2.x/7.3.xにバージョンアップする

 

    CentOS6/CentOS7にPHP5.6/PHP7をyumでインストール

添加存储库。

# EPELのリポジトリを追加
# rpm -Uvh https://dl.fedoraproject.org/pub/epel/epel-release-latest-7.noarch.rpm
yum install epel-release
# Remiのレポジトリを追加
rpm -Uvh http://rpms.famillecollet.com/enterprise/remi-release-7.rpm

删除现有的php包。

yum remove php-*

从Remi仓库安装PHP 7.3,同时需要安装EPEL仓库以满足依赖关系。

yum install --enablerepo=epel,remi,remi-php73 php
yum install --enablerepo=epel,remi,remi-php73 php-mbstring
yum install --enablerepo=epel,remi,remi-php73 php-mysqlnd

请确认版本。

# php -v
PHP 7.3.5 (cli) (built: Apr 30 2019 08:37:17) ( NTS )
Copyright (c) 1997-2018 The PHP Group
Zend Engine v3.3.5, Copyright (c) 1998-2018 Zend Technologies
#

升级MariaDB版本

    • CentOS 7 MariaDB インストール、及び初期設定

 

    MariaDBを10.3にアップグレードする際の手順と注意事項

卸载应用并不会删除数据,但为了保险起见,请先备份。

# mtテーブルだけ
mysqldump -u root -p mt > mt.dump
# 全テーブル
mysqldump -u root -p -x --all-databases > hogehoge.dump
# ユーザー情報
mysqldump -u root -p -x --allow-keywords mysql > hogehogeuser.dump

如果要恢复,请按以下方式执行。 , àn .)

mysql -u root -p < mt.dump
mysql -u root -p < hogehoge.dump
mysql -u root -p mysql < hogehogeuser.dump

请删除现有的MariaDB。由于存在依赖关系,可能会导致其他软件包被一同删除,因此需重新安装。如果对Postfix进行了定制配置,请务必提前备份配置文件。

# MariaDBを削除
yum remove mariadb-*
# Postfixを再インストール
systemctl status postfix
systemctl start postfix
# 以下もMTが使うので再導入
yum install perl-DBD-mysql

添加MariaDB的仓库。

curl -sS https://downloads.mariadb.com/MariaDB/mariadb_repo_setup | sudo bash

安装并启动MariaDB。

yum install MariaDB-server
systemctl start mariadb

确认版本。

# mysql --version
mysql  Ver 15.1 Distrib 10.3.14-MariaDB, for Linux (x86_64) using readline 5.1
[root@v157-7-141-80 ~]# mysql -u root -p
Enter password:
Welcome to the MariaDB monitor.  Commands end with ; or \g.
Your MariaDB connection id is 248
Server version: 10.3.14-MariaDB MariaDB Server

Copyright (c) 2000, 2018, Oracle, MariaDB Corporation Ab and others.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

MariaDB [(none)]> select version();
+-----------------+
| version()       |
+-----------------+
| 10.3.14-MariaDB |
+-----------------+
1 row in set (0.001 sec)

MariaDB [(none)]> quit;
Bye
#

执行安全设置和表格升级的操作。

mysql_secure_installation
mysql_upgrade -u root -p

安装WordPress

    WordPress のインストール

为了适配WP,添加一个数据库。

mysql -u root -p
create database wp;
grant all on wp.* to wpuser@localhost identified by 'hogehoge';
show databases;
select user,host from mysql.user;
quit;

下载WordPress存档文件,并在位于文档根目录上一级的目录中解压缩。

mkdir -p /var/www/wp.sotoiwa.com
cd /var/www/wp.sotoiwa.com
wget https://ja.wordpress.org/wordpress-5.2-ja.tar.gz
tar xzvf wordpress-5.2-ja.tar.gz
chown -R apache:apache wordpress
cd wordpress

按照安装指南创建wp-config.php文件。

cp wp-config-sample.php wp-config.php
vi wp-config.php

以上的准备应该已经完成了。

改变方向

修改httpd.conf文件,将DocumentRoot从MT内容的导出目录更改为wordpress目录。

<VirtualHost *:443>
    ServerName blog.sotoiwa.com:80
-   DocumentRoot "/var/www/blog.sotoiwa.com/blog"
+   DocumentRoot "/var/www/wp.sotoiwa.com/wordpress"
-   Alias /mt7 "/var/www/blog.sotoiwa.com/mt7"
-   Alias /mt-static7 "/var/www/blog.sotoiwa.com/mt-static7"
+   Alias /images "/var/www/blog.sotoiwa.com/blog/images"
+   Alias /assets_c "/var/www/blog.sotoiwa.com/blog/assets_c"
    ErrorLog logs/error_log_blog.sotoiwa.com
    CustomLog logs/access_log_blog.sotoiwa.com combined
+   <Directory "/var/www/wp.sotoiwa.com/wordpress">
+       Options Indexes FollowSymLinks
+       AllowOverride FileInfo AuthConfig Limit
+       Require all granted
+   </Directory>
    <Directory "/var/www/blog.sotoiwa.com/blog">
        Options Indexes FollowSymLinks
        AllowOverride FileInfo AuthConfig Limit
        Require all granted
    </Directory>
-   <Directory "/var/www/blog.sotoiwa.com/mt7">
-       Options Indexes FollowSymLinks ExecCGI
-       AllowOverride FileInfo AuthConfig Limit
-       Require all granted
-   </Directory>
-   <Directory "/var/www/blog.sotoiwa.com/mt-static7">
-       Options Indexes FollowSymLinks
-       AllowOverride FileInfo AuthConfig Limit
-       Require all granted
-   </Directory>
    ServerAlias blog.sotoiwa.com
    Include /etc/letsencrypt/options-ssl-apache.conf
    SSLCertificateFile /etc/letsencrypt/live/sotoiwa.com/cert.pem
    SSLCertificateKeyFile /etc/letsencrypt/live/sotoiwa.com/privkey.pem
    SSLCertificateChainFile /etc/letsencrypt/live/sotoiwa.com/chain.pem
</VirtualHost>
</IfModule>

最初的设置

当访问网站的首页时,将会被重定向到安装界面,然后输入相关信息进行安装。

image.png

插件的导入和自定义设置

从仪表板的工具 > 导入中选择“立即安装”“移动式类型和TypePad”。如果继续执行导入,由于无法导入标签,请按照以下内容修复导入程序。

    WordPress 3.0にMovable Typeのタグをインポートする
-        function save_post(&$post, &$comments, &$pings) {
+        function save_post(&$post, &$comments, &$pings, &$tags) {
(省略)
        if ( $post_id = post_exists($post->post_title, '', $post->post_date) ) {
(省略)
            // Add categories.
            if ( 0 != count($post->categories) ) {
                wp_create_categories($post->categories, $post_id);
            }

             // Add tags or keywords
-           if ( 1 < strlen($post->post_keywords) ) {
+           if ( 1 < strlen($tags) ) {
                // Keywords exist.
-               printf('<br />'.__('Adding tags <em>%s</em>...', 'movabletype-importer'), stripslashes($post->post_keywords));
-               wp_add_post_tags($post_id, $post->post_keywords);
+               printf('<br />'.__('Adding tags <em>%s</em>...', 'movabletype-importer'), stripslashes($tags));
+               wp_add_post_tags($post_id, $tags);
            }
        }
(省略)
    }

    function process_posts() {
(省略)
        $context = '';
        $post = new StdClass();
        $comment = new StdClass();
        $comments = array();
        $ping = new StdClass();
        $pings = array();
+       $tags = '';

        echo "<div class='wrap'><ol>";

        while ( $line = $this->fgets($handle) ) {
            $line = trim($line);

            if ( '-----' == $line ) {
                // Finishing a multi-line field
                if ( 'comment' == $context ) {
                    $comments[] = $comment;
                    $comment = new StdClass();
                } else if ( 'ping' == $context ) {
                    $pings[] = $ping;
                    $ping = new StdClass();
                }
                $context = '';
            } else if ( '--------' == $line ) {
                // Finishing a post.
                $context = '';
-               $result = $this->save_post($post, $comments, $pings);
+               $result = $this->save_post($post, $comments, $pings, $tags);
                if ( is_wp_error( $result ) )
                    return $result;
                $post = new StdClass;
                $comment = new StdClass();
                $ping = new StdClass();
                $comments = array();
                $pings = array();
+               $tags = '';
            } else if ( 'BODY:' == $line ) {
                $context = 'body';
            } else if ( 'EXTENDED BODY:' == $line ) {
                $context = 'extended';
            } else if ( 'EXCERPT:' == $line ) {
                $context = 'excerpt';
            } else if ( 'KEYWORDS:' == $line ) {
                $context = 'keywords';
            } else if ( 'COMMENT:' == $line ) {
                $context = 'comment';
            } else if ( 'PING:' == $line ) {
                $context = 'ping';
            } else if ( 0 === strpos($line, 'AUTHOR:') ) {
                $author = trim( substr($line, strlen('AUTHOR:')) );
                if ( '' == $context )
                    $post->post_author = $author;
                else if ( 'comment' == $context )
                     $comment->comment_author = $author;
            } else if ( 0 === strpos($line, 'TITLE:') ) {
                $title = trim( substr($line, strlen('TITLE:')) );
                if ( '' == $context )
                    $post->post_title = $title;
                else if ( 'ping' == $context )
                    $ping->title = $title;
            } else if ( 0 === strpos($line, 'BASENAME:') ) {
                $slug = trim( substr($line, strlen('BASENAME:')) );
                if ( !empty( $slug ) )
                    $post->post_name = $slug;
            } else if ( 0 === strpos($line, 'STATUS:') ) {
                $status = trim( strtolower( substr($line, strlen('STATUS:')) ) );
                if ( empty($status) )
                    $status = 'publish';
                $post->post_status = $status;
            } else if ( 0 === strpos($line, 'ALLOW COMMENTS:') ) {
                $allow = trim( substr($line, strlen('ALLOW COMMENTS:')) );
                if ( $allow == 1 )
                    $post->comment_status = 'open';
                else
                    $post->comment_status = 'closed';
            } else if ( 0 === strpos($line, 'ALLOW PINGS:') ) {
                $allow = trim( substr($line, strlen('ALLOW PINGS:')) );
                if ( $allow == 1 )
                    $post->ping_status = 'open';
                else
                    $post->ping_status = 'closed';
            } else if ( 0 === strpos($line, 'CATEGORY:') ) {
                $category = trim( substr($line, strlen('CATEGORY:')) );
                if ( '' != $category )
                    $post->categories[] = $category;
+           } else if ( 0 === strpos($line, "TAGS:") ) {
+               $tags = trim( substr($line, strlen("TAGS:")) );
            } else if ( 0 === strpos($line, 'PRIMARY CATEGORY:') ) {
                $category = trim( substr($line, strlen('PRIMARY CATEGORY:')) );
                if ( '' != $category )
                    $post->categories[] = $category;
            } else if ( 0 === strpos($line, 'DATE:') ) {
(省略)    

执行导入。

从仪表板的工具菜单中,选择导入,然后执行导入操作。

image.png

投稿者也可以在这里进行更改。

image.png

永久链接设置

在设置中选择”自定义结构”,并将”/%year%/%monthnum%/%day%%hour%%minute%”设置为链接结构。

image.png

以上则应该能够保留URL和标签并进行迁移。

(Translation: The above should be able to maintain the URL and tags and proceed with the migration.)

请参阅以下链接。

    • Movable Type から WordPress への移行

 

    • Importing from Movable Type to WordPress

 

    URLを変えずにMovable TypeからWordPressに移行してみた。
广告
将在 10 秒后关闭
bannerAds