MTをcronで定期的に再構築

今回はメモエントリーです。

MovableType では、テンプレートなどから HTML ファイルを生成することを再構築と呼びます。当然、記事を投稿した際などに再構築を行う(ことで新しい内容のページができあがる)わけですが、最近記事の投稿に使っている Live Writer を利用した際に、複数ブログを連携させるMultiBlog というものが想定したように動いてくれない(あるブログに記事を投稿した際に、他のブログを再構築すること)、という問題に遭遇しました。

原因は、Live Writer のように外部ツールからの投稿の際に利用される仕組みである XML-RPC による投稿の際には、MultiBlog の(再構築)トリガーが引かれない、ということで、どうやらこれは仕様のようです。下記ブログを参照のこと。

で、いろいろ調べたところ、mt-rebuild というスクリプトを使って、定期的に(とりあえず一日一回)再構築させることで対応することにしました。

mt-rebuild を使う

mt-rebuild は以下のページからダウンロードできます。

かなり以前に作られたもので、現在の MT4.x では動かない、と書かれているブログも見受けられます。

しかし、こちらは MT4.x の機能であるカスタムフィールドの部分が引っかかる、というもので、現在こちらで対象とするブログではカスタムフィールドは利用していないので、とりあえず参考情報ということで。

それと、とりあえずスクリプト内の以下の部分を変更しておきました。

#my $mt = MT->new( Config    => $MT_DIR . 'mt.cfg',
#                  Directory => $MT_DIR )
#  || die MT->errstr;

my $mt = MT->new( Config    => $MT_DIR . 'mt-config.cgi',
                  Directory => $MT_DIR )
  || die MT->errstr;

MTの設定ファイルのファイル名が以前( MT.3x 以前かな?)と違っているためですね。

このスクリプトを実行することで、引数で指定したブログを再構築できるわけです。

cron を使う

また、通常こうしたスクリプトを定期的に実行させるには、cron という仕組みを使うのが常套手段です。

しかし、利用しているホスティングサービスの現在のサービス契約では、telnet が利用できずに、cronはサービス専用の設定画面からスクリプトを選択させることしかできないのです(=スクリプトに対して引数を指定できない)。

というわけで、mt-rebuild スクリプトを呼び出すためのシェルスクリプト(この中で引数を mt-rebuild に渡す)を書いてアップロード、それを cron で指定して呼び出す(そのシェルスクリプトを cron で実行する)、という形になりました。

そしてここで、テンプレート名に日本語を指定したら以下のエラーメッセージが帰ってきたために、とりあえずテンプレート名を半角英数文字にすることで対応しました。

  • Rebuild Error: Can't load template (日本語のテンプレート名) in blog_id of 2 at (mt-rebuildのインストールフォルダ)/mt-rebuild.pl line 148.

おそらく、文字コードが合っていないためでしょう。シェルスクリプトから日本語名のテンプレートを指定して実行できた、と書かれているブログもあることですし。これに関しては、後日また試してみたいと思います。

ただ、どうもブログ全体を再構築する指定はうまくいかず(あまり関係ないと見られるエラーメッセージがでる)、特定のテンプレートを再構築させる指定はできましたので、当面の目標はクリアしたこともあり今回はこれでよしとします。

…と、ここまで調べて実装するのに数時間もかかってしまいました。以下の2点を宿題として記録しておきます。

  1. カスタムフィールドを利用した際にきちんと再構築されるか
  2. テンプレート指定でなくブログ全体指定できちんと再構築されるか

このブログ記事に対するトラックバックURL: http://www.ngo-jvc.net/~gt205119/mt/mt-tb-jvcweb.cgi/301/jvcwebtb/XXXXXXXX

※トラックバックスパム対策のため、お手数ですがトラックバックURL末尾のXXXXXXXX 部分を下記画像の数字列に書き換えてからご利用ください。

trackback code

コメントする


画像の中に見える文字を入力してください。