【WordPress】複数検索結果を基に投稿の表示を行う方法

searchform.phpで複合検索を行い、search.phpで表示を行う流れのお話です。

検索情報は各投稿記事のカスタムフィールド値という前提で考えることとします。

searchform.phpについて

searchform.phpの検索フォームはこんなイメージです。

<form method="get" action="<?php esc_url( home_url( '/' ) );?>">
	<input name = "s" type = "text">
	<select name = "select-1">...</select>
	<select name = "price-row">...</select>
	<select name = "price-high">...</select>
</form>

1行目:テキストタイプの検索フォーム

2行目:選択タイプの検索フォーム1

3~4行目:選択タイプの検索フォーム2(価格帯を設定して、price-low~price-highに属する価格を取得する)

2行目から4行目の情報が各記事のカスタムフィールド値として設定されている状態と仮定します。

search.phpについて

search.phpでは、searchform.phpで設定された検索値を基に、記事の一覧を表示します。

流れは以下のイメージです。

  1. searchform.phpでGET送信された値を取得
  2. get_posts()の引数に1の情報を設定して、検索に引っかかった投稿を取得する。

2の後はループを使って投稿を表示する流れになるかと思いますが、今回は上記の流れに焦点を当てて進めていきます。

検索に引っかかった投稿を取得するまでのコードは以下の通りです。

<?php
$s = $_GET[ 's' ];
$select_1 = $_GET[ 'select-1' ];
$price_low = $_GET[ 'price-low' ];
$price_high = $_GET[ 'price-high' ];
//meta_query用
$custom_1[] = array(
	'key'=> 'custom-select1',//カスタムフィールド名
	'value'=> $select-1,//検索値
);
$custom_2[] = array(
	'key'=> 'custom-price',//カスタムフィールド名
	'value'=> array( $price_low, $price_high ),//検索値
	'compare'=> 'BETWEEN',
	'type'=> 'NUMERIC',
);
//検索結果を取得
$args = array(
		'post_type' => 'post_menu',
		'meta_query' => array( $custom_1 , $custom_2 ),
		's' => $s,
		'paged' => get_query_var('paged');
);
	
$search_posts = get_posts( $args );

20行目の’meta_query’ => array( $custom_1 , $custom_2 )で二次元配列を設定し、複合検索を行えるようにします。

最後の$search_posts = get_posts( $args );で記事情報を取得します。