PHPでMovableTypeのデータを扱ってみた

個人的にMovableTypeの様な静的生成が苦手なのですが、ダイナミックパブリッシングもイマイチ上手く扱えないのでどうにかしてPHPで直接取得できないか調べていました。

今まで知らなかったのですが、どうもPHPのライブラリが内包されているようで、それを利用することで割と簡単に実装することが出来たのでメモしておきます。

記事の一覧を取得

MovableTypeのアプリケーションディレクトリ内の「PHP」ディレクトリ内にライブラリが内包されています。
簡単な使い方の例として、“最新10件分の記事を取得”する記述は下記の通り。

Movable Type 5の場合

MT5はPHP5以上を想定されているため、チェーンメソッドが使えたり、インスタンスメソッドが用意されています。

// MTのシステムディレクトリを「path/to/mt」とする
$mt_dir = 'path/to/mt';

// MTのPHPライブラリを読み込み
require_once( $mt_dir.'/php/mt.php' );  
require_once( $mt_dir.'/php/lib/MTUtil.php' );

// MTクラス
$mt_class = MT::get_instance($blog_id, $mt_dir.'/mt/mt-config.cgi');

// 最新10件取得
$args = array(
    'blog_id' => $blog_id,
    'limit' => 10
);
$result = $mt_class->db()->fetch_entries( $args );

Movable Type 4の場合

Movable Type 4の場合、PHP4からの対応の為、クラスの実装方法が変わっているため、呼び出し方も変えないといけません。
特に気を付ける点としては、クラスの受け渡しにグローバル変数を利用している事でしょうか?

上記例と同じ事をするにはこんな感じに記述します。

// MTのシステムディレクトリを「path/to/mt」とする
$mt_dir = 'path/to/mt';

// MTのPHPライブラリを読み込み
require_once( $mt_dir.'/php/mt.php' );  
require_once( $mt_dir.'/php/lib/MTUtil.php' );

// MTクラス
// 他のライブラリで利用するので、グローバル変数「$mt」で割り当てること
global $mt;  
$mt = new MT( $blog_id, $mt_dir.'/mt-config.cgi' );
// DBクラス
// チェーンメソッドが使えない環境を考慮して分割
$mt_db = $mt->db();

// 最新10件取得
$args = array(
    'blog_id' => $blog_id,
    'limit' => 10
);
$result = $mt_db->fetch_entries( $args );

カスタムフィールドの値を取得

参考のサイトを見てみると、「entry_field.ベースネーム」で取得されるように書いてあるのですが、うまく取れませんでした。MT4しか試してなかったので、MT5なら取得できるのでしょうか?

「mtdb_base.php」内の記述にもそれらしき箇所があるのですが、ちょっと分からなかったので、記事を取得してからもう一回カスタムフィールドのデータを取得する方法を取ってみました。

MT5の場合

記事情報に対してい1つずつ「get_meta」を利用してカスタムフィールドの情報を取得します。

// $mt_class = MT::get_instance( *** );
// $result = $mt_class->db()->fetch_entries( $args );
foreach( $result as $key => $val ) {  
    $result[$key]["meta"] = $mt_class->db()->get_meta( 'entry', $val["entry_id"] );
}

MT4の場合

基本的にMT5との違いはありません。

// $mt = new MT( *** );
// $mt_db = $mt->db();
// $result = $mt_db->fetch_entries( $args );
foreach( $result as $key => $val ) {  
    $result[$key]["meta"] = $mt_db->get_meta( 'entry', $val["entry_id"] );
}

本来はfetch_entries内に既に機能が備わっているはずなので、他に良い方法がありそうですが…。

その他

引数について

fetch_entriesで渡したデータで返ってくる記事が変化しますが、代表的なモノとしては下記のモノが挙げられます。

blog_id / include_blogs / exclude_blogs
ブログID
entry_id / not_entry_id
記事ID
limit
取得記事数
offset
オフセット
lastn
最新から取得記事数
category / categpries
カテゴリー
tag / tags
タグ
current_timestamp / current_timestamp_end
公開日時
author
投稿者
sort_by / sort_order
表示順

記事以外を取得

fetch_entriesでは記事情報を取得しますが、その他の情報を取得する関数も用意されています。

fetch_blogs / fetch_blog
ブログ
fetch_pages / fetch_page
ページ
fetch_categories / fetch_category
カテゴリー

まだ他にもあるかと思いますが、代表的なものだけ。

参考