MT5のPHP APIを探る(その1)

Movable Type 3.1以降には、PHPで動的にページを生成する「ダイナミックパブリッシング」の機能があります。
そして、Movable Type 5で、PHPのAPIが一新され、従来より使い勝手が良くなりました。
ダイナミックパブリッシングで使うのが本来の用途ですが、一般のPHPのプログラムでMTのデータを操作することもできます。

そこで、Movable Type 5のPHPのAPIを探ってみたいと思います。

1.MTのオブジェクトの生成

MTのデータを操作するには、まずMT全体を表すオブジェクトを生成します。
これは、MTクラスの「get_instance」というメソッドで行うことができます。

$mt = MT::get_instance(ブログID, 設定ファイル名);

「ブログID」には、ブログ/ウェブサイトのIDを渡します。
「null」を渡して、IDを省略することもできます。
また、「設定ファイル名」には、通常は「mt-config.cgi」を渡します。

また、MTクラスは、MTのディレクトリ→「php」ディレクトリにある「mt.php」で定義されています。
そこで、get_instanceメソッドを実行する前に、mt.phpを読み込んでおきます。

ここまでの話に沿って、MTのオブジェクトを生成する処理を書くと、以下のようになります。

set_include_path(get_include_path() . PATH_SEPARATOR . '/path/to/MT_DIR/php');
require_once('mt.php');
$cfg_file = 'mt-config.cgi';
$mt = MT::get_instance(null, $cfg_file);

2.データを読み込む

MTのオブジェクトに対して「db」というメソッドを実行すると、データベースアクセス用のオブジェクトを得ることができます。
また、dbオブジェクトに対して「fetch_XXX」メソッドを実行すると、ブログ記事等の各種のオブジェクトを読み込むことができます(「XXX」にはオブジェクト名が入ります)。
fetch_XXXメソッドには、パラメータとして、検索条件を表す配列を渡します。

例えば、MT内のウェブサイトをすべて読み込みたいとします。
ウェブサイトは「fetch_websites」メソッドで読み込むことができます。
このメソッドのパラメータに空の配列を渡すと、ウェブサイトをすべて読み込むことができます。

$db = $mt->db();
$websites = $db->fetch_websites(array());

3.オブジェクトを操作する

各クラスのオブジェクトには、プロパティとメソッドがあります。

プロパティで、オブジェクトの内容を調べることができます。
例えば、ウェブサイトのオブジェクトの「name」プロパティで、ウェブサイトの名前を得ることができます。

また、メソッドを実行することで、オブジェクトに関する各種の操作を行うことができます。
例えば、ウェブサイトのオブジェクトには、「blogs」というメソッドがあります。
このメソッドを実行すると、ウェブサイト配下のすべてのブログを読み込むことができます。

ここまでの話に沿って、すべてのウェブサイトと、その配下のブログの名前を出力するプログラムを作ると、以下のリストのようになります。

まず、8行目のfetch_websitesメソッドで、すべてのウェブサイトを読み込みます。
そして、10行目のforeach文で繰り返しを行い、各ウェブサイトを順に処理します。
11行目のprintで、ウェブサイトの名前(nameプロパティ)を出力します。

次に、13行目の文で、ウェブサイトのオブジェクトのblogsメソッドを実行し、ウェブサイト配下のブログをすべて読み込みます。
そして、14行目のforeach文で繰り返しを行って各ブログを順に処理し、15行目のprintでブログの名前(nameプロパティ)を出力します。

<?php
set_include_path(get_include_path() . PATH_SEPARATOR . '/path/to/MT_DIR/php');
require_once('mt.php');
$cfg_file = 'mt-config.cgi';
$mt = MT::get_instance(null, $cfg_file);

$db = $mt->db();
$websites = $db->fetch_websites(array());
print "<ul>\n";
foreach ($websites as $website) {
    print '  <li>' . $website->name . "\n";
    print "  <ul>\n";
    $blogs = $website->blogs();
    foreach ($blogs as $blog) {
        print '    <li>' . $blog->name . "</li>\n";
    }
    print "  </ul>\n  </li>\n";
}
print "</ul>\n";
?>