レンタルサーバにさよならを

ブログをあるレンタルサーバに置いていた。 値段もそこそこで、Wordpressも一発で構築できるので重宝していたのだが、SSL対応をすると素の時とは違うアドレスでアクセスしないとダメ、という不条理な仕様のせいで引っ越しをする。

引っ越しはgithub pagesに決めているのだが、その経緯は別の項に譲り、本稿ではWordpressからJekyllに移行–正しくはJekyllへインポートできるデータの作成について備忘のため記す。

プラグインのWordPress to Jekyll Exporterを使う

これはもう定番で、WordpressのプラグインであるWordPress to Jekyll Exporterを使う。あとはJekyllで読めばよい。

それだけで終了といえば終了なのだが、いろいろと苦労があったのでこの記事を書いている。

Jekyll Exporterとは

このプラグインを使うと、Wordpressのデータを根こそぎzipファイルにまとめてくれる。

Wordpress自体にもエクスポート機能はあるが、こちらは記事をマークダウン形式に変換してくれるし、画像もまとめてくれるのが大きな違い。

インストールするとダッシュボードの「ツール」に「Export to Jekyll」というメニューが生まれるので、これをクリックするだけ、なのだが。

いくつか注意点がある。みんなあまりこの辺のことを書かないんだよな。

Export to Jekyllするときの注意

  1. データが多いと失敗する

    wordpress(あるいはそれを動かしているphp)では、プロセスの実行にタイムアウト時間を設けている。データがあまりに多いと作業がこのタイムアウト時間を超えてしまい、強制終了されてしまう。エクスポートが失敗し、エラーメッセージが"Maximum execution time of 30 seconds exceeded"であるなら、まさにこれ。(もちろん、数字は設定によって異なる)

    対処方法としては、wordpressのwp-config.phpで以下の一行を加える。

    set_time_limit(300);
    

    値は秒なので心ゆくまで延ばせ。

    あるいは以下にあるように、.htaccessやphp.iniで対応する手もある。 https://codex.wordpress.org/Common_WordPress_Errors#Maximum_execution_time_exceeded

  2. プラグインは無効化を

    プラグインを使って記事内に「いいね」ボタン等を自動挿入している場合。 そのままにしていると、Jekyllに書き出したときに以下のようなタグが大量に含まれる。

    <div class="wsbl_facebook_like">
    

    私の場合、このほかにも記事内の目次を自動生成するプラグインを使っている。 エクスポートするのは記事内容なので、こういった付加情報は無いほうがいいだろう。

    というわけで、エクスポートにあたっては、Export to Jekyll以外のプラグインは無効化する。

  3. permalinkは「基本」がいいでしょう(未検証)

    SEO目的等でpermalinkに投稿名を含める設定にしていると、Jekyllがうまく処理できない。

    日本語permalinkのままJekyllでhtml化すると、なぜかhtmlリンクが働かない記事がいくつか発生した。いろいろ調べたものの原因が分からず、後の工程でpermalinkを無視して進めた。「基本」、つまり記事のアドレスが「?p=記事番号」になる設定にすれば、あるいは道が見つかるかもしれないが…未検証。もうやりとうない。

  4. 作成したzipファイルは7-zip等で伸張を

    Export to Jekyllで作成したzipファイルは、なぜかWindows10で伸張できない。7-zip等のアーカイバを使うこと。FreeBSDのunzipでも伸張できた。

Export to Jekyllで得たデータの整形

前述のような注意点を踏まえても、出力したデータにはさらに手を加える必要がある。

画像リンク修正

Export to Jekyllで出力したzipを展開するとおおよそ以下のようなディレクトリ構成になる。

.
├── _config.yml
├── _drafts
├── _posts
└── wp-content
    └── uploads
        ├── 2017
        ├── 2018
        └── 2019

Wordpressでせっせと書きためた記事は_postsの直下に置かれる(なお拡張子はすべて".md"(markdown)になっている)

wp-content/uploadsの下には、年に加え、さらに月ごとにディレクトリがあって、そこに画像が格納されている。

Wordpressの設定によるかもしれないが、画像リンクは絶対アドレスで書かれているので、そのまま使うと画像だけは引っ越し元から読み込むことになってしまう。これはマズいのでリンクを書き換える必要がある。

手っ取り早いのは相対パスにしてしまうことだ。

Jekyllで処理をすると最終的なディレクトリ構成は以下のようになる。

_site
├── 2019
│   ├── 01 (記事がある)
│   └── 05 (記事がある)
├── about
├── assets
│   ├── main.css
│   └── minima-social-icons.svg
├── feed.xml
└── wp-content
    └── uploads
        └── 2019
            ├── 01 (画像がある)
            └── 05 (画像がある)

記事はたとえば2019/05の下に置かれ、画像はwp-content/uploadsの下に置かれるわけだから、以下の通りリンクを書き換えればよい。

   変更前: http://hogehoge.hoge/blogs/wp-content/uploads/2019/05/hoge.jpg
   変更後: ../../wp-content/uploads/2019/05/hoge.jpg

ということで、_postsディレクトリに降りてsedすればよい。

$ sed -i.bak -e 's#http\://hogehoge.hoge/blogs/#\.\./\.\./#g' *.md
$

そのままだとスラッシュ、コロン、ドットすべてをエスケープしないといけないので、デリミタを#にして、せめてスラッシュくらいは使えるようにしている

front matterにあるpermalinkの削除

Jekyllで記事を書く時には、冒頭にfront matterというエリアを設け、そこに設定を書き込むようになっている。 例えば以下のようなものだ。

---
id: 3201
title: FreeBSD 12のbhyveにWindows10をインストールする:その2(vm-bhyve使用)
date: 2019-05-12T20:30:48+09:00
author: nobwak
layout: post
guid: ../../?p=3201
permalink: /?p=3201
image: /wp-content/uploads/2019/05/18-620x483.jpg
categories:
  - bhyve
---

ここに「permalink」という行がある。 これはJekyllがhtmlのリンク構成を作るときに、どうpermalinkを設定するかを制御する。 参考:https://jekyllrb.com/docs/front-matter/

デフォルトだと年/月/日/タイトル.htmlだが、front matterにこう書かれてしまうとpermalinkが滅茶苦茶になる。 (記事名で作ればよいが先述の通り日本語記事だとどうもうまくいかない)

そこでfront matterから一律でpermalinkを削る。

とんでもない荒療治だが、いい手が思い浮かばないのでこうする。 ただ、こうするとJekyllはデフォルト設定に従って、構成を/カテゴリ/年/月/日/タイトル.htmlとする。もしこれが気に入らないのなら、Jekyllの設定ファイルである_config.ymlで指定を行う。これは後述。

さて削除。前項と同様、_postsでsed。permalinkは8行目だから;

$ sed -i.bak2 -e '8d' *.md
$

無事に削除された。

---
id: 3201
title: FreeBSD 12のbhyveにWindows10をインストールする:その2(vm-bhyve使用)
date: 2019-05-12T20:30:48+09:00
author: nobwak
layout: post
guid: ../../?p=3201
image: /wp-content/uploads/2019/05/18-620x483.jpg
categories:
  - bhyve
---

Jekyllのディレクトリ構成を変えたい

Jekyllの設定ファイルである_config.ymlに以下の行を追加すればよいだけ。

permalink: /:year/:month/:day-:slug:output_ext

書式はJekyll公式サイトの説明を見ればよろしい。

以上。