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

mt-search-php.png

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'};
}
}

お役に立ちましたでしょうか?

このページをシェアする

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

2011-12-29