MT5のブログで任意のディレクトリに画像をアップロードする方法を考えてみた
一時は心中してもいいとさえ思っていたExpressionEngineから今回、Movable Type 5に乗りえた。
2004年から現在までこのサイトのブログエンジンは、
- Movable Type 3
- Nucleus
- MODx + WordPress
- ExpressionEngine
と変遷をたどってきたけど、ここへ来て再びMovable Typeに回帰するということになった。
もともと複数のブログが動かせるのがMTの特徴だったけど、MT5になってから複数のサイトを管理できるようになって、CMSとしての使い勝手がさらによくなった。昔はスタティックでいちいち再構築しなければならないのがネックで使うのをやめたけど、最近のMTはダイナミックパブリッシングがわりと使えるようになったので、他のPHPベースのブログエンジンと遜色ないどころか、管理画面のUIやテンプレートタグのわかりやすさなども考え合わせると、CMSとしては断トツでトップなのではないかと思うようになった。しかも世の中はWordPress全盛でマイナーな存在になりつつあるところもまた好感が持てたりする。
MT5で唯一不満なのが、画像のアップロードディレクトリを任意の場所に設定できないということだ。
今まで当サイトでは、画像は、lazycamera.com/uploads/に置いてきた。ブログ用の画像は、
lazycamera.com/uploads/weblog/
プロフィールページ用の画像は、
lazycamera.com/uploads/profile/
というふうに画像用ディレクトリの中でカテゴリ分けをしている状態だ。こうしておけば、画像は必ずlazycamera.com/uploads/以下のディレクトリに入っているということになるので後々のメンテナンスが楽になる。
しかし、MTの場合、たとえばこのサイトのようにルートディレクトリ lazycamera.com/を「ウェブサイト」、lazycamera.com/weblog/を「ブログ」に設定して、ブログから画像をアップロードしようと思うと、lazycamera.com/weblog/より下のディレクトリにしかアップすることができない。これでは、各ブログごとにそれぞれ別の場所に画像ディレクトリができてしまうことになって都合が悪い。
極力コアファイルを触ることなく、どうにかして任意の場所に画像をアップロードできるようにしたいといろいろと試行錯誤した結果、ちょっと強引だが解決法を見つけたので備忘録として書いておきたい。
Ads by Google
サイトの構成は下図のような感じ。
lazycamera.com/ トップページ - MTの「ウェブサイト」に設定(blog_idは1)
└/weblog/ ブログページ - MTの「ブログ」に設定(blog_idは2)
この状態で、blog_id 2のブログからlazycamera.com/直下に画像をアップロードしたいというのが今回の目的だ。基本的に、すべてダイナミックパブリッシングで出力するという想定で話を進めていく。
この問題については、今まで何度か挑んでいて、編集画面のテンプレートを直接いじるとか、シンボリックリンクを張ってごまかすとかいろいろ考えてみては失敗して、MTを使う限りは仕方ないのないことだとあきらめかけていたけど、今日、別のことを調べていてこんな記事を見つけてひらめいた。
Movable Typeの管理サイトでFTPが使えないときにファイルをアップロードする裏ワザ - 小粋空間
ブログのサイトパスをルート直下に設定してしまえば、アップロードディレクトリも自由に設定できるじゃないか!
というわけで、ブログ(blog_id=2)のほうの「設定」→「全般」で以下のように設定。
本来なら、ブログURLとブログパスに「weblog」と入力するべきところを空欄に。そして、アーカイブパスのほうを「weblog」とする。さらに、このままだと、lazycamera.com/weblog/ でブログのトップページにアクセスできなくなってしまうので、「デザイン」→「テンプレート」のメインページのテンプレートの出力ファイル名を以下のようにルートからのパスに書き換える。
この状態で再構築をすると、ひとまず/weblog/以下はちゃんと思った通りの動作をするようになる。
が、ブログのサイトパスをルート直下に設定しているので、トップページ(blog_id=1、MTの「ウェブサイト」)のmtview.phpを上書きしてしまい、lazycamera.com/が表示されなくなってしまう。
mtview.phpは、ブログの再構築によって以下のように書き換えられている。
<?php
include('/path/to/mt/php/mt.php');
$mt = MT::get_instance(2, '/path/to/mt/mt-config.cgi');
$mt->view();
//include('/path/to/mt/php/mt.php');
//$mt = MT::get_instance(1, '/path/to/mt/mt-config.cgi');
//$mt->view();
?>
MT::get_instanceの最初の引数の「2」がblog_id。もともとウェブサイトのトップ(blog_id=1)の内容を表示するはずなのに、上書きによってブログ(blog_id=2)の内容を表示することになってしまっている。もちろんトップページはblog_idが1なので表示する内容が取得できず真っ白の画面となる。
そこで、ルート直下にあるmtview.phpを直接エディタで開いて、ちょっと強引に修正してみる。
<?php
include('/path/to/mt/php/mt.php');
if(preg_match('/weblog/',$_SERVER['REQUEST_URI'])){
$id = 2;
}else{
$id = 1;
}
$mt = MT::get_instance($id, '/path/to/mt/mt-config.cgi');
$mt->view();
?>
$_SERVER['REQUEST_URI']でURLを取得して、weblogという文字列が見つかったらブログ(blog_id=2)の内容を読み込むというふうにしたら、とりあえずのところちゃんと動くようになった。新しいブログを追加する度にこの設定をしなければならないけど、普通そんなに頻繁にブログを増やしたり減らしたりすることはないので、ひとまずこれでよしとする。
あとは、再構築をかける度にこのmtview.phpを修正しなくてはならなくなるけど、一旦テンプレートが完成してしまえば、ダイナミックパブリッシングを使っている限りは再構築をすることはないので、そこは目をつぶることにする。
念のために、mtview.phpのパーミッションを404とかに設定して上書きできなくしておくといいかもしれない。
さて、これで当初の目的通りの動作をするようになった。
あとは、MTの管理画面のテンプレートに「extra_path」の設定をすれば、さらに便利に使えるのではないかと思う。
/path/to/mt/tmpl/cms/include/asset_upload.tmpl をコピーして、
/path/to/mt/alt-tmpl/cms/include/asset_upload.tmpl をつくる。
その冒頭に、
<mt:blogid setvar="bid">
<mt:if name="bid" eq="2">
<$mt:setvar name="extra_path" value="uploads/weblog"$>
//blog_idが2のときは/uploads/weblog/へ
<mt:else>
<$mt:setvar name="extra_path" value="uploads/main"$>
//それ以外のとき(現状ではblog_idが1)は/uploads/main/へ
</mt:if>
<script type="text/javascript">
/* <
