MT5.0系から6.xにアップグレードする時に気をつけるポイント

この記事は「[Movable Type Advent Calendar 2016](http://www.adventar.org/calendars/1381)」の9日目の記事です。

みなさんMovableTypeのバージョンアップしてますか？
MT5.xを使っていて、そろそろバージョンアップしなきゃなという人に送る、バージョンアップする時に気をつけるべき点や便利なプラグインの作り方などを共有したいと思います。

まずは自分が使っているMovableTypeは安全なのか、このバージョンはいつまでサポートされるのかがわからないよという人にはこちら。
[Movable Type のプロダクト・ライフサイクルポリシー](https://www.movabletype.jp/life_cycle_policy.html)
自分の使っているバージョンは新しいから大丈夫という思っても、新しいバージョンはどんどん追加されています。
ぜひチェックしてみてください。

それではmt5からmt6へバージョンアップした時に実際につまずいたり更新が必要な部分を書いていきたいと思います。

## アップグレードはコマンドで実行
これはデータの量や環境によりけりですが、データが大量に入ったmtをブラウザから画面でアップグレードしようとするとトラブルが発生してしまう確率が高かったりします。タイムアウトやネット環境など色々な原因がありますが、それらを回避する手っ取り早い方法はコマンドからのアップグレードです。
```
$ cd dir_to_mt
$ perl tools/upgrade --name=admin
```
`--name`でアップグレードを実行するユーザID

その他下記のようなオプションも用意されています。

- `–sql`
アップグレードを実行した時にデータベースに投げられるSQLを表示
(このオプションを指定するとdryrunも指定したことになるので、アップグレード処理は実行されません)

- `–dryrun`
アップグレード処理は実行せず、ログだけ表示

最初は`-dryrun`で実行し、ログ内容に問題がないようであれば-dryrunを外して実行しましょう。
もちろんデータベースのバックアップを取得した後に実行しましょう。

コマンドからであればよほどの大量なデータでない限りは5分もかからずに完了します。
コマンドを実行した後にログが流れないなどであれば、mt-configに書いてあるデータベース周りの設定が正しいか確認しましょう。


## jQueryのバージョンの違い
mt6.2以下を使っていてバージョンアップする際には、mt6.2以降でjQuery、jQueryUIのバージョンがそれぞれ変わっています。

- jQuery: v2.1.4
- jQuery UI: v1.11.4


AltTemplatePathなどの仕組みを使ってテンプレートを書いたり、プラグインで画面を追加している場合などは、jQueryを使った部分が正しく動くか確認する必要があります。
特にチェックボックスのON/OFF判定をしている箇所などでハマりました。

### 想定通り判定できないパターン
```
if( jQuery('#header_sp').attr('checked') == true ) {
```

### 想定通り判定できるパターン
```
if( jQuery('#TargetID').attr('checked') == 'checked' ) {
// または
if( jQuery('#TargetID').prop('checked') ) {
// または
if( $('#TargetID').is(':checked') ) {
```

また、liveやdieなどでDOMにイベントをつけ外しをしている場合も1.9以降は動かないので修正する必要があります。
このあたりはjQuery自体のバージョンの差異ですが、特に1.9未満と以上で違いがかなりあるみたいです。
下記サイトが大変参考になりました。
[jQueryのバージョン1.9での変更点・違いのまとめ。IE8対応だが，1.8とはAjax等のAPIが異なり，プラグインが動かない問題が多発。リファレンスは2.0と共通](http://computer-technology.hateblo.jp/entry/20150705/p1)

jQueryのバージョンが変わっているので、当然使用しているjQueryのプラグインなども確認が必要です。
バージョンが変わることで動かなくなるプラグインなどもあります。
開発が続いていて、プラグインを入れ替えるだけで動くのであれば楽ですが、開発が止まっている場合プラグインの変更、または改修が必要となります。

## 環境変数の違い
mt-config.cgiに書いてある環境変数ですが、mt5から6へのバージョンアップの場合は下記ページに書いてありますが、追加が必要な環境変数がないか確認が必要です。
[環境変数リファレンス ](https://www.movabletype.jp/documentation/appendices/config-directives/)

mt6.2以降ではサムネイル等を作る際の画像の圧縮度を変更できるようになっています。
`AutoChangeImageQuality`
`ImageQualityJpeg`
`ImageQualityPng`

またファイルのアップロード画面も新しくなっており、従来の画面を使いたい場合は下記の設定を「1」にします。
`EnableUploadCompat`

6.0以降ではダッシュボードの表示も変わるため、従来の画面を使いたい場合には下記設定を「1」にします。
`EnableBlogStats`

## カテゴリーアーカイブが表示されない
MT6以降ではブログの全般設定に「記事が含まれない場合でも、カテゴリ アーカイブを公開する」という設定が追加されています。
この設定にチェックがない場合、記事が含まれていないカテゴリのアーカイブファイルは作成されません。
手動でONにできる人は手動でONに、ブログ数が多くて手動では無理という場合は下記のようなプラグインを作成し、アップグレードファンクションとして登録すると自動ですべてのブログでONになります。

```
sub update_blog_publish_empty_archive {
    my $app = shift;
    $app->progress(
        MT::Upgrade->translate_escape(
            'ブログ記事が含まれない場合でも、カテゴリ アーカイブを公開するをONにしています...'
        )
    );

    require MT::Blog;
    my $iter = MT::Blog->load_iter();
    while ( my $blog = $iter->() ) {
        $blog->publish_empty_archive(1);
        $blog->save();
    }
    1;
}
```

## 一覧画面の違い
リスティングフレームワークになる前に独自の一覧画面などを作ってしまっている場合には、見た目が変わってしまいます。
css等のずれによるものだと思いますが、リスティングフレームワークに変更してしまいましょう。
慣れるまでは面倒ですが、慣れてしまえばリスティングフレームワークはものすごく簡単に作れてしまいます。

## その他管理画面の見た目
管理画面のcssもmt5からアップグレードする際には注意が必要です。
プラグインで画面を追加している場合、mt5からだとhtml5になっていたりcssが変わっていたりして管理画面が崩れたりという問題も発生する可能性があります。

他にも何かたくさんあった気がしますが、思い出したらまた書いてみたいと思います。