WEBOPIXEL

WordPressでカテゴリー&タグを絞り込み検索をする

Posted: 2011.06.17 / Category: WordPress / Tag: 

Wordpressのブログ内検索はテキストフィールドに入力したテキストが検索されますが、ドロップダウンリストでカテゴリーやタグを選択して絞り込み検索ができる機能を追加してみます。

Sponsored Link

※Wordpress3を使用しています。

テキスト検索

まずは、普通のテキストのみの検索です。

wp template

 
	<div id="search">
	<form method="get" action="<?php bloginfo( 'url' ); ?>">
		<input name="s" id="s" type="text" />
		<input id="submit" type="submit" value="検索" />
	</form>
	</div>
	

これで「search.php」を作成して適当にループさせるだけで該当した記事が表示されますよね。

カテゴリーを絞り込み検索

カテゴリーをドロップダウンで表示して絞込み検索をできるようにします。
「●●カテゴリー」の「hoge」を検索といった感じですね。

wp template

 
	<div id="search">
	<form method="get" action="<?php bloginfo( 'url' ); ?>">
		<input name="s" id="s" type="text" />
		<?php wp_dropdown_categories('depth=0&orderby=name&hide_empty=1&show_option_all=カテゴリー選択'); ?>
		<input id="submit" type="submit" value="検索" />
	</form>
	</div>
	

テキストフィールドの後に「wp_dropdown_categories」を追加するだけです。

タグを絞り込み検索

さらにタグを絞り込み検索してみます。
方法は同じですが、タグにはカテゴリーのようなドロップダウンリストを作成する機能がないので、地味に表示します。

wp template

 
	<div id="search">
	<form method="get" action="<?php bloginfo( 'url' ); ?>">
		<p>検索</p>
		<input name="s" id="s" type="text" />
		<?php wp_dropdown_categories('depth=0&orderby=name&hide_empty=1&show_option_all=カテゴリー選択'); ?>
		<?php $tags = get_tags(); if ( $tags ) : ?>
			<select name='tag' id='tag'>
			<option value="" selected="selected">タグ選択</option>
			<?php foreach ( $tags as $tag ): ?>
			<option value="<?php echo esc_html( $tag->slug);  ?>"><?php echo esc_html( $tag->name ); ?></option>
			<?php endforeach; ?>
			</select>
		<?php endif; ?>
		<input id="submit" type="submit" value="検索" />
	</form>
	</div>
	

追加されたのは6~13行目ですね。
これでタグでの検索できるようになります。

参考サイト
WordPress Searching By Category
WordPress › フォーラム » タグクラウドをドロップダウンメニュー化したい

COMMENTS

sato 2012-05-29 10:13 

こんにちは、参考にさせてもらっております。
タグの検索については、チェックボックスで複数選択できるようにしたいのですが、可能でしょうか?

また、<?php wp_dropdown_categories(‘depth=0&orderby=name&hide_empty=1&show_option_all=カテゴリー選択’); ?>についてですが、特定のカテゴリをプルダウン上に表示しないように出来るでしょうか?

・料金別
・地域別

などのように、2つのプルダウンを表示させたいと思っています。
よろしければ、教えていただけないでしょうか?
お願いいたします。

sato 2012-05-29 13:23 

たびたび失礼します。

<?php wp_dropdown_categories(‘hide_empty=0&show_count=1&child_of=5&hierarchical=1&class=kenselect&show_option_all=地域を選択’);
wp_dropdown_categories(‘hide_empty=0&show_count=1&child_of=3&hierarchical=1&class=moneyselect&show_option_all=料金を指定’);?>
<?php $tags = get_tags(); if ( $tags ) : ?>
<select name=’tag’ id=’tag’>
<option value=”” selected=”selected”>タグ選択</option>
<?php foreach ( $tags as $tag ): ?>
<option value=”<?php echo esc_html( $tag->slug); ?>”><?php echo esc_html( $tag->name ); ?></option>
<?php endforeach; ?>
</select>
<?php endif; ?>

のコードをためさせていただいたのですが、タグとプルダウンのどちらか一方にマッチしているだけで、記事がヒットします。

例えば、「カテゴリ:関東」「タグ:人気スポット」がついて書いた「記事1」があったとします。
そして検索条件を「カテゴリ:東北」「タグ:人気スポット」に指定した後、検索をかけます(キーワードは空欄)
この場合、タグはマッチしていますが、カテゴリがマッチしていないので「記事1」をヒットさせたくないのですが、この点は改善できますでしょうか?

また、よろしければ教えていただけると助かります。

webOpixel 2012-05-31 11:50 

そのものずばりではありませんが下記記事は参考になりませんでしょうか。
http://www.webopixel.net/wordpress/584.html

sato 2012-05-31 19:54 

回答ありがとうございます。
教えていただいた記事のうち、and検索を実現するコードと固定ページを検索対象から除外するコードを、function.phpに入れてみました。

しかし、前者については、and検索が有効になりませんでした。また、アーカイブページにおいて、投稿が2重に表示される不具合が発生してしまいました。

後者については、固定ページが表示されない不具合が発生しました。
表示側と管理画面両方で、表示されなくなったので、検索から除外されているかの確認が出来ませんでした。

