「WordPressで学ぶPHP(3)関数編」を発売しました。
本書は「WordPressで学ぶPHP(1)変数・制御構造編」「WordPressで学ぶPHP(2)データ構造(配列・オブジェクト)編」の続編にあたり、PHP組み込みの関数や、独自の関数を作る方法などを解説します。
Kindle本で、定価400円です。
MT5のPHP APIを探る(その2)
昨日に続いて、MT5のPHP APIを探ってみます。
今日は、複雑な条件を指定してオブジェクトを読み込む方法を紹介します。
1.ダミーのオブジェクトの作成
複雑な条件を指定してオブジェクトを読み込む場合、まずダミーのオブジェクトを作成して、そのオブジェクトに対してFindメソッドを実行します。
例えば、ブログ記事を読み込みたい場合、まずブログ記事のクラス(Entry)のダミーのオブジェクトを作成します。
また、ブログ記事のクラスはMTのディレクトリ→「php」ディレクトリ→「lib」ディレクトリにある「class.mt_entry.php」で定義されていますので、このクラスのファイルも読み込みます。
例えば、ダミーのブログ記事を変数$_entryに割り当てるには、以下のように書きます。
require_once('lib/class.mt_entry.php');
$_entry = new Entry;
2.検索の条件と並び順の指定
Findメソッドの1つ目のパラメータでは、検索の条件と、オブジェクトの並び順を、SQLで記述します。
例えば、以下のような条件と並び順でブログ記事を読み込みたいとします。
- IDが2番のブログから、IDが3番のカテゴリの記事を読み込む
- 公開されている記事を読み込む(entry_status列の値が2)
- 日付の新しい順に並べ替える
検索の条件と並び順を変数$whereOrderByに代入するとすると、以下のように書くことができます。
$whereOrderBy = <<< HERE entry_blog_id = 2 and entry_status = 2 and placement_category_id = 3 order by entry_authored_on desc HERE;
3.結合の指定
テーブル間の結合(join)は、連想配列を使って指定します。
結合の条件は、連想配列の「join」という名前の要素に入れます。
join要素に入れる値も連想配列で、以下のように書きます。
array(
'テーブル名' => array(
'condition' => '結合の条件を表すSQL'
)
)
例えば、カテゴリを指定してブログ記事を読み込みたいとします。
この場合、ブログ記事のテーブルに、「mt_placement」というテーブルを結合し、mt_placementテーブルの「placement_entry_id」列とブログ記事のテーブルの「entry_id」列が等しい、という条件を指定します。
結合の条件を$extrasという連想配列に入れるとすると、以下のように書きます。
$extras['join'] = array(
'mt_placement' => array(
'condition' => 'placement_entry_id = entry_id'
)
);
4.limit/offsetの指定
読み込むオブジェクトの件数(limit)/読み込み開始位置(offset)も、結合の条件と同じ連想配列に指定します。
例えば、前述の$extras連想配列に、「読み込む記事の件数を10件にする」という条件を追加するには、以下のように書きます。
$extras['limit'] = 10;
また、先頭から5件のブログ記事をスキップしてその次から読み込むには、以下のように書きます。
$extras['offset'] = 5;
5.オブジェクトの読み込み
次に、手順1で作ったダミーオブジェクトを使って、Findメソッドを実行します。
ダミーオブジェクト->Find(検索と並べ替えの条件, false, false, 結合/limit/offset);
Findメソッドの戻り値は、読み込んだオブジェクトの配列になります。
6.例
以下のような条件でブログ記事を読み込み、それらのタイトルを一覧表示したいとします。
- IDが2番のブログから、IDが3番のカテゴリの記事を読み込む
- 公開されている記事を読み込む
- 日付の新しい順に並べ替える
- 最近の10件を読み込む
このプログラムは以下のようになります。
<?php
set_include_path(get_include_path() . PATH_SEPARATOR . '/path/to/MT_DIR/php');
require_once('mt.php');
$cfg_file = 'mt-config.cgi';
$mt = MT::get_instance(null, $cfg_file);
require_once('lib/class.mt_entry.php');
$_entry = new Entry;
$whereOrderBy = <<< HERE
entry_blog_id = 2
and entry_status = 2
and placement_category_id = 3
order by entry_authored_on desc
HERE;
$extras['join'] = array(
'mt_placement' => array(
'condition' => 'placement_entry_id = entry_id'
)
);
$extras['limit'] = 10;
$entries = $_entry->Find($whereOrderBy, false, false, $extras);
foreach ($entries as $entry) {
print $entry->title . "\n";
}
?>
