あくまで自分用の覚え書きなので文章とか適当です...

テキストフィールド + ラジオボタン / テキストフィールド + チェックボックス で絞り込み検索フォームを作成する手順です。

書籍をフリーワードとジャンルで検索する例です。カスタム投稿です。

  • カスタム投稿タイプ名: book
  • カスタムタクソノミー名: book_cat

検索フォームの作成には WP Query の tax_query を利用して実装します。

検索フォームに必要なテンプレートを作成する

テーマフォルダ内に searchform.php (検索フォーム)と search.php (検索結果の表示)の2つのテンプレートを作成します。

テキストフィールド + ラジオボタンの場合

準備中…(すみません…)

ラジオボタンは選択解除ができないため、下の「テキストフィールド + チェックボックス」をおすすめします。

1つだけ選択させる場合はチェックボックスの見た目をCSSでラジオボタンのように編集し、jQueryなどで制御するのが良いかもしれません。

テキストフィールド + チェックボックスの場合

チェックボックスは複数選択ができるため name 属性の値の末尾に [] を追加して値を2次元配列として格納する必要があるため、ラジオボタンに比べて若干ややこしいです。

searchform.php

投稿タイプの絞り込みはform内に下記を記述するのでもOKかも(検証中)
<input type=”hidden” name=”post_type” value=”post”>

<?php
/**
 * 検索フォーム
 */
?>
<form role="search" method="get" action="<?php echo esc_url( home_url( '/' ) ); ?>book/">
<h3>本検索</h3>
<p>フリーワード</p>
<input type="text" value="<?php echo get_search_query(); ?>" name="s" placeholder="キーワードを入力してください">
<p>カテゴリー</p>
<?php
	$book_cats = get_terms(
		'book_cat',
		array(
			'orderby'    => 'name',
			'order'      => 'ASC',
			'hide_empty' => false,
		)
	);
	foreach ( $book_cats as $book_cat ) {
		echo '<label><input ';
		echo isset( $_GET['book_cat'] ) && in_array( $book_cat->slug, (array) $_GET['book_cat'] ) ? 'checked ' : '';
		echo 'type="checkbox" name="book_cat[]" value="' . esc_attr( $book_cat->slug ) . '">';
		echo esc_html( $book_cat->name );
		echo '</label>';
	}
	?>
	<button type="submit">検索</button>
</form>

search.php

<?php
/**
 * 検索結果
 */
?>
<?php get_header(); ?>
<?php if ( empty( $_GET['s'] ) && empty( $_GET['book_cat'] ) ) : ?>
	<p>検索条件を入力してください。</p>
	<?php get_search_form(); ?>
<?php else : ?>
	<h2 class="c-heading-h1">検索結果</h2>
	<?php
	$text     = sanitize_text_field( wp_unslash( $_GET['s'] ) );
	$taxquery = array();

	if ( $text ) {
		echo '<p>フリーワード:' . esc_html( $text ) . '</p>';
	}

	if ( ! empty( $_GET['book_cat'] ) ) {
		$book_cats = wp_unslash( $_GET['book_cat'] );
		$taxquery  = array(
			array(
				'taxonomy' => 'book_cat',
				'field'    => 'slug',
				'terms'    => $book_cats,
				'operator' => 'IN',
			),
		);

		echo '<p>本カテゴリー : ';
		foreach ( $book_cats as $book_cat ) {
			$term_obj = get_term_by( 'slug', $book_cat, 'book_cat' );
			echo esc_html( $term_obj->name );
			if ( end( $book_cats ) !== $book_cat ) {
				echo ', ';
			}
		}
		echo '</p>';
	}

	$search_query = new WP_Query(
		array(
			'post_type' => 'book',
			'tax_query' => $taxquery,
			'relation'  => 'AND',
			's'         => $text,
			'posts_per_page' => -1, //全件表示
		)
	);
	if ( $search_query->have_posts() ) :
		?>
	<ul>
		<?php
		while ( $search_query->have_posts() ) :
			$search_query->the_post();
			?>
			<li><a href="<?php the_permalink(); ?>"><?php the_title(); ?></a></li>
		<?php endwhile; ?>
	</ul>
	<?php else : ?>
	<p>表示する本が見つかりませんでした。条件を変更して検索してください。</p>
	<?php endif; ?>
	<?php get_search_form(); ?>
<?php endif; ?>
<?php wp_reset_postdata(); ?>
<?php
get_footer();

検索フォームを表示する

検索フォームを設置したい場所に下記を記述してください。

<?php get_search_form(); ?>

オマケ:カテゴリー(カスタムタクソノミー)名をテキストフィールドでも検索可能にするには

WordPress のデフォルトではカテゴリーの文字列は検索対象になりません。ユーザーがテキストフィールドにカテゴリー名を入力した場合にヒットさせるには「WP Extended Search」プラグインをインストールすると手っ取り早いです。プラグイン無しと言っておきながらここだけ使っちゃいますが…

スポンサーリンク

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です