[WordPress]post_metaに保存した投稿IDの配列をフックに、get_posts()で投稿を取得する方法

WordPressで複数のカスタム投稿タイプを使っているサイトで、

カスタム投稿タイプAとカスタム投稿タイプBの投稿を紐付けたい。

となった場合に、僕の場合は、post_meta に投稿IDを配列で保持させていた。

例としては下記のように、カスタム投稿タイプとして分類をわけないと、一覧で表示されると違和感が出るけれど、どちらにも投稿レベルで管理したいケース。

  • 車(car)
  • 車のパーツ(car-parts)

これに、例えば以下のような投稿が紐付いているとする

  • 車→【 suv(1) , minivan(8) , sedan(229) 】
  • 車のパーツ→【 wheel-suv(381) , suspension-suv(493) , muffler-suv(527) , ………】
    ※ ()内は post_id
    ※ 車のパーツは以降も [パーツ名-車種]という命名規則でたくさん存在する

 

上記の状態で、例えばsuvのページで suv用の wheel, suspension , muffler などを呼び出したいとする。

その場合、suvの編集画面に post_meta で”関連パーツ(related-parts)”のような名称のフィールドを作成し、” 381 , 493 , 527 ” というように 配列でデータをもたせる。

 

その時に single-suv.php での呼び出しとしては、以下を使う

$car_parts = get_posts(array(
'post_type' => 'car-parts',
'post_status' => 'publish',
'posts_per_page' => -1,
' meta_query' => array(
array(
'key' => 'related-parts',
'value' => '[^0-9],?"'.$post->ID.'",?[^0-9]',
'compare' => 'REGEXP'
)
)
));

foreach( $car_parts as $car_part ){
// ここにループ処理を書く
}

WordPressの場合、配列はMySQLに保存される時にシリアル化されるため、正規表現の記述の仕方に気をつける必要がある。

きっともっと良い書き方があると思うので、良い方法をご存知の方は教えてほしい。

コメントを残す

メールアドレスが公開されることはありません。

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください