wordpress-1530617_1280

WordPressのキーワード検索は通常、投稿や固定ページの「タイトル」と「コンテンツ(本文)」を検索対象とします。
タイトルまたはコンテンツに検索キーワードを含む投稿や固定ページを検索結果一覧に表示します。

表題のように、検索対象にカスタムタクソノミーを含める場合、カスタマイズが必要です。
今回は、検索機能そのものをカスタマイズする方法ではなく、オリジナルで検索ページ(検索バー)と検索結果ページを作成する方法を紹介します。

まずはWordPressで検索バーをオリジナルで作成

ある固定ページにオリジナルの検索バーを設置し、ある固定ページで検索結果を表示します。
ここで検索バーを設置するページを「検索ページ」、検索結果を表示するページを「結果ページ」とします。

検索ページに検索バーを設置するコードは以下の通り。

<form method="post" action="結果ページのURL">
	<input type="text" name="keyword" placeholder="キーワードを入力">
	<input type="submit" value="検索">
</form>

するとこんな感じの検索バーが表示されます。

これを受けて結果ページで検索結果を表示するコードは以下の通り。

<?php
/* タイプ「投稿」で検索キーワードを指定 */
$query = array(
	'post_type' => "post",
	's' => $_POST["keyword"]
);

$the_query = new WP_Query($query);

while($the_query->have_posts()):
$the_query->the_post();
?>
	<a href="<?php the_permalink(); ?>"><?php the_title(); ?></a>
<?php
endwhile;
wp_reset_postdata();
?>

上記では検索キーワードを「タイトル」または「コンテンツ」に含む投稿が表示されます。
これはWordPressの通常の検索機能と同様の仕様ですのでわざわざオリジナルで作る必要はありません。

カスタムタクソノミーも対象とするキーワードのOR検索

本題はここからです。
投稿の「タイトル」「コンテンツ」のみでなく「カスタムタクソノミー」も検索対象に含める場合、下記のカスタマイズが必要です。
検索バーはそのまま。変更するのは結果ページの、検索機能の条件部分です。
(カスタムタクソノミーは例として「size」「color」とします。)

<?php
/* 通常のキーワード検索用条件 */
$q1 = array(
	'post_type' => "post",
	's' => $_POST["keyword"]
);

/* カスタムタクソノミーのキーワード検索用条件 */
$q2 = array(
	'post_type' => "post",
	'tax_query' => array(
		'relation' => 'OR',
		array(
			'taxonomy' => 'size',
			'field'    => 'name',
			'terms'    => $_POST["keyword"],
		),
		array(
			'taxonomy' => 'color',
			'field'    => 'name',
			'terms'    => $_POST["keyword"],
		),
	),
);

/* 今回のカスタマイズのミソ! */
$the_query = new WP_Query();
$q1 = new WP_Query($q1);
$q2 = new WP_Query($q2);
$the_query->posts = array_unique( array_merge( $q1->posts, $q2->posts ), SORT_REGULAR );
$the_query->post_count = count( $the_query->posts );

while($the_query->have_posts()):
$the_query->the_post();
?>
	<a href="<?php the_permalink(); ?>"><?php the_title(); ?></a>
<?php
endwhile;
wp_reset_postdata();
?>

何をやっているかというと、通常の検索($q1)とカスタムタクソノミーの検索($q2)をそれぞれ別々に行い、結果を統合し一覧として表示しています。
そんなことしなくても検索用条件で両方指定すればいいじゃん!と思うかもしれませんがそれではうまくいきませんでした。

【悪い例】

<?php
/* タイプ「投稿」で検索キーワードを指定 */
$query = array(
	'post_type' => "post",
	's' => $_POST["keyword"],
	'tax_query' => array(
		'relation' => 'OR',
		array(
			'taxonomy' => 'size',
			'field'    => 'name',
			'terms'    => $_POST["keyword"],
		),
		array(
			'taxonomy' => 'color',
			'field'    => 'name',
			'terms'    => $_POST["keyword"],
		),
	),
);

$the_query = new WP_Query($query);
?>

この【悪い例】の方がすっきりしていてぱっと見いい感じなのですが、全然ダメダメです。
上記の方法ですと、検索キーワードが「タイトルまたはコンテンツに含まれ、さらに”size”または”color”に含まれる」投稿のみを表示します。
条件としては「((タイトル OR コンテンツ) AND (“size” OR “color”))」といった具合です。

おそらくこの記事を読んでいる皆様が実現したいのは、検索キーワードが「タイトルまたはコンテンツ、または”size”、”color”のいずれかに含まれる」投稿を表示。ではないでしょうか。
条件としては「(タイトル OR コンテンツ OR “size” OR “color”)」といった具合です。

上記カスタマイズでは、一つの検索バーで「タイトル、コンテンツ、”size”、”color”」を対象としたキーワード検索が実装可能です。

少々わかりにくいですが、他のやり方としてSQLを作成する方法等がありましたが、比較的上記の方がわかりやすいので今回ご紹介しました。