「WordPressで学ぶPHP(2)データ構造(配列・オブジェクト)編」を発売しました。
本書は「WordPressで学ぶPHP(1)変数・制御構造編」の続編にあたり、PHPの「データ構造」(配列とオブジェクト)について解説します。
配列やオブジェクトは、頭の中で考えるだけでは、イメージがつかみにくいです。本書では図を多用して、配列やオブジェクトをなるべく分かりやすく解説することを心がけました。
Kindle本で、定価250円です。
MT5のPHP APIを探る(その1)
Movable Type 3.1以降には、PHPで動的にページを生成する「ダイナミックパブリッシング」の機能があります。
そして、Movable Type 5で、PHPのAPIが一新され、従来より使い勝手が良くなりました。
ダイナミックパブリッシングで使うのが本来の用途ですが、一般のPHPのプログラムでMTのデータを操作することもできます。
そこで、Movable Type 5のPHPのAPIを探ってみたいと思います。
1.MTのオブジェクトの生成
MTのデータを操作するには、まずMT全体を表すオブジェクトを生成します。
これは、MTクラスの「get_instance」というメソッドで行うことができます。
$mt = MT::get_instance(ブログID, 設定ファイル名);
「ブログID」には、ブログ/ウェブサイトのIDを渡します。
「null」を渡して、IDを省略することもできます。
また、「設定ファイル名」には、通常は「mt-config.cgi」を渡します。
また、MTクラスは、MTのディレクトリ→「php」ディレクトリにある「mt.php」で定義されています。
そこで、get_instanceメソッドを実行する前に、mt.phpを読み込んでおきます。
ここまでの話に沿って、MTのオブジェクトを生成する処理を書くと、以下のようになります。
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);
2.データを読み込む
MTのオブジェクトに対して「db」というメソッドを実行すると、データベースアクセス用のオブジェクトを得ることができます。
また、dbオブジェクトに対して「fetch_XXX」メソッドを実行すると、ブログ記事等の各種のオブジェクトを読み込むことができます(「XXX」にはオブジェクト名が入ります)。
fetch_XXXメソッドには、パラメータとして、検索条件を表す配列を渡します。
例えば、MT内のウェブサイトをすべて読み込みたいとします。
ウェブサイトは「fetch_websites」メソッドで読み込むことができます。
このメソッドのパラメータに空の配列を渡すと、ウェブサイトをすべて読み込むことができます。
$db = $mt->db(); $websites = $db->fetch_websites(array());
3.オブジェクトを操作する
各クラスのオブジェクトには、プロパティとメソッドがあります。
プロパティで、オブジェクトの内容を調べることができます。
例えば、ウェブサイトのオブジェクトの「name」プロパティで、ウェブサイトの名前を得ることができます。
また、メソッドを実行することで、オブジェクトに関する各種の操作を行うことができます。
例えば、ウェブサイトのオブジェクトには、「blogs」というメソッドがあります。
このメソッドを実行すると、ウェブサイト配下のすべてのブログを読み込むことができます。
ここまでの話に沿って、すべてのウェブサイトと、その配下のブログの名前を出力するプログラムを作ると、以下のリストのようになります。
まず、8行目のfetch_websitesメソッドで、すべてのウェブサイトを読み込みます。
そして、10行目のforeach文で繰り返しを行い、各ウェブサイトを順に処理します。
11行目のprintで、ウェブサイトの名前(nameプロパティ)を出力します。
次に、13行目の文で、ウェブサイトのオブジェクトのblogsメソッドを実行し、ウェブサイト配下のブログをすべて読み込みます。
そして、14行目のforeach文で繰り返しを行って各ブログを順に処理し、15行目のprintでブログの名前(nameプロパティ)を出力します。
<?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); $db = $mt->db(); $websites = $db->fetch_websites(array()); print "<ul>\n"; foreach ($websites as $website) { print ' <li>' . $website->name . "\n"; print " <ul>\n"; $blogs = $website->blogs(); foreach ($blogs as $blog) { print ' <li>' . $blog->name . "</li>\n"; } print " </ul>\n </li>\n"; } print "</ul>\n"; ?>