複数のカテゴリを指定してのAND検索が難しい場合、カスタムフィールドを使うべきでしょうか?

よろしければ教えてください。

webOpixel 2012-06-01 09:12 

and検索「複数のカテゴリーで検索したい」の部分ですよね?
エラーは表示されてませんか?
カテゴリー検索という部分に関しては動作していますか?

必要ないはずなんですが、一度下記を追加してみてください。
function get_custom_field_posts_group($group) {
if(isset($_REQUEST[‘cat’])) {
$group = ‘wp_posts.ID’;
}
return $group;
}
add_filter(‘posts_groupby’, ‘get_custom_field_posts_group’);
※「’」の部分がエスケープされているかもしれませんので打ち直してください。

固定ページが表示されない件に関しましては、抜けてる部分がありましたので修正しました。すみません。
具体的には「AND post_type」の上の行に下記を追加してください。
if (!$wp_query->is_search) return;

sato 2012-06-01 12:39 

管理人様、回答ありがとうございます。
固定ページの除外については、正常に動作するようになりました。

あと、and検索についてなのですが、こちらの環境ではデフォルトで有効になっているようです。教えていただいたコードを追加せずとも、and検索が出来るようになりました。

今までand検索が有効にならなかったのは、wp_dropdown_categoriesに問題があったからのようです。今までは以下のように、wp_dropdown_categoriesで、地域と料金のカテゴリを分けていました。

<form method=”get” id=”searchform” action=”<?php bloginfo(‘url’); ?>” style=”margin:10px 0 10px 10px;”>
<label class=”label”>条件指定検索</label>
<input type=”text” name=”s” id=”s” style=”border:1px solid gray;padding:0;margin:0;height:23px;width:185px;background-color:#FFFFD6;” />
<input type=”hidden” id=”searchsubmit” value=”search” />
<input type=”submit” name=”btnG” value=”検索” style=”padding:0;margin:0;width:45px;text-align:center;height:24px;font-size:12px;” />

カテゴリ:<?php wp_dropdown_categories(‘hide_empty=0&show_count=1&child_of=5&hierarchical=1&class=kenselect&show_option_all=-地域を指定-‘);
wp_dropdown_categories(‘hide_empty=0&show_count=1&child_of=3&hierarchical=1&class=moneyselect&show_option_all=-料金を指定-‘);?><br />

タグ:<?php $tags = get_tags(); if ( $tags ) : ?>
<select name=’tag’ id=’tag’>
<option value=”” selected=”selected”>-未指定-</option>
<?php foreach ( $tags as $tag ): ?>
<option value=”<?php echo esc_html( $tag->slug); ?>”><?php echo esc_html( $tag->name ); ?></option>
<?php endforeach; ?>
</select>
<?php endif; ?>

</form>

上記のようなコードだと、キーワード、カテゴリ、タグのそれぞれが連動せずにor検索になっていたのですが、以下のコードにすることでそれぞれが連動するようになりました。

<form method=”get” id=”searchform” action=”<?php bloginfo(‘url’); ?>” style=”margin:10px 0 10px 10px;”>
<label class=”label”>条件指定検索</label>
<input type=”text” name=”s” id=”s” style=”border:1px solid gray;padding:0;margin:0;height:23px;width:185px;background-color:#FFFFD6;” />
<input type=”hidden” id=”searchsubmit” value=”search” />
<input type=”submit” name=”btnG” value=”検索” style=”padding:0;margin:0;width:45px;text-align:center;height:24px;font-size:12px;” />

カテゴリ:<?php wp_dropdown_categories(‘hide_empty=0&show_count=1&hierarchical=1&class=kenselect&show_option_all=-カテゴリを指定-‘);?><br />

タグ:<?php $tags = get_tags(); if ( $tags ) : ?>
<select name=’tag’ id=’tag’>
<option value=”” selected=”selected”>-未指定-</option>
<?php foreach ( $tags as $tag ): ?>
<option value=”<?php echo esc_html( $tag->slug); ?>”><?php echo esc_html( $tag->name ); ?></option>
<?php endforeach; ?>
</select>
<?php endif; ?>

</form>

しかし、カテゴリを全て出してしまうと、地域カテゴリと料金カテゴリがゴッチャになって、絞り込み検索の意味が薄くなってしまいます。
この点は、どう対処したらよいものでしょうか?

アドバイスをいただけるとありがたいです。

webOpixel 2012-06-01 17:07 

「wp_dropdown_categories」だとおそらく「cat」プロパティになってしまうので、
「get_categories」などで取得してname属性に「car2」などオリジナルのプロパティにして処理すれば可能だと思います。
ただ、その場合自分でクエリを発行する必要があると思いますが…

料金や地域だったらカスタムフィールドで作成した方が無難な気がします。

kodama 2015-06-25 01:35 

よく参考にさせていただいています。
カテゴリやタグでの絞込み検索なのですが、検索後のsearch.phpでquery_posts()等でクエリ条件の変更が必要ないのはwordpressにwp_dropdown_categories()関数で取得した値を自動的にクエリに追加したり、id=”tag”とおいたinputの値を同じく自動的にクエリに追加する機能があるという事なのでしょうか。
不勉強ですみません。よろしければお教えください。

LEAVE A REPLY

コードを書く場合は<pre>で囲んでください。