PHPでMovableType5のデータベースにアクセスする方法
MovableType5は非常に便利なCMSですが、MovableTypeと自分で作成したPHPプログラムを連携させようとすると、途端にネット上に情報が少なくなってしまいます。
今回はそんなあなたのために、MovableTypeにあるPHPのクラスと連携してデータベース内のエントリー情報を取得するサンプルをご紹介しましょう。
目次
- 準備:MTクラスを読み込んでインスタンスを取得しよう
- $mtからデータベース操作用インスタンスを取得
- エントリーを取得する
- エントリーリスト(mtentries)も取得してみる
- カテゴリーを取得する
- カテゴリーリストを取得する
準備:MTクラスを読み込んでインスタンスを取得しよう
MovableTypeにはPHP用にMTクラスが用意されていて、これを使うと他のPHPプログラムでMovableTypeのデータが利用できます。
MovableTypeインストール先のパスを仮に「/path/to/mt 」とすると、以下のようにして任意のPHPスクリプトファイルの中でMTクラスをインクルードし、インスタンスを取得することができます。
この時、作成したブログのID(管理画面でブログを選択した場合のURLで「blog_id=…」となっている番号)と「mt-config.cgi」のパスが引数に必要になるので事前に調べておきましょう。
//定数の定義 <?php define('DIR_MT', '/path/to/mt'); define('MY_BLOGID', 1); include_once(DIR_MT.'/php/mt.php'); $mt = MT::get_instance(MY_BLOGID, DIR_MT.'/mt-config.cgi');
$mtからデータベース操作用インスタンスを取得
$mtを取得後、db()メソッドを使ってデータベース操作用のインスタンスを取得します。
$db = $mt->db();
ちなみに、この$dbは何のインスタンスかというと、データベースの種類によって異なります。 基本は「mbdb.base.php」に定義されている「MTDatabaseクラス」なんですが、これは抽象クラスとして定義されていて、実体は以下のようにMTDatabaseクラスを継承したクラスがインスタンス化されます。
データベース名 | 担当クラス名 | ファイル名 |
---|---|---|
MySQL | MTDatabasemysql | mtdb.mysql.php |
PostgreSQL | MTDatabasepostgres | mtdb.postgres.php |
SQLite | MTDatabasesqlite | mtdb.sqlite.php |
でも、これを特に意識しなくても良いようにインスタンスメソッド等は統一されているので、どのデータベースでも共通のものを利用できるようになっています。 便利!
【注意】 ただ1点、mtdb.base.php の中に誤りがあって、そこを修正しないとエントリー等の取得が失敗するようになっています。 そこで、mtdb.base.php を開いてfetch_entries()メソッドが定義されている箇所を以下のように修正してください。
public function fetch_entries($args, &$total_count = NULL) { require_once('class.mt_entry.php'); require_once("MTUtil.php"); //この行を追加 ...
具体的には、エントリーを取得しようとすると「Fatal error: Call to undefined function _strip_index() in …/mtdb.base.php on line 2358」というようなエラーが表示されます
エントリーを取得する
では、$dbを使ってエントリーを取得します。
取得するためのメソッドは「fetch_entry()」です。
$myEntryId = 1; $entry = $db->fetch_entry($myEntryId); //ブログIDとエントリーIDを取得(メタ情報) $blog_id = $entry->{'blog_id'}; $entry_id = $entry->{'id'}; //タイトルと本文を取得(テンプレートタグの'mtentry'を省いた部分を指定します) $title = $entry->{'title'}; $body = $entry->{'body'}; //カスタムフィールドデータ(ベースネーム:mycustomfield1)を取得 $mycustomfield1 = $entry->{'entry_field.mycustomfield1'};
こんな感じでエントリーのデータが取得できます。
エントリーリスト(mtentries)も取得してみる
エントリーリストは$db->fetch_entries() で取得できます。 このメソッドには<mt:entries>と同じように多くのパラメーターが利用可能です。
$args = array( 'blog_id'=> MY_BLOGID, 'lastn'=>10, 'sort_by'=>'modified_on', 'sort_order'=>'ascend' ); $entries = $db->fetch_entries($args); foreach ($entries as $entry) { $title = $entry->{'title'}; ... }
カテゴリーを取得する
カテゴリーの取得には「$db->get_category($category_id)」を利用します。 事前にカテゴリーIDがわかっている場合に使える命令ですね。 分からない場合はカテゴリーリストを取得した後にIDを確認しましょう。
$category_id = 1; //カテゴリーID=1 $category = $db->get_category($category_id); //各種データを取り出し(テンプレートタグの'mtcategory'を省いた部分を指定します) $label = $category->{'label'}; //表示されるラベル $basename = $category->{'basename'}; //ベースネーム $parent = $category->{'parent'}; //親カテゴリーのID。 メインカテゴリーの場合は0
カテゴリーリストを取得する
カテゴリーリストを取得するには「$db->get_categories()」を使いますが、これも「get_entries()」と同じように「mtdb.base.php」ファイルの該当箇所を以下のように変更する必要があります。
public function &fetch_categories($args) { require_once("MTUtil.php"); //この行を追加
引数にはブログIDなどを指定しますが、「show_empty」を1にセットしておかないと、エントリーが属さないカテゴリーオブジェクトが無視されてしまうので、全て取得したい場合は指定するようにしましょう。
//blog_id=1のブログ内の全てのカテゴリーオブジェクトリストを取得する $args = array(); $args["blog_ids"] = 1; $args["show_empty"] = 1; $categories = $db->fetch_categories($args); foreach($categories as $category) { $id = $category->{'id'}; $label = $category->{'label'}; ... }
これらの$dbに備わっている命令や、クラスの内容を理解したい場合はこちらも参考にしてみてください。
2011-11-11