Codeworks Notes

 2024-07-10

Wordpress
バックエンド

配列の入ったカスタムフィールドから記事を抽出する

概要

カスタムフィールドにチェックボックスの値を送ると配列として記録されるんですが、サブループで抽出するときにどうやってその配列の中の任意の値で絞り込むのか、というところが高度すぎて調べても全然出てこないのでまとめるなどする。

基本的なおはなし

ループ条件のおさらいです。
そんなもん知ってるよ、って人は次項まで飛ばし読みすりゃいい。

さて、get_posts とかでサブループを作って記事抽出するときにカスタムフィールドの値を条件にすることができます。

$args =get_posts( [
  'post_type' => 'any_post_type',
  'meta_key' => 'custom_key',
  'posts_per_page' => -1,
  'orderby' => 'date',
  'order' => 'ASC'
]);
global $post;
if($args): foreach($args as $post): setup_postdata($post); ?>

こんなかんじっすね。

カスタムフィールドの値を示しているのはこの部分。

// カスタムフィールドの値を条件にする
[ 'meta_key' => 'custom_key' ]

以前の「サブループにカスタムフィールドの比較条件を加える」の記事でも触れた通り、条件が複数あったり比較が必要なときには meta_key ではなく meta_query を使います。

// カスタムフィールドの値を基に複数条件で絞る
'meta_query' =>	[
	'relation' => 'AND',
  [
    'key' => 'custom_key',
    'value' => "value1"
  ],
  [
    'key' => 'custom_key',
    'value' => "value2",
    'compare' => '=',
    'type' => 'CHAR'
  ],
]

値が等しいのか、大小で決めるのか、という比較方法は 'compare' で決められます。
文字列や日付などのデータ型は 'type' で指定可能です。

本題

配列が入ってる場合どうやるのって話。
まずダメな例。

'meta_query' =>	[
  [
    'key' => 'custom_key',
    'value' => array($value),
  ]
]

ついやっちゃいたくなると思うんですがコレでは出ません。
正解はこっち。

'meta_query' =>	[
  [
    'key' => 'custom_key',
    'value' => "value1",
    'compare' => 'LIKE',
    'type' => 'CHAR'
  ]
]

解説

カスタムフィールドに格納された配列は記事検索の際にシリアライズされた値を文字列として扱われます。
こういうことね。

// 例えば post_custom('key') = ['hoge','fuga'] だった場合

// 値の取得
$value = post_custom('key');

// シリアライズされていない値
echo $value;

/* 
【出力結果】
  ['hoge','fuga']
*/

// シリアライズされた値
echo serialize($value);

/* 
【出力結果】
  a:2:{i:0;s:4:"hoge";i:1;s:4:"fuga";}
*/  

配列も文字列化されているので、検索値に配列を入れたところでマッチしないということになります。シリアライズされた値に対して文字列検索をかけることで、「配列のどこかにある任意の値を含むモノ」を条件に記事抽出できるようになります。