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回になる