从Movable Type迁移到WordPress
這是一個記錄於2005年至2009年左右更新,此後僅偶爾進行Movable Type版本更新且內容被忽略的Movable Type部落格轉移至WordPress的日誌。
动机
由于我没有在使用,所以可以将其放置不管,但是 Movable Type 的许可证很难理解(目前是个人免费版),而且转换成 WordPress 后它似乎会自动适配移动端,而且我觉得 WordPress 的市场份额更大,所以我决定进行迁移。
转型的考虑
目前情况
当前的环境处于以下状态。
-
- VPSで稼働
- HTTPSにはしておらず、HTTP
每个组件的版本如下。
由于此博客还托管了多个网站,因此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的管理界面中导出数据。
如果想要改变文章中的某个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>
最初的设置
当访问网站的首页时,将会被重定向到安装界面,然后输入相关信息进行安装。
插件的导入和自定义设置
从仪表板的工具 > 导入中选择“立即安装”“移动式类型和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:') ) {
(省略)
执行导入。
从仪表板的工具菜单中,选择导入,然后执行导入操作。
投稿者也可以在这里进行更改。
永久链接设置
在设置中选择”自定义结构”,并将”/%year%/%monthnum%/%day%%hour%%minute%”设置为链接结构。
以上则应该能够保留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に移行してみた。