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'}; } }
お役に立ちましたでしょうか?
2011-12-29