アルファサード株式会社 代表取締役 野田 純生のブログ


Movable Typeを?年愛用してきた自分が最新のWordPressに触れてないけど考えたこと。


公開日 : 2011-06-27 10:00:25


ちぃとばかし気になったので反応しておきます。

以前の記事では、CMSとしてはMovable Typeが優れていると書きましたが、WordPressも全く遜色の無い機能を備えていることに気づきました。

それがカスタムポスト機能です。

これは何かというと、Movable Typeで言うところの「ブログ記事」や「ウェブページ」といった投稿の種類を独自に拡張できる機能です。

たとえば不動産物件を管理するサイトであれば「不動産物件」であったり、旅館のサイトであれば「お部屋」といったように、自由に投稿の種類を追加することができます。 そのため、サイトの新着情報は新着情報として、不動産物件は不動産物件として別々に管理することができるのです。

Movable Typeも実はカスタムポスト機能と言うべき仕組みを持っているのですが(名前はついていませんけど)そのあたりのドキュメントや事例が少ないんでしょうね。少々面倒なことは否定しませんが。

Movable Typeのカスタムポストが少々面倒なのは、MTは静的生成できるからという面もあると思います。独自オブジェクトを作成してリスティングスクリーンを作成、投稿画面を作成して権限を設定、それからArchiveTypeを登録してやらないといけない。

ちなみに、ドキュメントがない、というのは4-5の頃の話で現在はGitHubに詳細なドキュメントがあります。周知不足ですねきっと。

ギークなエンジニアなら、その程度はプラグインを作ってお茶の子さいさいなのでしょうが、わざわざそのためにプラグインを作るコストを考えると非常に手間がかかります。

こいつ↓を使うとプログラムを1行も書かずにカスタムポストが実現出来ます。

有償じゃねーか、って言われそうですが、弊社案件では原価かかんないわけですからWordpressを選択する理由にならないですし。

2つ以上の言語習得が必要なMovable Type

しかしながら、逆に複雑なこと・・・例えば「多階層のカテゴリをサイドバーにメニューの一覧として出力したい」等をMTMLで実現しようとすると、プログラミング言語よりも圧倒的に制限された仕様内で試行錯誤を行わなくてはならず、非常に手間がかかります。

できる...よね? MTMLだけで。そう複雑とは思えないですが。

まぁ、この↓ページにサンプルがないのが悪い。

問題はこの部分↓。

さらにテンプレートにはPerlは利用できませんから、プラグインで開発する独自の機能はPerlでMTMLとして記述できるように開発し、MTMLとしてテンプレートに記述するという、2段階の手順を取る必要があります。

これはもう、考え方としか言いようがないですが、プレゼンテーションとロジックが同じ言語で書かれているってのは、テンプレートの意味があるのかないのかわからないんです(分ける必要がないんじゃないかと)。PHPは言語じゃなくてタグだ(<?php ?>)なんて言う人がいたりする? けど、そうでしょうか?

そもそも、同じ人が書くことを前提にするなら学習コストが2倍みたいな話になってくるわけで、ロジックを書く人間とプレゼンテーションを書く人間をきっちり分けちゃえば片方でいいですよね。MTML自体にロジックを書くことも結構できるわけですが、それにしてもプレゼンテーション担当はPerl(PHP)やらなくでも良いわけで。

これまでにもMTCakeとかMTPlugin Wordpressってのを書いたりしたんですが、やっぱりきっちり分けることで分業効率とメンテナンス性が向上しないですかね(すると思いますよ)。

Cakeのテンプレートの例を見ていただきたいのですが(WordPressの話ではないのですが)、ループの部分は <?php foreach ($posts as $post): ?>~ <?php endforeach; ?>、タイトルを取り出すのは配列 $postのキー[Post]のさらにキー[title]をPHPのコードで取得するわけです。これはテンプレートというよりもう、何て言うかプログラムです。

MTCakeを利用した方のテンプレートは、きっちり分かれてますよね。

ビュー

<!-- File: /app/controllers/posts_controller.php -->
<?php
class PostsController extends AppController {
    var $name = 'Posts';
    function index() {
        $ctx = $this->ctx;
        $ctx->__stash[ 'vars' ][ 'page_title' ] = 'Blog posts';
        $ctx->stash( 'Post', $this->Post->find( 'all' ) );
    }
}
?>

プレゼンテーション(テンプレート)

<!-- File: /app/views/posts/index.ctp -->
<h1><mt:var name="page_title" escape="html"></h1>
<!-- Here is where we loop through our posts array, printing out post info -->
<mt:cake:loop model="Post">
<mt:ignore>
    or <mt:cake:loop model="Post" stash="posts">
</mt:ignore>
<mt:if name="__first__">
<table>
    <tr>
        <th>Id</th>
        <th>Title</th>
        <th>Created</th>
    </tr>
</mt:if>
    <tr>
        <td><mt:var name="id"></td>
        <td>
            <a href="./view/<mt:var name="id">"><mt:var name="title" escape="html"></a>
        </td>
        <td><mt:var name="created"></td>
    </tr>
<mt:if name="__last__">
</table>
</mt:if>
</mt:cake:loop>

DynamicMTML(WordPressプラグイン)やMTCakeではテンプレートでPHPも書けますが、これは敢えて書かない方向性で実装していくほうが望ましいと思います。ここら辺はもう宗教思想みたいなところにいっちゃいますけどね。

オブジェクト指向のPerlが敷居が高いってのは...この辺は好みの話になると思いますが、MTの場合はPHPでもプラグイン書けます。DynamicMTMLを使うことで静的ファイルに対する処理のプラグインもPHPで書けるようになります。テンプレートにPerlやPHPでロジックを書かない、これはもう、敢えて書かない方向でいくべきなんじゃないかな、と思うのでした。

最後に、「有償」ってのはどうなんだって話ですが、有償ってのは「責任」と言い換えることができると思います。先日来立て続けにセキュリティアップデートのリリースされたMTですが、WordPressにもこんなのがあって(→「WordPressのプラグインに悪質なコードが混入」)何かあったときに、「オラどうすんだよこの野郎」って言えるかどうかってのが有償と無償の境目なんじゃないかと。

あとね、結局あの悪評高い? 再構築の件ですが、規模が一定以上だと静的配信できないとやっぱ苦しいです。自治体・官公庁に動的配信ベースのものが受け入れられるかというと、やっぱ難しいです(無いとはいいませんが)。



このブログを書いている人
野田純生の写真
野田 純生 (のだ すみお)

大阪府出身。ウェブアクセシビリティエバンジェリスト。 アルファサード株式会社の代表取締役社長であり、現役のプログラマ。経営理念は「テクノロジーによって顧客とパートナーに寄り添い、ウェブを良くする」。 プロフィール詳細へ