post_metaを上手に使う(少しでも検索を早くする)

説明

WordPressのDB構成を意識したことはありますか?

プラグインや自作カスタマイズが増え、だんだんとwordpressが遅くなっている気がする。そんなことはないですか?(実際にそうなりました)
そのひとつの要因に、post_metaレコードの使いすぎがあります。このpost_metaは便利なのですが、レコードの構成は以下のようになっていて、複数のカラムを持つことはできません。

meta_id, post_id, meta_key, meta_value

meta_id:primaryキーで自動
post_id:記事id
meta_key:カラム名
meta_value:値

記事idに対して、「キー名」と「値」という構成(まぁ当たり前だ)。

たとえば、カスタムフィールドもこのpost_metaを使っていて、管理画面で、”名前”とあるのが、meta_keyで、”値”がmete_valueに相当する。

たとえば、記事毎に、URL、タイトル、番号、日付という構成を持ちたい場合はどうするか。

post_id=345と、meta_key=”url”と、meta_value=”http://xxxxxx”
post_id=345と、meta_key=”title”と、meta_value=”タイトル”
post_id=345と、meta_key=”number”と、meta_value=”3″
post_id=345と、meta_key=”date”と、meta_value=”2015/05/09″

と、4レコード必要となり計4回も呼び出すことになるため検索処理は当然遅くなる。
Wordpressの場合、データベースへの負担が大きいので、できるだけ負荷は上げたくないものだ。
そこで、データ構成を工夫し、検索数を減らす。

meta_valueの中に、データをカンマ区切りでまとめて入れる。

post_id=345
meta_key=”適当に名前”
meta_value=”http://xxxxxx,タイトル,3,2015/05/09″

取り出すときの参考例で、こうすれば、カンマ区切りを配列に変換できる

// 読み込み処理
$適当な配列名 = get_post_meta(記事id, ‘適当なキー名’, true);
// 配列に変換
$取り出した配列名 =explode( ‘,’ ,$適当な配列名);

$URL = $取り出した配列名[0]; // URL
$title = $取り出した配列名[1]; // タイトル
$num = $取り出した配列名[2]; // 番号
$date = $取り出した配列名[3]; // 日付

// 書き込み処理
$適当な配列名 = “http://xxxxxx,タイトル,3,2015/05/09″;
update_post_meta(記事id, ‘適当なキー名’, $適当な配列名);

こうすれば、呼び出しは4回→1回になる