MT5のPHP APIを探る(その3)

「MT5のPHP APIを探る」の第3回をお送りします。
今回は、カスタムフィールドのデータを扱う方法を紹介します。

1.カスタムフィールドの値を読む

Entryクラスのオブジェクトを読み込むと、カスタムフィールドの情報も読み込まれます。
各カスタムフィールドの値は、「オブジェクト->{'entry_field.ベースネーム'}」のように表します。

例えば、「text_field」というベースネームをつけたカスタムフィールドがあるとします。
また、ブログ記事のオブジェクトを$entryという変数に割り当てたとします。
この場合、このカスタムフィールドの値は、「$entry->{'entry_field.text_field'}」で参照することができます。

2.カスタムフィールドの値で条件を指定する

カスタムフィールドの値で条件を指定する場合、以下のように結合と条件設定を行います。

  • mt_entryテーブルとmt_entry_metaテーブルとを、entry_idフィールドとentry_meta_entry_idフィールドが等しいという条件で結合します。
  • entry_meta_typeフィールドの値が、「field.ベースネーム」に等しい、という条件を指定します。
  • entry_meta_XXXフィールドの値が、カスタムフィールドの値になりますので、その値に条件を指定します。

なお、「entry_meta_XXX」の「XXX」の部分は、カスタムフィールドの種類に応じて以下のようになります。

種類型名
テキスト/URL/ドロップダウン/ラジオボタンvchar_idx
テキスト(複数行)/埋め込みオブジェクト/アイテム/オーディオ/ビデオ/画像vclob
チェックボックス/整数(※)vinteger_idx
浮動小数点数(※)vfloat_idx
日付と時刻vdatetime_idx

なお、整数型と浮動小数点型のカスタムフィールドは、拙作の「数値型のカスタムフィールドを追加するプラグイン」で作ることができます。

3.事例

以下のような状況になっているとします。

  • ブログのIDは2番です。
  • 「int_field」というベースネームを付けた整数型のカスタムフィールドがあります。

ここで、このブログから、以下のようにブログ記事を読み込みたいとします。

  • 上記のカスタムフィールドの値が1~5になっているブログ記事を読み込みます。
  • 公開されている記事だけ読み込みます。
  • カスタムフィールドの値の小さい順に並べ替えます。

この処理を書くと、以下のようになります。

<?php
set_include_path(get_include_path() . PATH_SEPARATOR . '/path/to/mt5/php');
require_once('mt.php');
$cfg_file = 'mt-config.cgi';
$mt = MT::get_instance(null, $cfg_file);

$extras['join'] = array(
    'mt_entry_meta' => array(
        'condition' => 'entry_meta_entry_id = entry_id'
    ),
);
$where = <<< HERE
entry_blog_id = 2
and entry_status = 2
and entry_meta_type = 'field.int_field'
and entry_meta_vinteger_idx between 1 and 5
order by entry_meta_vinteger_idx
HERE;
require_once('lib/class.mt_entry.php');
$_entry = new Entry;
$entries = $_entry->Find($where, false, false, $extras);
foreach ($entries as $entry) {
    print('title = ' . $entry->title);
    print(', int = ' . $entry->{'entry_field.int_field'} . "\n");
}
?>

7~11行目で、ブログ記事(mt_entry)とカスタムフィールド(mt_entry_meta)のテーブルを結合しています。
15行目と16行目で、int_fieldカスタムフィールドの値が1~5という条件を指定しています。
そして、17行目で、int_fieldカスタムフィールドの値で並べ替えるようにしています。

22~25行目で、各ブログ記事のタイトルと、int_fieldカスタムフィールドの値を順に出力します。
int_fieldカスタムフィールドの値で並べ替えを行ったので、その小さい順に出力ます。