ワードプレス歴およそ15年のフロントエンドエンジニアです。
関数作成からサイト構築まで、何でもご相談ください。

複数キーワードと複数カテゴリーで絞り込み 1

情報を追記している場合はありますが、古い情報を訂正はしていませんので、公開年月日を参照してください。
プラグイン・タグ、いずれもワードプレス・PHPのバージョン等によって動作しない場合もあります。
2012.05.28公開


医療機関の地域と科目をチェックボックスで複数選択可として検索する…例えば北区と南区の内科と小児科を表示…というのはなかなか難題でしたが…

<?php
$category = implode(',', $_POST['cat']); 
$value = implode(' ', $_POST['s']); 
$args = array(
    'post_type' => array('post'),
    'cat' => $category,
    'posts_per_page' => -1,
    'meta_query' => array(
        array(
            'key' => 'area',
            'value' => $value,
            'compare' => 'IN'
        ),
    )
);
$query = new WP_Query( $args );
?>
<?php if($query->have_posts()): ?>
<?php while($query->have_posts()): $query->the_post(); ?>
~

検索結果の表示側のタグはこんな感じ。cat、s はチェックボックスのname、s としたのはsearch.php で表示したいため。
$category = implode(‘,’, $_POST[‘cat’]);
$value = implode(‘ ‘, $_POST[‘s’]);
はフォームでチェックされた複数の値を結合するため。科目をカテゴリー、地域はキーワードとして受け取り、キーワードは予めカスタムフィールドに入れてある値とマッチする投稿を表示する。
カスタムフィールドの値はキーワードが1つなら日本語でもOKだったが(この場合のcompare はLIKE、複数なので英字で登録し(具体的にはラジオボタンで)compare はIN、値の結合はスペースで。
*地域のみ、カテゴリーのみがチェックされた場合も考慮して条件分岐 if(!isset($_POST[‘cat’])) :
*カテゴリーのみが選択された場合search.php が呼ばれないのでトップページ用のテーマの先頭で条件分岐してsearch.php を読み込む。

7/21.追記 上記の場合はOR検索、AND検索にしたい場合は
 ’category__and’ => $_POST[‘cat’], とする。

*検索結果でページ送りしたいときはフォームは get で。送信内容の受け取りは $_GET で。


meta_query、tax_query を工夫すれば、絞り込みとか検索プラグインなしでも色々出来そう。
*これが使えるのは3.1以降
meta_query で複数の条件を付ける場合は
‘meta_query’ => array(
‘relation’ => ‘AND’,
array(
‘key’ => ‘aaa’,
‘value’ => aaa,
‘compare’ => ‘LIKE’
),
array(
‘key’ => ‘bbb’,
‘value’ => bbb,
‘compare’ => ‘LIKE’
),
array(
‘key’ => ‘ccc’,
‘value’ => ccc,
‘compare’ => ‘LIKE’
)
)
のように。

フォームの設定は次回。複数キーワードと複数カテゴリーで絞り込み 2

*2017.07.10追記 不動産サイトの絞り込み検索 参照


情報を追記している場合はありますが、古い情報を訂正はしていませんので、公開年月日を参照してください。
プラグイン・タグ、いずれもワードプレス・PHPのバージョン等によって動作しない場合もあります。
2012.05.28公開