get_post_customを使ってデータベース検索数を抑える方法

WordPressで、特定の投稿のidからその投稿に紐づくカスタムフィールドを取得したいときがあります。

get_post_metaという関数は投稿のidとカスタムフィールド名を指定すると、その値を取得することの出来る便利な関数です。

ただ、一つのカスタムフィールドを取得するならデータベース検索は少なくて済みますが、復数の取得がさらにfor文の中に入っていたりするとデータベース検索数はどんどん増えていきます。

$post_infos = array();
foreach($post_ids as $post_id){
  $post_info['ID'] = $post_id;
  $post_info['aaa'] = get_post_meta($post_id, 'aaa', true);
  $post_info['bbb'] = get_post_meta($post_id, 'bbb', true);
  $post_info['ccc'] = get_post_meta($post_id, 'ccc', true);
  $post_info['ddd'] = get_post_meta($post_id, 'ddd', true);
  $post_infos[] = $post_info;
}

上のようなコードは、復数のget_post_metaをget_post_customにまとめてしまえば、検索数は一回に抑えることが出来ます。

下がその例です。

$post_infos = array();
foreach($post_ids as $post_id){
  $post_info['ID'] = $post_id;
  $post_customfields = get_post_custom($post_id);
  $post_info['aaa'] = $post_customfields['aaa'][0];
  $post_info['aaa'] = $post_customfields['bbb'][0];
  $post_info['aaa'] = $post_customfields['ccc'][0];
  $post_info['aaa'] = $post_customfields['ddd'][0];
  $post_infos[] = $post_info;
}

このように変更することで、一つの投稿における検索数を一回に抑えることができます。

また、$post_customfields[‘aaa’][0]というように最後に[0]がついているのは、get_post_customで取得した配列が下のような形式になっているからです。

$post_customfields = array(
  'aaa' => array(
    '0'=> 'hogehoge'
  ),
  'bbb' => array(
    '0'=> 'hogehoge'
  ),
  'ccc' => array(
    '0'=> 'hogehoge'
  ),
  'ddd' => array(
    '0'=> 'hogehoge'
  )
);