PHPでMovableTypeのエントリーDBをSQL検索する方法

PHPでMovableTypeのDBを操作する事に抵抗を感じる人もいそうですが、やってみると以外と簡単です。 今回はエントリーをタイトルのキーワードで検索する方法をご紹介しましょう。
例:タイトルが「りんご」のエントリーを検索
$mt = MT::get_instance();
$db = $mt->db()->db();
require_once("class.mt_entry.php");
$where = "entry_title = 'りんご'";
$_entry = new Entry;
$entries = $_entry->Find($where);
$entry = $entries[0];
print($entry->{'title'});
ポイントは2行目の$dbを取得しているところなのですが、ここはデータベースの種類を問わず同じSQL文で検索できるためのインターフェースであるADOdbインスタンスを取得しています。
ADOdbインスタンスのFind()メソッドの第一引数には$where句を設定することができるので、エントリーが格納されている「mt_entry」データベースの「entry_title」フィールドにSQL文で検索をかけます。
なぜMTDatabaseインスタンスではダメなのか?
ダイレクトで特定のエントリーを取得する方法としては、$mt->db()メソッドでMTDatabaseインスタンスを取得してfetch_entry()メソッドを利用することもできるのですが、この方法だとエントリーID指定はできるのですが、タイトルで検索することができません。
また、MTDatabaseインスタンスにはfetch_entries()メソッドでエントリーリストを検索する方法もあるのですが、これでもタイトル絞り込みについては複数のエントリーを沢山取得した後に行わないといけないので、余計な処理時間がかかってしまうのです。
エントリーデータ取得後の内容等の取得方法はこちらの記事を参照ください。
ブログIDを指定する場合は「entry_blog_id」も指定する
エントリーを検索する場合、エントリーデータベースはブログIDに関係なく同じテーブルに格納されていくので、厳密に指定する場合はブログIDも指定して検索しましょう。
$where = "entry_title = 'りんご' and entry_blog_id = 4";
部分一致で検索する
検索で部分一致を使いたい場合は「like」を使って次のように指定することができます。
$where = "entry_title like '%りんご%'";
カテゴリー情報はエントリーデータから取得可
取得したエントリーデータからはcategories()メソッドで所属するカテゴリーの情報を取得することができます。
...(前略)...
$entry = $entries[0];
$categories = $entry->categories();
//トップカテゴリのカテゴリー名を表示する
foreach($categories as $category) {
if ($category->{'parent'} == 0) {
print($category->{'label'};
}
}
お役に立ちましたでしょうか?
Auto Amazon Links: プロダクトが見つかりません。
2011-12-29