Kotoriはマルファン症候群という難病を患っています! 今後は、マルファン症候群に関するトピックも扱っていきます!

パンD KOTORI Blogの公式キャラクター「パンD」です。
コーディングWordPress絞り込み検索をプラグインを使わずに実装[WordPress]

絞り込み検索をプラグインを使わずに実装[WordPress]

2014年03月06日WordPress 便利コード 
絞り込み検索をプラグインを使わずに実装[WordPress]記事のアイキャッチ画像

WordPressで絞り込み検索をプラグインを使用せずに実装する方法を紹介します。「Custom Fields Search」はサポート終わってる?「FE Advanced Search」はちょっと高い?大丈夫です!自分で実装してみましょう!

目次

超大作になってしまったので目次付けときます。

  1. まえがき
  2. 絞り込み検索のサンプル
  3. 絞り込み検索を実装するための土台作り
  4. キーワード検索
  5. カテゴリで絞り込むチェックボックス
  6. カテゴリで絞り込むチェックボックス以外のパーツ(プルダウン等)
  7. タグまたはカスタムタクソノミーで絞り込むチェックボックス
  8. タグまたはカスタムタクソノミーで絞り込むチェックボックス以外のパーツ(プルダウン等)
  9. カスタムフィールドで絞り込むチェックボックス
  10. カスタムフィールドで絞り込むチェックボックス以外のパーツ
  11. カスタムフィールドの値で数値比較
  12. 複数の条件を組み合わせる
  13. 検索結果ページでのページネーション


まえがき

WordPressで絞り込み検索の機能を実現させるとしたら、みなさんどうしますか?

普通はまずプラグインで手っ取り早くできないかと考えるかと思います。
プラグインで考えると真っ先に挙がるのが『Custom Fields Search』です。
この『Custom Fields Search』のいい所は無料という点です。
絞り込み検索を実装するプラグインの中で実用的かつ無料なのは『Custom Fields Search』くらいではないでしょうか。

『Custom Fields Search』は余りおススメできない

しかし、『Custom Fields Search』は余りおススメできません。
理由としては以下の点があげられます。

  • プラグインが2009年8月19日から約4年間全く更新されておらず、最近4年ぶりに更新されたが作者さんが「サポートできないのでリリースはこれが最後だろう」と宣言している。
  • inputやselectタグを含んだformタグを丸々書き出すので出力コードを自由に編集することができない。
  • W3Cのバリデータに通らない

しかし上のことが気にならなければ、非常に簡単に絞り込み検索を実現できます。
以前このKoToRi Blogでも『Custom Fields Search』の使用方法を解説しました。
もし『Custom Fields Search』を使用するなら参考にしてください。

絞り込み検索を可能にする「Custom Fields Search」[WordPress]

『FE Advanced Search』という選択肢

話が若干それましたが、絞り込み検索のプラグインでもう一つ強力なものがあります。
FE Advanced Search』です。
このプラグインはUIも分かりやすく吐き出すHTMLタグも『Custom Fields Search』よりは自由が効きそうです。
しかしこの『FE Advanced Search』には最大の欠点があります。
それは
有料 ¥59,800
という点です。

プラグインを使用しないという選択

『FE Advanced Search』の¥59,800はそうホイホイ出せる金額じゃないですね笑
でも、『Custom Fields Search』もサポート終了しています。
じゃあどうするか。

絞り込み検索はプラグインに頼らず自分で実装すればいい!

できねーよ!とか思わないでください。案外簡単だったりします。KoToRiはプログラマじゃないしphpのスキルもそこまで高くないですがWordPressでの絞り込み検索は実装できました。WordPress3.1から追加された「tax_query」と「meta_query」を駆使すれば、絞り込み検索はそんなに難しくないのです。

まえおきが長くなってしまいましたが、この記事では絞り込み検索機能をプラグインに頼らず自分で実装する方法を紹介していこうと思います。

絞り込み検索のサンプル

とりあえずKoToRiが作ったプラグインを使用しない絞り込み検索のサンプルをご覧ください。

プラグインに頼らず実装する絞り込み検索のサンプル
Googleに引っかかっちゃうとよろしくないのでアクセス制限を掛けています。
下記情報でログインしてください。

ユーザー名 admin
パスワード kotori

絞り込み検索といったら不動産サイトでしょ!!ということで不動産サイトを想定したサンプルとなっています。

WordPress絞り込み検索で一般的に考えられるパーツはこんなところではないでしょうか。

  • キーワード検索
  • カテゴリで絞り込むチェックボックス
  • カテゴリで絞り込むチェックボックス以外のパーツ(プルダウン等)
  • タグまたはタクソノミーで絞り込むチェックボックス
  • タグまたはタクソノミーで絞り込むチェックボックス以外のパーツ(プルダウン等)
  • カスタムフィールドの値で絞り込むチェックボックス
  • カスタムフィールドの値で絞り込むチェックボックス以外のパーツ(プルダウン等)
  • カスタムフィールドの値で数値比較(サンプルでいうところの家賃のフィールド)

チェックボックスとそれ以外で分けているのはチェックボックスは値が配列で返ってくるため扱いが違ってくるためです。
上に挙げた機能を実装することができれば大体のシチュエーションには対応できるかと思われます。(多分)
この記事では上に挙げた項目を全部解説していきます。

また、このサンプルはカスタムフィールドは「Custom Field Template」、カスタムタクソノミーは「Custom Post Type UI」を使用して作成しています。未だ使ったことが無い方は是非試してみてください。ラクチンです。

Custom Field Templateの使い方[WordPress]
Custom Post Type UIの使い方[WordPress]

2014年03月10日 追記
キーワード検索の検索対象にカスタムフィールドを含めたい場合は「Search Everything」プラグインを利用しましょう。下記を参考にしてください。
カスタムフィールドをサイト内検索の対象にする「Search Everything」[WordPress]

2017年07月09日 追記
「Search Everything」プラグインのバージョンアップにより、本記事で紹介している絞り込み検索が正常に動作しなくなる現象が確認されました。どうしても「Search Everything」プラグインを使用する場合は下記バージョンをお試しください。(もうちょい新しいのでもイケるかも!?)
search-everything.8.0.zip

それでは絞り込み検索の実装を解説していきます。

絞り込み検索を実装するための土台作り

検索ボタンが押されたら、必ず検索結果ページを表示する

何言ってんだ、当たり前だろ。と思われるかもしれませんがこれ重要です。

WordPressのキーワード検索の場合、ユーザーが入力した検索キーワードを「s」に格納し$_GETで投げます。キーワード検索で検索ボタンを押すと遷移先のURLに「?s=○○」の形式で文字列が追加されるのですがそれです。
これは基本ですね。

WordPressはこの「s」に値が入っているときに「検索結果ページ(search.php)」を表示します。

逆に考えると「s」に値が無かったら「検索結果ページ」が表示されません。
もしサンプルのように、キーワード検索と組み合わせて他の項目でも絞り込みできるようにした場合、そのままだと検索キーワードに必ず何か入れないと検索結果ページが表示されないということになります。

絞り込み検索を実装する場合は、まずこの現象を回避する必要があります。

お使いのテーマのfunctions.phpに以下のコードを追加してください。

function custom_search($search, $wp_query  ) {
	//query['s']があったら検索ページ表示
	if ( isset($wp_query->query['s']) ) $wp_query->is_search = true;
	return $search;
}
add_filter('posts_search','custom_search', 10, 2);

2014年4月8日 コード修正

上記のfunctionを追加するとキーワードを入力せずに「検索」ボタンを押した時もsearch.phpが表示されるようになります。

参考:WordPressのサイト内検索の検索条件をカスタマイズする

2015年2月26日 追記
なんかWordPress4.0以降から空文字検索でもsearch.phpが表示されるようになってるらしいです!!とはいえ公開してるサンプルサイトはWordPressのバージョンが4.01なのですが上記のコードをfunctions.phpに書いて正常に機能しています。
なので、お使いのWordPressのバージョンが4.0以降の人は、最初にfunctions.phpにコード追加しない状態で空文字検索で動作確認して、もしダメなら上記のコードを追加してみてください。

参考:WordPress 4.0 から、空文字の検索に対する挙動が変わったようです

2015年3月03日 追記
上のコードを追加してもsearch.phpが表示されない場合は、下記のコードも試してください。
WordPress3.0くらいだとこっちのコードじゃないと動かないかもです。
いよかんさんコメントありがとうございます!

function search_no_keywords() {
if (isset($_GET['s']) && empty($_GET['s'])) {
include(TEMPLATEPATH . '/search.php');
exit;
}
}
add_action('template_redirect', 'search_no_keywords');

検索ボタンが押されると、「s」に値が入っているか入っていないかを判定して入っていない場合は「””(ダブルクォーテーション2つ)」を代入する処理を行います。
こうすることにより、キーワードが空の場合でも検索結果ページを表示してくれるようになります。

検索結果ページのtitle

みなさん「All in One SEO Pack」使ってますか?
「All in One SEO Pack」の設定がデフォルトの状態だと検索結果ページのtitleが「検索キーワード|サイト名」という形になります。
しかし、そのままだと検索キーワードを入れずに検索した場合のtitleが「””|サイト名」と意味不明なことになってしまいます。
ということで検索結果ページのtitleの設定を変えてあげましょう。

検索結果ページのタイトルを変更

2014年12月12日 コード修正

WordPress4.01にバージョンアップしたら検索キーワードに何も入力しないで検索結果ページを表示させた場合、「All in One SEO Pack」で設定したタイトルが表示されないようでした。(もしかしたら初めからそうだったのかも><)
同じ現象が起こる方はtitleタグに下記を追加してください。

<title><?php if(is_search()){ ?>検索|プラグインに頼らず実装する絞り込み検索のサンプル<?php } ?></title>

これで検索結果ページはコード上に入力したタイトルが、その他のページは「All in One SEO Pack」で設定したタイトルが表示されるはずです。

検索フォームの基本パーツ

念のためおさらいです。
WordPressの検索フォームの基本はこのコードでしょう。

<form method="get" id="searchform" action="<?php bloginfo('url'); ?>">
    <label for="s" class="assistive-text">検索</label>
    <input type="text" name="s" id="s" placeholder="検索" />
    <input type="submit" value="検索" />
</form>

WordPressのキーワード検索に最低限必要なHTMLです。絞り込み検索も基本はこの形で、formタグの中に絞り込み検索に必要なパーツを記述していきます。
actionにはサイトのトップページのURLを指定します。
例に挙げたコードの「bloginfo(‘url’)」で取得できるはずです。

次項から、冒頭で挙げた絞り込み検索で一般的に考えられるパーツのフォームの書き方と検索結果の表示方法を片っ端から解説していきます

キーワード検索

キーワード検索のformタグ内の記述

前の項でコード例を挙げましたがもう一度。

<form method="get" id="searchform" action="<?php bloginfo('url'); ?>">
    <label for="s" class="assistive-text">検索</label>
    <input type="text" name="s" id="s" placeholder="検索" />
    <input type="submit" value="検索" />
</form>

注意したいのが絞り込み検索にキーワード検索が必要ない場合です。

キーワード検索が必要ない場合でも、検索結果ページを表示させるために「input type=”hidden”」で「s」を隠しパラメータとして渡してあげる必要があります。
こんな感じ。

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

要注意です。

キーワード検索の検索結果ページでの記述

検索結果ページにキーワード検索の結果を表示するコードです。

<?php
$s = $_GET['s'];
?>

<div>検索条件</div>
<?php if($s){ ?>検索キーワード:<?php echo $s; ?><br><?php } ?>

<div>検索結果</div>

<?php
query_posts( array(
	's' => $s,
	)
);
?>
<?php if ( have_posts() ) : while ( have_posts() ) : the_post(); ?>

<div><?php the_title(); ?></div>
<div><?php the_content(); ?></div>

<?php endwhile; else : ?>

<div>該当なし</div>

<?php endif;
wp_reset_query(); ?>

これは特に問題ないでしょう。

カテゴリで絞り込むチェックボックス

フォームはチェックボックスが一番厄介です笑
複数選択されることを考慮して値を配列で扱う必要があるからです。

カテゴリで絞り込むチェックボックスのformタグ内の記述

formタグ内に記述するタグはこの記事の応用です。
カテゴリ毎の記事一覧を表示する方法[WordPress]

<form method="get" id="searchform" action="<?php bloginfo('url'); ?>">
    <label for="s" class="assistive-text">検索</label>
    <input type="text" name="s" id="s" placeholder="検索" />

    <div>カテゴリ</div>
<?php
$categories = get_categories();
foreach($categories as $category) :
?>
<label><input type="checkbox" name="catnum[]" value="<?php echo $category->term_id; ?>"><?php echo $category->name; ?></label><br>
<?php endforeach; ?>
    <input type="submit" value="検索" />
</form>

「name=”catnum[]”」とすることによって「cutnum」の形式が配列になります。これで複数選択されてもそれぞれ値が格納されるのでモーマンタイです。
また、このコードだとWordPressのコードでループさせて表示しているので途中でカテゴリが増えたとしても修正する必要がありません。

カテゴリで絞り込むチェックボックスの検索結果ページでの記述

カテゴリで絞り込むチェックボックスの結果を表示するコードです。

<?php
$s = $_GET['s'];
$catnum = $_GET['catnum'];

//tax_query用
if($catnum){
	$taxquerysp[] = array(
			'taxonomy'=>'category',
			'terms'=> $catnum,
			'include_children'=>false,
			'field'=>'term_id',
			'operator'=>'AND'
			);
}
?>

<div>検索条件</div>
<?php if($s){ ?>検索キーワード:<?php echo $s; ?><br><?php } ?>
<?php
if (is_array($catnum)) { ?>カテゴリ:<?php
foreach($catnum as $val){
if ($val === end($catnum)) {
echo get_cat_name($val);
    }else{
echo get_cat_name($val).", ";
}
}
}
 ?>
<div>検索結果</div>

<?php
query_posts( array(
	'tax_query' => $taxquerysp,
	's' => $s,
	)
);
?>
<?php if ( have_posts() ) : while ( have_posts() ) : the_post(); ?>

<div><?php the_title(); ?></div>
<div><?php the_content(); ?></div>

<?php endwhile; else : ?>

<div>該当なし</div>

<?php endif;
wp_reset_query(); ?>

カテゴリで絞り込むチェックボックス以外のパーツ(プルダウン等)

チェックボックス以外の絞り込みを見ていきましょう。
参考コードはプルダウンになりますが、ラジオボタンもHTMLコードが変わるだけで基本は一緒です。

カテゴリで絞り込むチェックボックス以外のパーツのformタグ内の記述

上で紹介したカテゴリのチェックボックスと同じくこの記事の応用です。
カテゴリ毎の記事一覧を表示する方法[WordPress]

<form method="get" id="searchform" action="<?php bloginfo('url'); ?>">
    <label for="s" class="assistive-text">検索</label>
    <input type="text" name="s" id="s" placeholder="検索" />

    <div>カテゴリ</div>

    <select name="catnum">
        <option value="" selected>カテゴリ</option>
        <?php
        $categories = get_categories();
        foreach($categories as $category) :
        ?>
            <option value="<?php echo $category->term_id; ?>"><?php echo $category->cat_name; ?></option>
        <?php endforeach; ?>
    </select>
    <input type="submit" value="検索" />
</form>

カテゴリで絞り込むチェックボックス以外のパーツの検索結果ページでの記述

配列を考えないでよいぶん検索条件として選択されたカテゴリを表示するコードは簡単です。「tax_query」用の記述はチェックボックスと変わりません。

<?php
$s = $_GET['s'];
$catnum = $_GET['catnum'];

//tax_query用
if($catnum){
	$taxquerysp[] = array(
			'taxonomy'=>'category',
			'terms'=> $catnum,
			'include_children'=>false,
			'field'=>'term_id',
			'operator'=>'AND'
			);
}
?>

<div>検索条件</div>
<?php if($s){ ?>検索キーワード:<?php echo $s; ?><br><?php } ?>
<?php if($catnum){ ?>カテゴリ:<?php echo get_cat_name($catnum); } ?>

<div>検索結果</div>

<?php
query_posts( array(
	'tax_query' => $taxquerysp,
	's' => $s,
	)
);
?>
<?php if ( have_posts() ) : while ( have_posts() ) : the_post(); ?>

<div><?php the_title(); ?></div>
<div><?php the_content(); ?></div>

<?php endwhile; else : ?>

<div>該当なし</div>

<?php endif;
wp_reset_query(); ?>

タグまたはカスタムタクソノミーで絞り込むチェックボックス

基本はカテゴリの絞り込みと一緒です。ただタクソノミーの情報をとってくるコードが違うだけです。

タグまたはカスタムタクソノミーで絞り込むチェックボックスのformタグ内の記述

<form method="get" id="searchform" action="<?php bloginfo('url'); ?>">
    <label for="s" class="assistive-text">検索</label>
    <input type="text" name="s" id="s" placeholder="検索" />

    <div>タグまたはカスタムタクソノミー</div>
<?php
$taxonomy_name = 'post_tag';
$taxonomys = get_terms($taxonomy_name);
if(!is_wp_error($taxonomys) && count($taxonomys)):
	foreach($taxonomys as $taxonomy):
		$tax_posts = get_posts(array('post_type' => get_post_type(), 'taxonomy' => $taxonomy_name, 'term' => $taxonomy->slug ) );
		if($tax_posts):
?>
<label><input type="checkbox" name="post_tag[]" value="<?php echo $taxonomy->slug; ?>"><?php echo $taxonomy->name; ?></label><br>
<?php
		endif;
	endforeach;
endif;
?>
    <input type="submit" value="検索" />
</form>

この例はタグのチェックボックスになりますがカスタムタクソノミーの場合は7行目の「$taxonomy_name = ‘post_tag’;」の値をタクソノミー名に変更するだけです。

「name=”post_tag[]”」とすることによって「post_tag」の形式が配列になります。これで複数選択されてもそれぞれ値が格納されるのでモーマンタイです。
また、このコードだとWordPressのコードでループさせて表示しているので途中でタグやカスタムタクソノミーが増えたとしても修正する必要がありません。

因みに、「投稿」ではなく「カスタム投稿タイプ」で絞り込み検索を考えているのであれば、11行目の「’post_type’ => get_post_type()」の値をカスタム投稿タイプ名に変更する必要がでてきます。

上のコードで、うまくタグかタクソノミーの一覧をとってこれない時は、このコードの前に

<?php wp_reset_query(); ?>

を記述してqueryをリセットしてみてください。

タグまたはカスタムタクソノミーで絞り込むチェックボックスの検索結果ページでの記述

<?php
$s = $_GET['s'];
$post_tag = $_GET['post_tag'];

//tax_query用
if($post_tag){
	$taxquerysp[] = array(
			'taxonomy'=>'post_tag',
			'terms'=> $post_tag,
			'include_children'=>false,
			'field'=>'slug',
			'operator'=>'AND'
			);
}
?>

<div>検索条件</div>
<?php if($s){ ?>検索キーワード:<?php echo $s; ?><br><?php } ?>
<?php
if (is_array($post_tag)) { ?>タグ(カスタムタクソノミー):<?php
foreach($post_tag as $val){
if ($val === end($post_tag)) {
echo get_term_by('slug',$val,"post_tag")->name;
    }else{
echo get_term_by('slug',$val,"post_tag")->name.", ";
}
}
}
 ?>

<div>検索結果</div>

<?php
query_posts( array(
	'tax_query' => $taxquerysp,
	's' => $s,
	)
);
?>
<?php if ( have_posts() ) : while ( have_posts() ) : the_post(); ?>

<div><?php the_title(); ?></div>
<div><?php the_content(); ?></div>

<?php endwhile; else : ?>

<div>該当なし</div>

<?php endif;
wp_reset_query(); ?>

上のコードはタグでの絞り込みを想定しているので「’taxonomy’=>’post_tag’」や「echo get_term_by(‘slug’,$val,”post_tag”)->name;」で「post_tag」を指定していますが、カスタムタクソノミーの場合はタクソノミー名を入れてくださいね。

タグまたはカスタムタクソノミーで絞り込むチェックボックス以外のパーツ(プルダウン等)

これも基本はカテゴリのチェックボックス以外とおんなじことです。

タグまたはカスタムタクソノミーで絞り込むチェックボックス以外のパーツのformタグ内の記述

<form method="get" id="searchform" action="<?php bloginfo('url'); ?>">
    <label for="s" class="assistive-text">検索</label>
    <input type="text" name="s" id="s" placeholder="検索" />

    <div>カテゴリ</div>

    <select name="catnum">
	<?php
    $taxonomy_name = 'post_tag';
    $taxonomys = get_terms($taxonomy_name);
    if(!is_wp_error($taxonomys) && count($taxonomys)):
        foreach($taxonomys as $taxonomy):
            $tax_posts = get_posts(array('post_type' => get_post_type(), 'taxonomy' => $taxonomy_name, 'term' => $taxonomy->slug ) );
            if($tax_posts):
    ?>
    <option value="<?php echo $taxonomy->slug; ?>"><?php echo $taxonomy->name; ?></option>
    <?php
            endif;
        endforeach;
    endif;
    ?>
	</select>
    <input type="submit" value="検索" />
</form>

注意するべきことはタグのチェックボックスの時と一緒です。

この例はタグのチェックボックスになりますがカスタムタクソノミーの場合は7行目の「$taxonomy_name = ‘post_tag’;」の値をタクソノミー名に変更するだけです。

「投稿」ではなく「カスタム投稿タイプ」で絞り込み検索を考えているのであれば、11行目の「’post_type’ => get_post_type()」の値をカスタム投稿タイプ名に変更する必要がでてきます。

上のコードで、うまくタグかタクソノミーの一覧をとってこれない時は、このコードの前に

<?php wp_reset_query(); ?>

を記述してqueryをリセットしてみてください。

タグまたはカスタムタクソノミーで絞り込むチェックボックス以外のパーツの検索結果ページでの記述

配列を考えないで良い分、検索条件として選択されたタグまたはカスタムタクソノミーを表示するコードは簡単です。「tax_query」用の記述はチェックボックスと変わりません。

<?php
$s = $_GET['s'];
$post_tag = $_GET['post_tag'];

//tax_query用
if($post_tag){
	$taxquerysp[] = array(
			'taxonomy'=>'post_tag',
			'terms'=> $post_tag,
			'include_children'=>false,
			'field'=>'slug',
			'operator'=>'AND'
			);
}
?>

<div>検索条件</div>
<?php if($s){ ?>検索キーワード:<?php echo $s; ?><br><?php } ?>
<?php if($post_tag){ ?>タグ(カスタムタクソノミー):<?php echo get_term_by('slug',$post_tag,"post_tag")->name; } ?>

<div>検索結果</div>

<?php
query_posts( array(
	'tax_query' => $taxquerysp,
	's' => $s,
	)
);
?>
<?php if ( have_posts() ) : while ( have_posts() ) : the_post(); ?>

<div><?php the_title(); ?></div>
<div><?php the_content(); ?></div>

<?php endwhile; else : ?>

<div>該当なし</div>

<?php endif;
wp_reset_query(); ?>

チェックボックスの項目にも書いたのですが、一応。上のコードはタグでの絞り込みを想定しているので「’taxonomy’=>’post_tag’」や「echo get_term_by(‘slug’,$val,”post_tag”)->name;」で「post_tag」を指定していますが、カスタムタクソノミーの場合はタクソノミー名を入れてくださいね。

カスタムフィールドで絞り込むチェックボックス

カスタムフィールドの値で絞り込む方法を見ていきましょう。まずはチェックボックスです。

カスタムフィールドで絞り込むチェックボックスのformタグ内の記述

<form method="get" id="searchform" action="<?php bloginfo('url'); ?>">
    <label for="s" class="assistive-text">検索</label>
    <input type="text" name="s" id="s" placeholder="検索" />

    <div>カスタムフィールド</div>
    <label><input type="checkbox" name="kodawari[]" value="駐車場あり">駐車場あり</label><br>
    <label><input type="checkbox" name="kodawari[]" value="バス・トイレ別">バス・トイレ別</label><br>
    <label><input type="checkbox" name="kodawari[]" value="ペット相談">ペット相談</label><br>
    <label><input type="checkbox" name="kodawari[]" value="2階以上住戸">2階以上住戸</label>
    <input type="submit" value="検索" />
</form>

KoToRiの知る限りカスタムフィールドの選択肢を取ってくるコードは無いので直で書く必要があります。
「直で書く」ということは増えたり減ったりした場合に修正が必要になるということです。
これが絞り込み検索にカスタムフィールドを利用する際の欠点ですね。

カスタムフィールドで絞り込むチェックボックスの検索結果ページでの記述

<?php
$s = $_GET['s'];
$kodawari = $_GET['kodawari'];

//meta_query用
if($kodawari){
	foreach($kodawari as $val){
		$metaquerysp[] = array(
				'key'=>'kodawari',
				'value'=> $val,
				);
	}
}
$metaquerysp['relation'] = 'AND';
?>

<div>検索条件</div>
<?php if($s){ ?>検索キーワード:<?php echo $s; ?><br><?php } ?>
<?php if (is_array($kodawari)) { ?>カスタムフィールド:<?php
if (is_array($kodawari)) {
foreach($kodawari  as $val){
if ($val === end($kodawari)) {
echo $val;
    }else{
echo $val.", ";
}
}
}
}
 ?>

<div>検索結果</div>

<?php
query_posts( array(
	'meta_query' => $metaquerysp,
	's' => $s,
	)
);
?>
<?php if ( have_posts() ) : while ( have_posts() ) : the_post(); ?>

<div><?php the_title(); ?></div>
<div><?php the_content(); ?></div>

<?php endwhile; else : ?>

<div>該当なし</div>

<?php endif;
wp_reset_query(); ?>

カスタムフィールドで絞り込む場合は「meta_query」を使用します!
「meta_query」の場合、「tax_query」と違い「value」に配列を入れると正常に機能しないのです。
なので値の数だけforeachで条件を増やしています。

また、「tax_query」「meta_query」ともに条件が複数になる場合は「relation」を指定する必要があります。
今回は絞り込み検索なので「AND(すべての条件に一致)」を指定しています。

カスタムフィールドで絞り込むチェックボックス以外のパーツ

次はカスタムフィールドのチェックボックス以外のパーツです。

カスタムフィールドで絞り込むチェックボックス以外のパーツのformタグ内の記述

<form method="get" id="searchform" action="<?php bloginfo('url'); ?>">
    <label for="s" class="assistive-text">検索</label>
    <input type="text" name="s" id="s" placeholder="検索" />

    <div>カスタムフィールド</div>
    <select name="type">
        <option value="" selected>ルームタイプ</option>
        <option value="アパート">アパート</option>
        <option value="マンション">マンション</option>
        <option value="一戸建て・その他">一戸建て・その他</option>
    </select>
    <input type="submit" value="検索" />
</form>

これもカスタムフィールドの選択肢を取ってくるコードは無いので直で書く必要があります。
「直で書く」ということは増えたり減ったりした場合に修正が必要になるということです。
これが絞り込み検索にカスタムフィールドを利用する際の欠点ですね。

カスタムフィールドで絞り込むチェックボックス以外のパーツの検索結果ページでの記述

<?php
$s = $_GET['s'];
$type = $_GET['type'];

//meta_query用
if($type){
	$metaquerysp[] = array(
			'key'=>'type',
			'value'=> $type,
			);
}
?>

<div>検索条件</div>
<?php if($s){ ?>検索キーワード:<?php echo $s; ?><br><?php } ?>
<?php if($type){ ?>カスタムフィールド:<?php echo $type; } ?>

<div>検索結果</div>

<?php
query_posts( array(
	'meta_query' => $metaquerysp,
	's' => $s,
	)
);
?>
<?php if ( have_posts() ) : while ( have_posts() ) : the_post(); ?>

<div><?php the_title(); ?></div>
<div><?php the_content(); ?></div>

<?php endwhile; else : ?>

<div>該当なし</div>

<?php endif;
wp_reset_query(); ?>

特に難しいところはありませんね。



カスタムフィールドの値で数値比較

サンプル(ベーシック認証:ユーザ名 admin / パスワード kotori)でいうところの家賃のフィールドですね。
これ一見難しそうですが実は楽勝です。
サンプルと同じく家賃を想定して解説していきます。

家賃のカスタムフィールドを作成する

絞り込み検索を行うため家賃のカスタムフィールドを作成します。
そこに入力された数値を判定して絞り込み検索させます。

カスタムフィールドの値で数値比較するためのformタグ内の記述

<form method="get" id="searchform" action="<?php bloginfo('url'); ?>">
    <label for="s" class="assistive-text">検索</label>
    <input type="text" name="s" id="s" placeholder="検索" />

    <div>家賃(カスタムフィールドのテキストフィールド)</div>
    <select name="low">
        <option value="0" selected>下限なし</option>
        <option value="20000">20,000円以上</option>
        <option value="25000">25,000円以上</option>
        <option value="30000">30,000円以上</option>
        <option value="35000">35,000円以上</option>
        <option value="40000">40,000円以上</option>
        <option value="45000">45,000円以上</option>
        <option value="50000">50,000円以上</option>
        <option value="55000">55,000円以上</option>
        <option value="60000">60,000円以上</option>
        <option value="65000">65,000円以上</option>
        <option value="70000">70,000円以上</option>
        <option value="75000">75,000円以上</option>
        <option value="80000">80,000円以上</option>
    </select> ~<br />
    <select name="high">
        <option value="20000">20,000円以下</option>
        <option value="25000">25,000円以下</option>
        <option value="30000">30,000円以下</option>
        <option value="35000">35,000円以下</option>
        <option value="40000">40,000円以下</option>
        <option value="45000">45,000円以下</option>
        <option value="50000">50,000円以下</option>
        <option value="55000">55,000円以下</option>
        <option value="60000">60,000円以下</option>
        <option value="65000">65,000円以下</option>
        <option value="70000">70,000円以下</option>
        <option value="75000">75,000円以下</option>
        <option value="80000">80,000円以下</option>
        <option value="9999999" selected>上限なし</option>
    </select>
    <input type="submit" value="検索" />
</form>

数値の区切りは各々変更してください。

カスタムフィールドの値で数値比較するための検索結果ページの記述

<?php
$s = $_GET['s'];
$low = $_GET['low'];
$high = $_GET['high'];

//meta_query用
$metaquerysp[] = array(
			'key'=>'price',
			'value'=>array( $low, $high ),
			'compare'=>'BETWEEN',
			'type'=>'NUMERIC',
			);
?>

<div>検索条件</div>
<?php if($s){ ?>検索キーワード:<?php echo $s; ?><br><?php } ?>
<?php if($low == 0 && $high == 9999999){}else{ ?>家賃:<?php if($low == 0){ ?>下限なし<?php }else{ echo number_format($low).'円'; } ?> ~ <?php if($high == 9999999){ ?>上限なし<?php }else{ echo number_format($high).'円';} ?><?php } ?>

<div>検索結果</div>

<?php
query_posts( array(
	'meta_query' => $metaquerysp,
	's' => $s,
	)
);
?>
<?php if ( have_posts() ) : while ( have_posts() ) : the_post(); ?>

<div><?php the_title(); ?></div>
<div><?php the_content(); ?></div>

<?php endwhile; else : ?>

<div>該当なし</div>

<?php endif;
wp_reset_query(); ?>

ここでのミソはなんといっても「meta_query」用のコードでしょう。
「value」に取得した二つの数値を格納し「type」で「NUMERIC」を指定することにより「value」の値を数値として扱うことができます。
あとは「compare」の指定によってさまざまな条件で絞り込むことが可能です。今回は「BETWEEN」を指定しています。
「BETWEEN」を指定すると、カスタムフィールド「price」が「value」に指定した2つの数値の間の場合にヒットします。

複数の条件を組み合わせる

前の項までは条件が一つ(キーワード検索を除く)の場合のコードでしたが、それぞれを組み合わせることにより不動産サイトのような絞り込み検索を実現できるというわけです。

この項ではKoToRiの絞り込み検索サンプル(ベーシック認証:ユーザ名 admin / パスワード kotori)のコードを公開しようと思います。
一番手っ取り早くて分かりやすいですよね。

■フォーム

<form method="get" id="searchform" action="http://kotori-blog.com/test/">
<label for="s" class="assistive-text">検索</label>
<input type="text" class="field" name="s" id="s" placeholder="検索" />

<select name="catnum" style="margin-top:20px;">
    <option value="" selected>カテゴリ</option>
                                    <?php
$categories = get_categories('parent=0');
foreach($categories as $category) :
?>
    <option value="<?php echo $category->term_id; ?>"><?php echo $category->cat_name; ?></option>
<?php endforeach; ?>
</select>

<select name="placenum" style="margin-top:20px;">
    <option value="" selected>間取りタイプ(カスタムタクソノミー)</option>
<?php
$taxonomy_name = 'place';
$taxonomys = get_terms($taxonomy_name);
if(!is_wp_error($taxonomys) && count($taxonomys)):
	foreach($taxonomys as $taxonomy):
		$tax_posts = get_posts(array('post_type' => get_post_type(), 'taxonomy' => $taxonomy_name, 'term' => $taxonomy->slug ) );
		if($tax_posts):
?>
<option value="<?php echo $taxonomy->slug; ?>"><?php echo $taxonomy->name; ?></option>
<?php
		endif;
	endforeach;
endif;
?>
</select>

<select name="type" style="margin-top:20px;">
    <option value="" selected>ルームタイプ(カスタムフィールドのセレクトボックス)</option>
    <option value="アパート">アパート</option>
    <option value="マンション">マンション</option>
    <option value="一戸建て・その他">一戸建て・その他</option>
</select>

<div style="margin-top:20px">家賃(カスタムフィールドのテキストフィールド)</div>
<select name="low" style="margin-top:5x;">
    <option value="0" selected>下限なし</option>
    <option value="20000">20,000円以上</option>
    <option value="25000">25,000円以上</option>
    <option value="30000">30,000円以上</option>
    <option value="35000">35,000円以上</option>
    <option value="40000">40,000円以上</option>
    <option value="45000">45,000円以上</option>
    <option value="50000">50,000円以上</option>
    <option value="55000">55,000円以上</option>
    <option value="60000">60,000円以上</option>
    <option value="65000">65,000円以上</option>
    <option value="70000">70,000円以上</option>
    <option value="75000">75,000円以上</option>
    <option value="80000">80,000円以上</option>
</select> ~<br />
<select name="high" style="margin-top:5px;">
    <option value="20000">20,000円以下</option>
    <option value="25000">25,000円以下</option>
    <option value="30000">30,000円以下</option>
    <option value="35000">35,000円以下</option>
    <option value="40000">40,000円以下</option>
    <option value="45000">45,000円以下</option>
    <option value="50000">50,000円以下</option>
    <option value="55000">55,000円以下</option>
    <option value="60000">60,000円以下</option>
    <option value="65000">65,000円以下</option>
    <option value="70000">70,000円以下</option>
    <option value="75000">75,000円以下</option>
    <option value="80000">80,000円以下</option>
    <option value="9999999" selected>上限なし</option>

</select>

<div style="margin-top:20px">こだわり(タグ)</div>
<?php
$taxonomy_name = 'post_tag';
$taxonomys = get_terms($taxonomy_name);
if(!is_wp_error($taxonomys) && count($taxonomys)):
	foreach($taxonomys as $taxonomy):
		$tax_posts = get_posts(array('post_type' => get_post_type(), 'taxonomy' => $taxonomy_name, 'term' => $taxonomy->slug ) );
		if($tax_posts):
?>
<label><input type="checkbox" name="post_tag[]" value="<?php echo $taxonomy->slug; ?>"><?php echo $taxonomy->name; ?></label><br>
<?php
		endif;
	endforeach;
endif;
?>

<div>こだわり(カスタムフィールドのチェックボックス)</div>
<label><input type="checkbox" name="kodawari[]" value="駐車場あり">駐車場あり</label><br>
<label><input type="checkbox" name="kodawari[]" value="バス・トイレ別">バス・トイレ別</label><br>
<label><input type="checkbox" name="kodawari[]" value="ペット相談">ペット相談</label><br>
<label><input type="checkbox" name="kodawari[]" value="2階以上住戸">2階以上住戸</label>

<input type="submit" class="submit" name="submit" id="searchsubmit" value="検索" />
</form>

■検索結果

<?php
$s = $_GET['s'];
$catnum = $_GET['catnum'];
$placenum = $_GET['placenum'];
$type = $_GET['type'];
$low = $_GET['low'];
$high = $_GET['high'];
$post_tag = $_GET['post_tag'];
$kodawari = $_GET['kodawari'];

if($catnum){
	$taxquerysp[] = array(
			'taxonomy'=>'category',
			'terms'=> $catnum,
			'include_children'=>false,
			'field'=>'term_id',
			'operator'=>'AND'
			);
}

if($post_tag){
	$taxquerysp[] = array(
			'taxonomy'=>'post_tag',
			'terms'=> $post_tag,
			'include_children'=>false,
			'field'=>'slug',
			'operator'=>'AND'
			);
}

if($placenum){
	$taxquerysp[] = array(
			'taxonomy'=>'place',
			'terms'=> $placenum,
			'include_children'=>false,
			'field'=>'slug',
			'operator'=>'AND'
			);
}
$taxquerysp['relation'] = 'AND';

if($kodawari){
	foreach($kodawari as $val){
		$metaquerysp[] = array(
				'key'=>'kodawari',
				'value'=> $val,
				);
	}
}
if($type){
	$metaquerysp[] = array(
			'key'=>'type',
			'value'=> $type,
			'compare'=>'=',
			);
}
$metaquerysp[] = array(
			'key'=>'price',
			'value'=>array( $low, $high ),
			'compare'=>'BETWEEN',
			'type'=>'NUMERIC',
			);
$metaquerysp['relation'] = 'AND';

?>

<?php if($s){ ?>検索キーワード:<?php echo $s; ?><br><?php } ?>
<?php if($catnum){ ?>カテゴリ:<?php echo get_cat_name($catnum); ?><br><?php } ?>
<?php if($placenum){ ?>間取りタイプ:<?php echo get_term_by('slug',$placenum,"place")->name; ?><br><?php } ?>
<?php if($type){ ?>ルームタイプ:<?php echo $type; ?><br><?php } ?>
<?php if($low == 0 && $high == 9999999){}else{ ?>家賃:<?php if($low == 0){ ?>下限なし<?php }else{ echo number_format($low).'円'; } ?> ~ <?php if($high == 9999999){ ?>上限なし<?php }else{ echo number_format($high).'円';} ?><br>
<br><?php } ?>
<?php
if (is_array($cutnum)) { ?>カテゴリ:<?php
foreach($cutnum as $val){
if ($val === end($cutnum)) {
echo get_cat_name($catnum);
    }else{
echo get_cat_name($catnum).", ";
}
}
}
 ?>
<?php
if (is_array($post_tag)) { ?>こだわり(タグ):<?php
foreach($post_tag as $val){
if ($val === end($post_tag)) {
echo get_term_by('slug',$val,"post_tag")->name;
    }else{
echo get_term_by('slug',$val,"post_tag")->name.", ";
}
}
 ?><br><br><?php } ?>
<?php if (is_array($kodawari)) { ?>こだわり(カスタムフィールドのチェックボックス):<?php
if (is_array($kodawari)) {
foreach($kodawari  as $val){
if ($val === end($kodawari)) {
echo $val;
    }else{
echo $val.", ";
}
}
}
}
 ?>

<?php

query_posts( array(
	'tax_query' => $taxquerysp,
	'meta_query' => $metaquerysp,
	's' => $s,
	)
);

?>

			<?php if ( have_posts() ) : while ( have_posts() ) : the_post(); ?>
<div><?php the_title(); ?></div>
<div><?php the_content(); ?></div>
			<?php endwhile; else : ?>

該当なし

			<?php endif;wp_reset_query(); ?>

「百聞は一見に如かず」です。

絞り込み検索は「tax_query」と「meta_query」で出来てます

「tax_query」と「meta_query」さえ押さえれば楽勝です。指定の仕方によっては様々なパターンの絞り込み検索が可能ですので知らなかった人は要チェックです。

tax_query

meta_query

検索結果ページでのページネーション

これは質問出そうなので押さえておきましょう。
KoToRiはページネーションは「WP-PageNavi」プラグインで実装します。
だって楽なんだもん!

「WP-PageNavi」の使い方は下記記事を参考にしてください。
ページネーションを実装できる「WP-PageNavi」[WordPress]

「WP-PageNavi」でページネーションを付けた場合の検索結果ページのコードはこの様になります。

<?php
$s = $_GET['s'];
$catnum = $_GET['catnum'];
$placenum = $_GET['placenum'];
$type = $_GET['type'];
$low = $_GET['low'];
$high = $_GET['high'];
$post_tag = $_GET['post_tag'];
$kodawari = $_GET['kodawari'];

if($catnum){
	$taxquerysp[] = array(
			'taxonomy'=>'category',
			'terms'=> $catnum,
			'include_children'=>false,
			'field'=>'term_id',
			'operator'=>'AND'
			);
}

if($post_tag){
	$taxquerysp[] = array(
			'taxonomy'=>'post_tag',
			'terms'=> $post_tag,
			'include_children'=>false,
			'field'=>'slug',
			'operator'=>'AND'
			);
}

if($placenum){
	$taxquerysp[] = array(
			'taxonomy'=>'place',
			'terms'=> $placenum,
			'include_children'=>false,
			'field'=>'slug',
			'operator'=>'AND'
			);
}
$taxquerysp['relation'] = 'AND';

if($kodawari){
	foreach($kodawari as $val){
		$metaquerysp[] = array(
				'key'=>'kodawari',
				'value'=> $val,
				);
	}
}
if($type){
	$metaquerysp[] = array(
			'key'=>'type',
			'value'=> $type,
			'compare'=>'=',
			);
}
$metaquerysp[] = array(
			'key'=>'price',
			'value'=>array( $low, $high ),
			'compare'=>'BETWEEN',
			'type'=>'NUMERIC',
			);
$metaquerysp['relation'] = 'AND';

?>

<?php if($s){ ?>検索キーワード:<?php echo $s; ?><br><?php } ?>
<?php if($catnum){ ?>カテゴリ:<?php echo get_cat_name($catnum); ?><br><?php } ?>
<?php if($placenum){ ?>間取りタイプ:<?php echo get_term_by('slug',$placenum,"place")->name; ?><br><?php } ?>
<?php if($type){ ?>ルームタイプ:<?php echo $type; ?><br><?php } ?>
<?php if($low == 0 && $high == 9999999){}else{ ?>家賃:<?php if($low == 0){ ?>下限なし<?php }else{ echo number_format($low).'円'; } ?> ~ <?php if($high == 9999999){ ?>上限なし<?php }else{ echo number_format($high).'円';} ?><br>
<br><?php } ?>
<?php
if (is_array($cutnum)) { ?>カテゴリ:<?php
foreach($cutnum as $val){
if ($val === end($cutnum)) {
echo get_cat_name($catnum);
    }else{
echo get_cat_name($catnum).", ";
}
}
}
 ?>
<?php
if (is_array($post_tag)) { ?>こだわり(タグ):<?php
foreach($post_tag as $val){
if ($val === end($post_tag)) {
echo get_term_by('slug',$val,"post_tag")->name;
    }else{
echo get_term_by('slug',$val,"post_tag")->name.", ";
}
}
 ?><br><br><?php } ?>
<?php if (is_array($kodawari)) { ?>こだわり(カスタムフィールドのチェックボックス):<?php
if (is_array($kodawari)) {
foreach($kodawari  as $val){
if ($val === end($kodawari)) {
echo $val;
    }else{
echo $val.", ";
}
}
}
}
 ?>

<?php

query_posts( array(
	'tax_query' => $taxquerysp,
	'meta_query' => $metaquerysp,
	's' => $s,
	'posts_per_page' => 1,
	'paged' => $paged,
	)
);

?>

			<?php if ( have_posts() ) : while ( have_posts() ) : the_post(); ?>
<div><?php the_title(); ?></div>
<div><?php the_content(); ?></div>
			<?php endwhile; else : ?>

該当なし

			<?php endif; ?>

<?php
wp_pagenavi(); //ページ送り
wp_reset_query();
 ?>

もし2ページ目以降が404エラーになるようでしたら管理画面「設定」→「表示設定」から「1ページに表示する最大投稿数」を「1」に指定すると直るかもしれません。

まとめ

くぅ~疲れました!
思いのほか超大作になってしまいましたね。

大分長いですが、これを読めば絞り込み検索を割とスムーズに実装できるのではないでしょうか。

でも実際に不動産サイトで絞り込み検索が必要なら「不動産プラグイン」使っちゃえばもっと簡単だと思います。
KoToRiは未だ使ったこと無いのですが!

何度も言いますがミソは「tax_query」と「meta_query」です。
今回紹介したのは本当にANDの絞り込み検索に的を絞ったコードですが、指定の仕方によって変化自在です。
ベーシックなコードの書き方はこの記事を参考にしてもらって色々応用を利かせていってもらえればと思いますよ!

チャオ!

シェアする みんなシェアしてね

フォローする フォローする

いつもKOTORI Blogをご覧いただきありがとうございます。Facebook、Twitterを通じて、皆様と交流していき色んな情報を共有していければな~と思ってます。お気軽に登録してください!

基本フォロー返します。

RSSを登録する

RSSはこちらから。

follow us in feedly

Feedly使ってる人はこちらから。

Buy me a Beer

診断ドットコムでちょっとひと息!
動く!パンDのLINEスタンプ
好きな人にアプローチスタンプ
パンDのLINEスタンプ

関連する記事 関連する記事も読んでみてね

コメント

  • ありがとう

    この記事にもっと早く出会いたかったです。これをベースに検索フォームの選択した要素によって、現在のページにて動的に検索結果件数を取得するものを自作したいと思っています。重ね重ねですが、本当にありがとう。

    • kotoriblog

      お役に立ててなによりです!

      「現在のページにて動的に検索結果件数を取得する」
      これができたらヤバいですね!!
      実装できることを願っています。
      そして完成したあかつきには是非実装方法を公開していただきたいです笑

  • とおりすがり

    いつも参考にさせて頂いております。ありがとうございます。
    私用のサイトにて複数条件の検索を、カテゴリとキーワードにして試させて頂きましたところ、どうしても下記にてつまってしまい、ご助言をお願いしたく書き込みさせて頂きます。

    query_postsにおきまして’tax_query’と’s’を組み合わせた検索がヒットしません。
    試しにどちらか片方をコメントアウトしますと正常にヒットします。
    query_postsの用法が異なるのかと推測し、マニュアル等読みテストしましたが、
    何が原因かわからないでおります。。

    藁にもすがる思いでして、どうかよろしくお願い致します。

    • kotoriblog

      はじめまして!

      コメントありがとうございます。

      >query_postsにおきまして’tax_query’と’s’を組み合わせた検索がヒットしません。
      >試しにどちらか片方をコメントアウトしますと正常にヒットします。

      何でしょう。。。ちょっと検討がつきません。
      普通に

      query_posts( array(

      ‘tax_query’ => array(

      array(

      ‘taxonomy’=>’category’,

      ‘terms’=> 11, //カテゴリID

      ‘include_children’=>false,

      ‘field’=>’term_id’,

      ‘operator’=>’AND’

      )

      ),

      ‘s’ => ‘キーワード’,

      ‘showposts’ => 999

      )

      );

      if ( have_posts() ) : while ( have_posts() ) : the_post();

      the_title();

      endwhile; endif;

      こんな感じの単純ループで記事とってこれるか確認してみてください。
      カテゴリIDとキーワードは変更してください。
      もし正常に記事が取ってこれるようでしたら、queryの記述をミスっている可能性がありますね。

      • とおりすがり

        教えて頂きましたコードにて動作の確認が取れました。おっしゃるとおりqueryの記述が誤っていたようです。
        ご回答ありがとうございました。

  • sachi

    こちらのページを参考に、検索ページを作成しています。大変お世話になっています!

    初心者ですが、とても分かりやすい記事だったので、無謀にもチャレンジしてみています。

    超初心者な質問で申し訳ないのですが、

    「タグまたはカスタムタクソノミーで絞り込むチェックボックス以外のパーツの検索結果ページでの記述」

    を参考にしているのですが、

    「「echo get_term_by(‘slug’,$val,”post_tag”)->name;」で「post_tag」を指定していますが、カスタムタクソノミーの場合はタクソノミー名を入れてくださいね。」の部分は、

    「echo get_term_by(‘slug’,$post_tag,”place”)->name;」の事ですかね?

    この場合、タクソノミー名を入れる部分は、どの部分にあたるのでしょうか?

    こんな質問ですみませんが、ご教授いただけるとありがたいです!

    • kotoriblog

      sachiさん
      こんばんは!コメントありがとうございます。

      >「「echo get_term_by(‘slug’,$val,”post_tag”)->name;」で「post_tag」を指定してい>ますが、カスタムタクソノミーの場合はタクソノミー名を入れてくださいね。」の部分は、
      >「echo get_term_by(‘slug’,$post_tag,”place”)->name;」の事ですかね?
      >この場合、タクソノミー名を入れる部分は、どの部分にあたるのでしょうか?

      ここのコードを書き間違えていました笑
      おっしゃる通り、「echo get_term_by(‘slug’,$post_tag,”place”)->name;」の事です。

      タクソノミー名を入れる部分は下記の「タクソノミー名」と書いたところです。
      「echo get_term_by(‘slug’,$post_tag,”タクソノミー名”)->name;」

      記事のコードは修正しました。ありがとうございます。

      記事自体はめちゃくちゃ長くなってしまっていますが、やってることは本当に簡単なのでじっくり行けば完成できると思います。頑張ってください。

      • sachi

        早速お返事いただきありがとうございます!

        教えていただいたコードでトライしてみたのですが、

        何故かうまく検索結果が表示できません。。。

        「カスタムタクソノミーで絞り込むチェックボックスの検索」の方は成功したのですが、

        同じ要領でチェックボックス以外の検索にすると、

        検索結果が絞り込まれず全ての一覧表示になってしまいます。

        試行錯誤しているのですがなかなか解決できず、、

        何かアドバイスいただけるとありがたいです!何度もスミマセン。。

        • kotoriblog

          もしかして、クエリのところでちゃんとタクソノミー名を指定できてないんじゃないですかね。

          if($post_tag){

          $taxquerysp[] = array(

          ‘taxonomy’=>’post_tag’,

          ‘terms’=> $post_tag,

          ‘include_children’=>false,

          ‘field’=>’slug’,

          ‘operator’=>’AND’

          );

          }

          ↓タクソノミー名が「place」で検索フォームのname属性も「place」の場合

          if($place){

          $taxquerysp[] = array(

          ‘taxonomy’=>’place’,

          ‘terms’=> $place,

          ‘include_children’=>false,

          ‘field’=>’slug’,

          ‘operator’=>’AND’

          );

          }

          こうなるんですが合ってますか?

          • sachi

            ありがとうございます!!仰る通りでした!!!
            何とお礼を言っていいのやら。。本当に感謝しております♪
            検索機能を作ろうと思った当初、まさかできるとは思っていなかったので、夢のようです!!

  • yu-chan

    こんにちは。

    カテゴリで絞り込むチェックボックスを参考に試してみた所、正常に動きませんでした。下記の’s’=>$sを削除すると正常にカテゴリー検索の結果が出るのですが、キーワード検索と同時にできませんでした。他の質問の方の回答も見ましたが、やはり、キーワードと同時に検索する方法がわかりません。よければ教えてください

    検索結果

    $taxquerysp,

    ‘s’ => $s,

    )

    );

    ?>

    • kotoriblog

      yu-chanさん

      こんばんは!

      いま確認しなおしてみたところキーワードが未入力の時にうまく絞り込めてませんでした。yu-chanさんの現象もそれが原因かもしれません。

      ●「検索ボタンが押されたら、必ず検索結果ページを表示する」のfunctions.phpに入れるコード

      http://kotori-blog.com/wordpress/refinement_search/#refinement2_1

      ●検索結果ページでの「検索条件」の検索キーワードを出力するタグ

      <?php if($s){ ?>検索キーワード:<?php echo $s; ?><br><?php } ?>

      を修正しました。

      ちょっとこれで試してみてください。

      • yu-chan

        お返事ありがとうございます。正常に動きました!修正ありがとうございます。助かりました。 今後も記事を参考にさせて頂きます。ありがとう!

  • inocchi_68

    こんにちは(^^)いつも参考にさせて頂いています。
    誠にありがとうございますm(__)m
    ものすごく初心者な質問で申し訳ないのですが、
    formタグは実際に表示させるsidebar.phpなどに書けば良いんですよね?
    検索結果ページに記述はどこに書けばいいのでしょう?
    search.phpでしょうか?

    現在身の丈に合わない事にチャレンジしており、
    下記のようなシステムを作りたいのですが、どんづまりの状態ですorz
    http://www.attaka.or.jp/ryoma-pass/passport_list.php

    こちらの絞込検索の記事を参考にさして頂いたら
    似たようなものは作成可能でしょうか?
    漠然とした質問で申し訳ございません。

    • kotoriblog

      inocchi_68さん
      こんばんは。

      コメントありがとうございます。

      >ものすごく初心者な質問で申し訳ないのですが、
      >formタグは実際に表示させるsidebar.phpなどに書けば良いんですよね?
      >検索結果ページに記述はどこに書けばいいのでしょう?
      >search.phpでしょうか?

      そうです。

      >現在身の丈に合わない事にチャレンジしており、
      >下記のようなシステムを作りたいのですが、どんづまりの状態ですorz
      >http://www.attaka.or.jp/ryoma-
      >こちらの絞込検索の記事を参考にさして頂いたら
      >似たようなものは作成可能でしょうか?
      >漠然とした質問で申し訳ございません。

      機能的には実現可能だと思います。
      もちろん動的に切り替わっている部分等のjsは分かりませんが。

      ものすごく初心者なのでしたらWordPressとphpの基本を勉強してからの方が良いかもしれません。コード的には紹介しているものを応用すればいけると思いますがものすごく初心者なんだったら躓くかもしれません。がんばってください!

      • inocchi_68

        kotoriさん

        ご返信ありがとうございます!
        勉強不足で質問してしまってすみません。
        仕事で必要にせまられて、焦って何とかしようとしていましたが、
        やはり基本は大事ですよね…動かない事が多いですorz
        kotoriさんはどうやって勉強されたのでしょうか?
        はい、頑張って作ります!ありがとうございましたm(__)m

        • kotoriblog

          まず普通にキーワード検索を実装する。
          それが出来たらカテゴリでの絞り込みを実装する。
          それが出来たらタクソノミーでの絞り込みを実装する。
          って感じで一気にやろうとするんじゃなくてちょっとずつ完成に近づけていってください。
          KoToRiは仕事でやっているうちに覚えました。

          • inocchi_68

            kotoriさん

            コツコツやってたらちょっとずつ分かってきました!
            私もWebデザイナーを目指しているので、もっとスキルアップ頑張ります!ありがとうございましたm(__)m

  • Fmarinos

    kotoriblog様 はじめまして。

    カスタム投稿タイプを使用して絞り込み検索をしたく訪問いたしました。

    カテゴリーやタグは一般の投稿と重複してしまう為、タクソノミーだけを数種類利用して絞り込み検索を行いたいのですが、うまく絞りこみ出来ませんでした。

    現在は下記の内容にてsearch.phpに記述しておりますが、
    このような場合はどのように記述すれば宜しいでしょうか?

    $s = $_GET[‘s’];
    $post_tag = $_GET[‘post_tag’];
    $post_tag2 = $_GET[‘post_tag2’];

    if($post_tag){
    $taxquerysp[] = array(
    ‘taxonomy’=>’color’,
    ‘terms’=> $post_tag,
    ‘include_children’=>false,
    ‘field’=>’slug’,
    ‘operator’=>’AND’
    );
    }

    if($post_tag2){
    $taxquerysp[] = array(
    ‘taxonomy’=>’type’,
    ‘terms’=> $post_tag2,
    ‘include_children’=>false,
    ‘field’=>’slug’,
    ‘operator’=>’AND’
    );
    }
    $taxquerysp[‘relation’] = ‘AND’;
    ?>

    ぜひご教授下さい。宜しくお願い致しますm(_ _)m

    • kotoriblog

      Fmarinosさん
      はじめまして。

      カスタム投稿タイプの場合、ループのクエリにpost_type=○○を指定しないと記事引っ張って来れないんじゃないですかね。
      試してないんですがCODEX参考に「query_posts」の指定を変更してみてください。

      http://wpdocs.sourceforge.jp/%E3%83%86%E3%83%B3%E3%83%97%E3%83%AC%E3%83%BC%E3%83%88%E3%82%BF%E3%82%B0/query_posts

      • Fmarinos

        kotoriさん
        ご返信ありがとうございます。
        自分なりに色々試してみたいと思います。
        完成した暁には報告いたします(^^)

        • kotoriblog

          KoToRiも時間あるときに検証して記事にしますね^^

  • yu-chan

    お世話になっております。2回目の質問となります。

    カスタムフィールドでの絞り込み検索を実装しようとしているのですが、上記の「カスタムフィールドで絞り込むチェックボックス」を参考に、変数のみ変更して、実装してみたのですが、一つのチェックボックスの検索は可能なのですが、二つ選ぶと記事が表示されませんでした。。。よければ改善策を教えてください

    • kotoriblog

      こんにちは!
      ん~実際にコードを見てみないとアドバイスのしようがありませんね。
      検索結果のコードさらしてもらえますか?

      • yu-chan

        こんにちは!返答ありがとうございます。
        検索結果のコードはこちらとなります
        ‘workplace’,
        ‘value’=> $val,
        );
        }
        }
        $metaquerysp[‘relation’] = ‘AND’;
        ?>

        検索結果

        $metaquerysp,
        ‘s’ => $s,
        )
        );
        ?>

        • yu-chan

          ‘workplace’,
          ‘value’=> $val,
          );
          }
          }
          $metaquerysp[‘relation’] = ‘AND’;
          ?>
          検索結果
          $metaquerysp,
          ‘s’ => $s,
          )
          );
          ?>

          • kotoriblog

            yu-chanさん
            返事が遅れてしまいゴメンナサイ><

            いただいたコードは特に問題なさそうですね。。。。

            一回foreach使用しないで普通にコード書いてちゃんと表示されるか試されましたか?

            $metaquerysp[] = array(
            ‘key’=>’kodawari’,
            ‘value’=> ‘hoge1’,
            );
            $metaquerysp[] = array(
            ‘key’=>’kodawari’,
            ‘value’=> ‘hoge2’,
            );

            って感じで値を直書きしてループさせてみる。

            query_posts( array(
            ‘meta_query’ => $metaquerysp,
            ‘s’ => $s,
            ));

            一度お試しください。

            あと
            http://elearn.jp/wpman/column/c20110915_01.html

            この辺の記事とか参考になるかもです。

  • Takahiro Kosoegawa

    素晴らしい記事です。待ってました!という感じ・・^^;
    定期的に(2年間ぐらい)このネタを
    ググる日々からやっと抜け出せます!笑

    本当に感謝です!ありがとうございます。

    • kotoriblog

      Takahiroさん
      こんにちは!ありがとうございます!!
      お役に立てて本望です!!
      時間掛けて記事つくった甲斐がありました^^

  • Berghilo

    通りすがりですが、yu-chanさんの回答。

    $metaquerysp[‘relation’] = ‘AND’; の
    ANDをORにするといいのではないでしょうか。違っていたらごめんなさい。

    • kotoriblog

      Berghiloさん
      こんにちは!

      コメントありがとうございます。

      $metaquerysp[‘relation’] = ‘AND’;

      の部分は’meta_query’全体に関する指定になるのです。

      個別の条件ごとの比較みたいなものは「’compare’」というのが用意されているみたいなのですが、正直カスタムフィールドのチェックボックスを絞り込むのに適切な値が分かりませんでした笑

      なので、わざわざforeachを使用して、チェックされた値の分だけ条件を追加しています。これで正常に動いたのですがyu-chanさんが何で動かないのか。。。。

  • tokesta

    この記事のお世話になり、なんとかカスタムタクソノミーおよびカスタムフィールドの複合検索を作り上げることができました。ありがとうございました!

    しかし、WP_Page Naviが上記方法をとっても機能しません。具体的には2ページ目移行をクリックしても、1ページ目の表示のままです。(URLには・・/page/2/・・・との表示になるのですが)

    query_posts(codexでは非推奨ぽい?)を使わず、アクションフックpre_get_postsでクエリを拾ってこさせたいですが、自分の力不足でどうも上手く書けないので、何かアドバイスいただけたら嬉しいです。

    • kotoriblog

      tokestaさん
      でこんにちは!返事遅れてしまいごめんなさい><

      >しかし、WP_Page Naviが上記方法をとっても機能しません。具体的には2ページ目移行をクリックしても、1ページ目の表示のままです。(URLには・・/page/2/・・・との表示になるのですが)

      検討違いでしたらごめんなさい。
      検索結果のqueryに下記は入ってますか?
      ‘paged’ => $paged,

      加えて言うと下記に一ページに表示したい記事数をいれます。
      ‘posts_per_page’ => 1,

      「1ページ目の表示のまま」なのであればここのパラメーターの指定がうまくいっていないような気がします。

      因みにKoToRiは「pre_get_posts」なんて使ったことがありません。なのでその辺はアドバイスができないのです。ゴメンナサイ><

      でもKoToRiがつくった参考サイトで「query_posts」でもページネーションは実現できていますので何かしらが間違っているのだと思います。

      「query_posts」使うなって色んな記事で見かけますが何で使っちゃダメなのかイマイチ分からないんです。あまり調べてもいないのですが。。。その辺を逆にアドバイスいただきたいです笑

      • tokesta

        KoToRiさん

        お返事が遅くなってしまいスミマセン!
        ワタシもイロイロ調べて回って、pre_get_postというキーワードにたどり着いたので、なんとも言えないのですが、query_postはメインループを書き換える(?)などするので、サブクエリー(サイドバーウィジェットなどで使用されている?)にも影響を与えてしまうらしいのです。

        query_postsでペジネーションできているのは、テーマにも拠るとかそういう類なのかと想像します。

        pre_get_postsは、自力のみでわからず、知人に協力お願いして

        `function change_posts_per_page($query) {

        if ( is_admin() || ! $query->is_main_query() )

        return;

        if ( $query->is_tax() ) {

        $query->set( ‘posts_per_page’, 5);

        }

        }

        add_action(‘pre_get_posts’, ‘condition_search’);
        `

        さらにcondition_search関数の中で、KoToRiさんのtaxquerysp[]などの定義を続けて書いて、なんとか実装できました!今後も拝見させていただきたいと思います。今回はありがとうございました!

        • kotoriblog

          tokestaさん
          こんばんは。

          こちらも返事が大変遅れてしまいごめんなさい><
          ページャー実装できて良かったです。
          何のお役にもたてませんでしたが><

          tokestaさんの使用しているテーマはオリジナルのものですか?
          KoToRiはオリジナルでテーマを作ってページャーまで実装していますのでテーマによっては何かが邪魔をするのかもですね。

          それはそうとちょっと調べてみたところ「pre_get_posts」は「query_posts」より動作が速いらしいのでKoToRiも「pre_get_posts」にシフトしていきたいと思います。
          ありがとうございました。

  • Pingback: WordPressの絞り込み検索を開発する方法 | インハウスサイト()

  • nishikawa

    初めまして。
    西川と申します。

    初心者の質問で申し訳ありません。
    やっと見つけて1日やってみたのですが上手くいきません・・・

    ”カテゴリで絞り込むチェックボックス”で
    ・functions.phpにコードを追加
    ・formタグ内の記述 をとりあえずPHPウェジットにコピペ
    ここまでは問題ないと思うのですが

    search.phpに”検索結果ページでの記述”を追加したり、上書きしたり色々試しても上手く機能しません。

    検索後は example.com/?s=&catnum[]=8&catnum[]=2
    のようにURLは変わるのですが、内容が変わりません。

    search.phpが間違っていると思うのですが、どのように変更すればよろしいでしょうか。
    お手数ですがご教授下さい。
    以下、search.php


  • nishikawa

    途中で切れてしまったので最初から。


    • kotoriblog

      nishikawaさん
      こんばんは。

      お返事が遅れてしまいごめんなさい><
      search.phpはtwentythirteenのやつそのまんまですか?

      URLが変わっててsearch.phpが表示されてるのであれば、

      get_header();

      get_sidebar();
      get_footer();

      ってなってる「header」と「sidebar」の間に記事で紹介してるコードをとりあえずまるっと入れてみてください。
      このコード

      で、検索キーワードは表示されるか?ループにqueryが効いているか?等を調べてまず問題点を絞り込んでみてください^^

      • nishikawa

        返信遅れて申し訳ありません。

        search.phpはそのまんまです!
        ちょっと今からやってみます。
        ありがとうございます!

  • 椎間板ダリオ

    はじめまして!
    今回、こちらのブログ記事を参照して無事、複数条件での検索フォームを実装することができました。KoToRiさんの記事がなければ、とても実現できなかったと思います。ありがとうございます!

    1点、可能かどうか伺いたいのですが、条件検索時にチェックしたチェックボックスが、検索結果画面ではチェックが外れてしまいます。フリーワード検索欄はvalueにを入れれば済むのですが…
    検索結果ページでも、選択したチェックボックスをそのままチェック状態にしておく事は可能でしょうか?

    当方、WP3.9.1で、カスタムタクソノミーにてチェックボックス選択を実装しています。

    • KoToRi

      椎間板ダリオさん
      こんにちは。返信が1ヶ月も遅れてしまい本当にごめんなさい。すでに解決済みとは思いますが一応お答えいたします。

      >検索結果ページでも、選択したチェックボックスをそのままチェック状態にしておく事は可能でしょうか?

      これは絞り込み検索うんぬんというよりphpで実現可能です。
      このページが参考になるかな?
      特定の値が配列に含まれているか調べる(in_array)

      要はチェックボックスから返ってきた配列のなかに特定の値があるかどうかで、そのinputタグに「checked」を入れるかどうか判定すればよいわけですね。

      チェックボックスの値を「catnum」という配列に格納していると仮定しますと
      テンプレートの上の方で下記のように変数に格納して

      $catnum = $_GET[‘catnum’];

      絞り込み検索フォームのチェックボックスのところを下記のように変えてやればOKです。

      <?php
      $categories = get_categories();
      foreach($categories as $category) :
      if($catnum){
      $keysp=in_array($category->term_id, $catnum);
      }
      ?>
      <label><input type="checkbox" name="catnum[]" value="<?php echo $category->term_id; ?>"<?php if($keysp){ echo ' checked'; } ?>><?php echo $category->name; ?></label><br>
      <?php endforeach; ?>
      

      完璧に動作確認できてないですがちょっと試してみてください。

      ってもう解決してるかもですが><
      よろしくお願いします。

    • kotoriblog

      椎間板ダリオさん

      こんにちは。返信が1ヶ月も遅れてしまい本当にごめんなさい。すでに解決済みとは思いますが一応お答えいたします。

      >検索結果ページでも、選択したチェックボックスをそのままチェック状態にしておく事は可能でしょうか?

      これは絞り込み検索うんぬんというよりphpで実現可能です。

      このページが参考になるかな?

      特定の値が配列に含まれているか調べる(in_array)

      要はチェックボックスから返ってきた配列のなかに特定の値があるかどうかで、そのinputタグに「checked」を入れるかどうか判定すればよいわけですね。

      チェックボックスの値を「catnum」という配列に格納していると仮定しますと

      テンプレートの上の方で下記のように変数に格納して

      $catnum = $_GET[‘catnum’];

      絞り込み検索フォームのチェックボックスのところを下記のように変えてやればOKです。

      <?php
      $categories = get_categories();
      foreach($categories as $category) :
      if($catnum){
      $keysp=in_array($category->term_id, $catnum);
      }
      ?>

      <label><input type="checkbox" name="catnum[]" value="<?php echo $category->term_id; ?>"<?php if($keysp){ echo ' checked'; } ?>><?php echo $category->name; ?></label><br>

      <?php endforeach; ?>

      完璧に動作確認できてないですがちょっと試してみてください。

      ってもう解決してるかもですが><

      よろしくお願いします。

  • Pingback: 【study】wordpress | マイブロ()

  • きんちゃん

    始めまして。お世話になってます。
    今回は絞り込み検索ということで、 ’operator’=>’AND’ としていましたが、AND を OR にして選択したもの全てを表示できないのはなぜなのでしょうか。また、方法があれば教えて頂きたいです。
    お忙しい中すみません

    • kotoriblog

      きんちゃんさん
      初めまして^^コメントありがとうございます。

      ‘operator’にはORという値は無いんです。紛らわしいですが’IN’を使用します。
      下記サイトが参考になりそうなのではっときます。
      http://www.warna.info/archives/287/

      因みに’relation’はANDかORの値を指定します。

  • WP悩める初心者

    はじめまして!
    カスタムフィールド検索を実装しておりますが「カスタムフィールドのチェックボックス」を複数チェックをいれた場合の検索が上手く出来ず困っております。

    if($kodawari){
    foreach($kodawari as $val){
    $metaquerysp[] = array(
    ‘key’=>’kodawari’,
    ‘value’=> $val,

    ‘compare’ => ‘IN’ // カスタムフィールド’kodawari’の値が何れかの投稿
    );
    }
    }

    として「’compare’ => ‘IN’」を追記してもダメでした。

    $metaquerysp[‘relation’] = ‘OR’;
    にする事により上記の問題は解決出来たのですが

    カスタムフィールドがいくつかあり、
    カスタムフィールドごとに

    if($kodawari){
    foreach($kodawari as $val){
    $metaquerysp[] = array(
    ‘key’=>’kodawari’,
    ‘value’=> $val,

    ‘compare’ => ‘IN’
    );
    }}

    if($kodawari2){
    foreach($kodawari2 as $val){
    $metaquerysp[] = array(
    ‘key’=>’kodawari2’,
    ‘value’=> $val,

    ‘compare’ => ‘IN’
    );
    }}

    if($kodawari3){
    foreach($kodawari3 as $val){
    $metaquerysp[] = array(
    ‘key’=>’kodawari3’,
    ‘value’=> $val,

    ‘compare’ => ‘IN’
    );
    }}

    $metaquerysp[‘relation’] = ‘OR’;

    と記述した際、タイムアウトしてしまう程時間が掛かってしまい検索結果が表示されませんでした。

    どのように実装すれば良いかお教え頂けると大変助かります。。。
    ご教示の程、よろしくお願いいたします。

    • kotoriblog

      WP悩める初心者さん

      お返事が大変遅くなってしってごめんなさい。

      WP悩める初心者さんのやりたいことと同じ様な事柄が
      下記のフォーラムで議論されています。
      https://ja.forums.wordpress.org/topic/57605

      ざっと読んだ感じカスタムフィールドではなくカスタムタクソノミーで実装するのが
      話が早い気がするので可能であればどうでしょうか。

      って既に解決済みかと思われますが><

  • takye

    kotori様

    先日はcustomfiled templateのエラーの件でお世話になりました。
    まだ、解決はしてませんが、レンタルサーバーに移してテストしてみようと思っております。

    今日は、この検索について質問させてください。

    丁寧で判りやすいご説明のおかげで、自分でカスタムして検索結果を出せるようになったのですが、その検索結果ページ内で並び替えをさせようと思っています。

    アーカイブページなどでの並び替えは普通にできるのですが、
    検索結果ページで並び替えをしようとすると、何故かトップページに戻ってしまいます。
    とでjavascriptのdocument.forms.submitを使ってphpのgetで値を取る形でやっています。

    ↓が近いです。
    http://blog.anekipedia.com/cus/%E8%A8%98%E4%BA%8B%E4%B8%80%E8%A6%A7%E3%82%92%E3%82%BD%E3%83%BC%E3%83%88%EF%BC%88%E4%B8%A6%E3%81%B3%E6%9B%BF%E3%81%88%EF%BC%89%E3%81%99%E3%82%8B.html

    何かご存知でしたら、ご教授いただけると幸いです。

    • kotoriblog

      takyeさん
      こんばんは!

      多分!レンタルサーバーであれば普通に動くかと思います。
      WordPress4.0のロリポップで動作確認済みです。

      トップページに戻ってしまうということはtitleがNot Foundになってたりしますか?
      一つ心当たりがあるとすれば検索結果ページを表示させるのに必ずname=”s”のパラメータを渡してあげる必要があるので
      <input type=”hidden” name=”s” id=”s” />
      をform内に入れておくという事です。

      これをちゃんとしてるのであれば
      ん~もうちょっと詳しい状況が知りたいですね。
      もし可能ならページのURLとかContactページから送ってもらえれば見ます。
      ただページだけ見てどこまで分かるか微妙なとこではありますが。。。

      • takye

        kotoriさん

        こんばんは!返信ありがとうございます!(2回も同じ投稿してしまいすみません;汗)

        できました!を忘れてました。。
        ありがとうございます。

  • takye

    kotori様

    先日のcustomfiled templateのエラーの際にはお世話になりました。

    まだ解決はしていないのですが、レンタルサーバーに移してテストしてみようと思っています。

    今回は絞り込み検索について質問させてください。
    わかりやすいご説明で、絞り込み検索を付けて、検索結果も反映させることができました。

    この検索結果に並び順のドロップダウンをつけようと思い苦労しています。

    やり方は↓と同じようなものですが、

    http://blog.anekipedia.com/cus/%E8%A8%98%E4%BA%8B%E4%B8%80%E8%A6%A7%E3%82%92%E3%82%BD%E3%83%BC%E3%83%88%EF%BC%88%E4%B8%A6%E3%81%B3%E6%9B%BF%E3%81%88%EF%BC%89%E3%81%99%E3%82%8B.html

    javascriptでformをsubmitさせると、何故か検索結果ページからトップページへ飛んでしまします。

    何か、ご存知でしたらご教授いただけると幸いです。

  • ももかん

    初めまして!
    カスタムフィールドの絞り込み検索に使わせて頂きました。
    説明でドロップダウンは使えないようなことを書かれていましたが、SQLでごにょごにょすれば
    使えますよ!

    • kotoriblog

      ももかんさん
      こんにちは!
      コメントありがとうございます。

      下記の部分のことですか?
      >これもカスタムフィールドの選択肢を取ってくるコードは無いので直で書く必要があります。
      >「直で書く」ということは増えたり減ったりした場合に修正が必要になるということです。
      >これが絞り込み検索にカスタムフィールドを利用する際の欠点ですね。

      確かに直でデータベースから値を引っ張ってくれば出来るはずですね!貴重な情報ありがとうございます。

      しかし、KoToRiはSQL全く分からないのです笑
      なのでその発想にいたりませんでした><
      暇なときにでも是非ともやり方をご教授いただきたいです笑

  • Pingback: 一応コーディング終わりました。 | きょうへいへい日記()

  • kotoriblog

    いよかん@初心者さん

    こんばんは。お返事が大分おくれてしまいごめんなさい。
    お問い合わせありがとうございます。返事はココに書かせていただきます。

    >テキストフィールドに検索ワードを入れないとfront-page.phpに飛んでしまう。
    ということですが、これはやはりfunctions.phpに追加する処理が上手くいっていないのだと思います。
    コピペ問題ないでしょうか?または他に記述がある場合はそれとバッティングしちゃってる可能性もあるかと思います。。。

    あとWordPress4.0から空文字検索でもserch.phpが表示されるようになったらしいのでfunctions.phpの記述をコメントアウトして試してみるとか。参考サイト貼っときます。
    http://morilog.com/wordpress/tips/empty_search_redirect/

    あまり力になれませんが試してみてください。

    • いよかん

      kotoriさん

      いよかんです。
      漠然とした質問にも関わらず、早々にお返事を頂き、本当にありがとうございました。

      function.phpでの記述をもう一度確認しなおしましたが、残念ながらなぜ上手く作動していないのか判明しませんでした。
      何かほかの記述やテーマとのバッティングということなのでしょうか。

      また、諸事情によりwordpress3.0を使用しているため(そもそもこれが原因かもしれません)、お教えいただいたWordPress4.0以降の作動についても試すことができませんでした。

      その後のネットサーフィンの末、下記のブログを拝見し、
      そちらの記述を引用すると、上手くsearch.phpに飛ばすことができました。
      http://goo.gl/dKhhdU

      こちらのみがOKだった原因も不明ですが、kotoriさんのblogを読んで絞り込み検索に挑戦されている方の中で、
      同じような境遇でお困りの方のお役にたつことがあるかもしれませんので、引用しておきます。

      function search_no_keywords() {
      if (isset($_GET[‘s’]) && empty($_GET[‘s’])) {
      include(TEMPLATEPATH . ‘/search.php’);
      exit;
      }
      }
      add_action(‘template_redirect’, ‘search_no_keywords’);

      これで、絞り込み検索自力実装を実現できそうです。
      本当にありがとうございました。

      • kotoriblog

        いよかんさん!

        貴重なコメントありがとうございます。早速記事に反映させていただきました。
        もしかするとWordPress3.0だったらいよかんさんのコードじゃないと動かないかもですね。

        あまりお力になれず申し訳なかったですが無事に解決できて良かったです。
        ありがとうございます!

  • Vasyl Holiney

    役に立つ、読みやすい記事、ありがとう。

    • kotoriblog

      Vasyl Holineyさん
      コメントありがとうございます!!
      そう言っていただけると本当に嬉しいです☆

  • Pingback: juckpot : "絞込み検索後のAdvanced Custom Fieldsのrepeater fieldの値でのソート" | ミリオンハイスクール | ネットビジネス | WordPress()

  • Pingback: WordPressプラグイン無しで絞り込み検索! | ニシ インターナショナル()

  • タロさん

    こんにちは。

    こちらの記事を参考に絞込検索機能を作る事ができました。

    詳しく丁寧に解説いただき大変助かりました。ありがとうございました。

    ただ、1点kotoriさんの解説にない機能を付加したくて自力で頑張ってみましたがどうにもうまくいかず、相談させていただければと思いコメントいたしました。

    その付加したい機能というのが、絞込検索の結果をカスタムフィールドの数値を元に昇順もしくは降順に並べ替えて表示させたいのです。

    〜〜〜〜

    などと記載してみましたが、これだと絞込を無視して、numberの数値順にただ並べ替えただけになってしまいました。
    (*並べ替えをしなければちゃんと絞込検索はできているのですが…)

    もしアドバイスなどをいただければとても嬉しいです。
    よろしくお願いいたします。

    • タロさん

      すいません。タグ消えちゃいました。
      質問の~~~部分には下記が入ります。

      ***
      query_posts( ‘meta_key=rank&orderby=meta_key&order=asc’ );

      if ( have_posts() ) : while ( have_posts() ) : the_post();

      の前に記載してみしたが、
      ***

      • kotoriblog

        タロさん

        初めまして。コメントありがとうございます。

        この記事で掲載しているコードのquery_postsの部分は

        query_posts( array(
        ‘tax_query’ => $taxquerysp,
        ‘meta_query’ => $metaquerysp,
        ‘s’ => $s,
        ‘posts_per_page’ => 1,
        ‘paged’ => $paged,
        )
        );

        こんな感じになっていると思いますが、これに数値でのソートを足せばいいだけと思われます。

        query_posts( array(
        ‘tax_query’ => $taxquerysp,
        ‘meta_query’ => $metaquerysp,
        ‘s’ => $s,
        ‘posts_per_page’ => 1,
        ‘paged’ => $paged,
        ‘meta_key’ => ‘rank’,
        ‘orderby’ => ‘meta_key’,
        ‘order’ => ‘asc’
        )
        );

        こんな感じでしょうか。

        未検証なので保証はできませんが試してみてください。

        • タロ

          ご返信ありがとうございます!

          アドバイス頂いた形にて試してみたところ、希望通りの表示となりました。

          お忙しいところご教授いただきありがとうございました。

          PS
          当初、本気でプラグインの「FE Advanced Search」の購入を検討していました。
          しかし、このkotoriさんのページに出会い時間をかけながらも自力で絞込検索機能をWPに付ける事ができ非常に嬉しく、また大変勉強になりました。

          ありがとうございました。

          • kotoriblog

            タロさん
            おー解決して良かったです!!
            お力になれたようでうれしいです☆

  • wordpress勉強中

    はじめまして。
    地域の病院検索なるものを作ろうと思い、
    ここにたどり着きました。
    考えていたものができそうです。
    ありがとうございます!

    • kotoriblog

      wordpress勉強中さん
      初めましてこんばんは。
      お役に立てて光栄です!
      完成したら是非報告ください!見に行きます!

  • WPカスタム中です。

    はじめまして!
    WPのカスタマイズを初めて2カ月目になりました、カスタマイズ初心者です。
    まさにこちらでご紹介下さっている検索フォームを自サイトに設置したいのですが、
    カテゴリーを自動ではなく、自分で好きな配列(途中で改行や順序の変更など)にしたいのですが、うまくアレンジ出来ませんでした。

    一体どうすれば良いのでしょうか??お助け下さい!

    • kotoriblog

      WPカスタム中です。さん

      こんにちは!コメントありがとうございます。お返事遅れてごめんなさい。

      カテゴリーを自動じゃなく配置したいんだったら、直接テンプレートにHTMLコードを書けばいいと思います。

      因みにカテゴリの順序を簡単に変更するプラグインも存在します。
      「Intuitive Custom Post Order」

  • 大助 中村

    はじめまして
    お伺いしたい事があります
    検索条件でANDとORを混ぜる事は可能でしょうか

    もし可能なようであればお教えいただけないでしょうか
    よろしくお願いいたします

    • kotoriblog

      中村さん

      初めまして。コメントありがとうございます。relationのANDとOR同時に使ってるサンプル探しても無いですね。
      出来ないんじゃないでしょうか?

      やりたい事がわからないので何とも言えませんが、relationとoperator駆使して何とかなりませんか?

      • nakamura

        ご返信ありがとうございます!
        >relationとoperator駆使して….
        wpやphpなど詳しくないので実際どのように駆使すればよいかが分らないです、

        やりたい事は
        不動産物件の一覧表示からの地域や条件による絞り込み検索です
        ・地域等は複数選択可能で選択したいずれかの地域で表示したい(OR)
        ・条件等は複数選択した全ての条件を満たした物件を表示したい(AND)
        上記の様な検索フォームを作りたいと考えています

        可能なのか悩んでいます

        やはりできないのでしょうか

        地域
        if($wpcf_addr){

        foreach($wpcf_addr as $val){

        $metaquerysp[] = array(

        ‘key’=>’wpcf-addr’,

        ‘value’=> $val,

        ‘compare’ => ‘LIKE’,

        ‘operator’ => ‘IN’

        );

        }

        }

        $metaquerysp[‘relation’] = ‘AND’;

        ‘operator’ => ‘IN’を付け加えてみましたがダメでした、

        • kotoriblog

          お返事遅くなってごめんなさい。

          ・地域等は複数選択可能で選択したいずれかの地域で表示したい(OR)

          ・条件等は複数選択した全ての条件を満たした物件を表示したい(AND)

          多分実現可能ですね。

          $wpcf_addrと条件はチェックボックスですよね。

          if($wpcf_addr){

          $metaquerysp[] = array(

          ‘key’=>’wpcf-addr’,

          ‘value’=> $wpcf_addr,

          ‘compare’ => ‘IN’,

          );

          }

          if($wpcf_jyouken){

          foreach($wpcf_jyouken as $val){

          $metaquerysp[] = array(

          ‘key’=>’wpcf-jyouken’,

          ‘value’=> $val

          );

          }

          }

          $metaquerysp[‘relation’] = ‘AND’;

          動作確認してないんですが、何となく汲み取ってもらえれば。

          下記ページの

          http://elearn.jp/wpman/column/c20110915_01.html

          「・カスタムフィールド’addr1’の値が’東京都’の投稿」

          「・カスタムフィールド’addr1’の値が’東京都’、’神奈川県’、’千葉県’の何れかの投稿」

          をANDで条件指定すればご希望の動作になると思います。

  • nakamura

    はじめまして
    お伺いしたい事があります
    検索条件のrelationをANDとORを同時に使用する事は可能でしょうか

  • ぶっちゃん

    はじめまして。こちらの記事を参考にさせていただきました。感謝申し上げます。
    応用して、全体をANDにして部分をOR、全体をORにして部分をANDなどという条件の組み合わせを試したりもして、いろんな組み合わせで検索ができるようになりました。
    ただ、ひとつだけ解決できなかった問題があります。
    記事では、キーワードの検索をするときには、テキストフィールドのnameにsを入れて$sとして扱い、おそらく「Search Everything」プラグインをお使いになるのだと思いますが、これだとまさしく全文が対象になると思います。解決できなかった問題というのは、キーワード検索で特定のカスタムフィールドを対象「外」にしたい場合です。逆向きに言うと、キーワード検索で、タイトル、コンテンツ、特定のカスタムフィールドを対象にする場合になります。
     
    キーワード検索用のテキストフィールドを設けてGET経由で$wとして取得($sはhiddenで)します。
    その値で、指定のカスタムフィールドとともにタイトル・コンテンツをナメるわけですが、この場合、$metaqueryspを生成するにあたってどう指定したらよいのでしょうか?
    コードでいうと、下記の「???」の部分になります。
     
    $metaquerysp[] = array(
    ‘key’=> ??? $w,
    ‘compare’=>’LIKE’,
    );
    $metaquerysp[] = array(
    ‘key’=>’目当てのカスタムフィールド名1’,
    ‘value’=> $w,
    ‘compare’=>’LIKE’,
    );
    $metaquerysp[] = array(
    ‘key’=>’目当てのカスタムフィールド名2’,
    ‘value’=> $w,
    ‘compare’=>’LIKE’,
    );
    $metaquerysp[] = array(
    さらにこのへんに、他のチェックボックスなどの組み合わせ条件
    );
    $metaquerysp[‘relation’] = ‘OR’;
     
    $metaquerysp配列の作り方で様々な検索が可能になるのだと思いますが、タイトルを取得、配列格納する方法がわかりませんでした。あるいはmeta_queryでは無理で、何か別の方法を考える必要があるのでしょうか?コンテンツの方は、あらかじめカスタムフィールドで編集するようにすればいい、という考え方もありますが、タイトルの方はどうにもなりませんでした。
    この問題が解決できれば(想定としてはあまりないですが)、更新や公開日時での絞り込みなどもできるのかもしれませんね。

    • kotoriblog

      ぶっちゃんさん

      返事が遅くなってしまって申し訳ないです。

      色々調べてみたのですが
      ぶっちゃんさんが希望している動作を実現する方法が分かりませんでした。

      一つのキーワードで、タイトルと本文とカスタムフィールドをANDではなくORで検索するということですよね。
      query_posts( array(
      ‘meta_query’ => $metaquerysp,
      ‘s’ => $s,
      )
      );
      これだとカスタムフィールドにキーワードが含まれててもタイトルまたは本文にキーワードが入ってないと表示されないという事になってしまうということですよね。

      タイトルと本文もカスタムフィールドにしちゃうしか無いのでしょうか。

      ん~お力になれずすみません。

  • crosscontinue

    すごく分かりやす説明で助かりました! tax_query, meta_query の理解がさらに深まったように思います!
    すごく良いエントリーでした!

    • kotoriblog

      crosscontinueさん
      初めまして!
      どうもありがとうございます。このエントリー約3日費やしました笑
      そういっていただけると嬉しいです☆

  • 悩みの小次郎

    はじめまして
    色々参考させていただいているwp初心者のものです。
    なかなか絞り込み検索が自サイトで出来ずに悩んでおります。

    Advanced Custom Fields
    フィールドタイプ:チェックボックス
    フィールド名:st
    選択し: st1 : 指定なし
          st2 : 1時間
          st3 : 当日中
          st4 : 翌日以降

    この様に設定しており、商品に合った選択肢すべてチェックし、検索されるときはラジオボタンで
    どれかに該当すれば表示されるようにしたいのです。

    検索結果ページ(search.php)

    ‘st’,
    ‘value’=> $st,
    ‘post_type’=>’page’,
    );
    }
    ?>

    カスタムフィールド:
    $metaquerysp,
    ‘s’ => $s,
    )
    );
    ?>

    お探しの記事は見つかりませんでした。

    検索キーワードを変更し下記より再検索してください。

    固定ページ(page.php)

    <form method="get" id="searchform" action="”>

    審査時間(最短)

    指定なし
    1時間以内
    当日中
    翌日以降

    この様に現在記述しているのですが、上手く表示されません。

    キーワード検索では上手く該当する固定ページが検索画面に表示されます。

    しかし、ラジオボタンで検索すると検索結果ページには行かず、wp内の404ページに移行
    してしまいます。
    st2の1時間で検索した場合、URLもhttp://○○○.com/<?st=st2となり、/あとに<が入ってきます。
    キーワード検索ではこの様な事はなりません。

    PHPをいじったりするのは初めてで、色々調べましたがかなり悩んでおります。
    ご教授いただけると、大変有難いです。

    • 悩める小次郎

      すみません。上手くコードが記入出来ませんでした。

      • kotoriblog

        悩める小次郎さん
        コメントありがとうございます。

        キーワード検索すると検索結果ページが表示されて
        ラジオ選択だけだと404ってことは、下記に載ってる処理すれば検索結果ページが表示されると思います。
        「検索ボタンが押されたら、必ず検索結果ページを表示する」
        http://kotori-blog.com/wordpress/refinement_search/#refinement2

  • NOT検索

    はじめまして。

    ほとんど初心者ですが、このページのおかげで非常に助かっております。

    1点質問させていただきたいのですが
    カスタムフィールドのチェックボックスで
    ‘compare’ => ‘NOT IN’
    等(!=やNOT LIKE)を指定してもnot検索として稼働せず
    and検索がor検索として稼働するかのような?状態になってしまいます。

    単純に以下のように追加しているだけで

    if($kodawari){
    foreach($kodawari as $val){
    $metaquerysp[] = array(
    ‘key’=>’kodawari’,
    ‘value’=> $val,
    ‘compare’ => ‘NOT IN’

    ここに =、IN、LIKE 等を設定すると通常通り機能します。
    チェックボックスでNOT系?を動かすためには何か別のポイントがあるのでしょうか?

    • kotoriblog

      NOT検索さん
      コメントありがとうございます。

      foreach($kodawari as $val){
      ・・・
      }
      で囲ってるから値が一個づつ代入されるのでcompareが効かないと思います。
      compare効かせるなら
      http://elearn.jp/wpman/column/c20110915_01.html
      このページの「・カスタムフィールド’addr1’の値が’東京都’、’神奈川県’、’千葉県’の何れかの投稿」のコードを参考にしてください。

  • tanaka

    はじめまして。wordpressの勉強しながら絞り込み検索も作成しようと思い、kotoriさんの記事を参考に(ほぼコピペですが。笑)実装が完了しました!
    とても参考になる記事をありがとうございます。

    一つどうしても詰まる所がありいろいろ試してみましたが、
    わからないことがありお聞きしたいことがあります。

    例えば、絞り込み検索でバス・トイレ別で検索をして
    検索結果で3件ヒットしたものをさらに
    駅から徒歩5分以内、徒歩10分以内、徒歩15分以内(それぞれvalue = 5,10,15)をカスタムフィールドの数値を元に
    昇順(駅から近い)降順(駅から遠い)順に並び替えて表示したいのです。

    検索結果のページに以下のように駅から近い順・駅から遠い順に並び替えるリンクをそれぞれつけたのですが、うまく反映されず、並び替えが行われないままもう一度同じ検索結果順が表示されてしまいました。

    駅から近い順

    駅から遠い順

    また、orderby=meta_value&meta_key=timeをorderby=meta_key&meta_key=timeに変更してみましたが、特にかわりありませんでした。

    検索結果でカスタムフィールドの値でさらに昇順降順に並び替えることは可能なのでしょうか?

    お忙しいとは思いますが、何かアドバイスをいただけると幸いです。

    • tanaka

      タグが表示されたいませんでしたので、記載しておきます。
      a href=’サイトURL/?s=&catnum=&placenum=&type=&low=0&high=9999999&kodawari%5B%5D=バス・トイレ別&submit=検索&orderby=meta_value&meta_key=time&order=asc”駅から近い順 /a

      a href=’サイトURL/?s=&catnum=&placenum=&type=&low=0&high=9999999&kodawari%5B%5D=バス・トイレ別&submit=検索&orderby=meta_value&meta_key=time&order=desc”駅から遠い順 /a

      • kotoriblog

        tanakaさん
        コメントありがとうございます。
        検索結果の並び順を、カスタムフィールドの駅からの距離でソートするという理解でいきます。
        駅距離のフィールド値は10,15,20と数値オンリーです。

        query_postsの条件に下記追加で並び替えできました。
        ‘orderby’ => ‘meta_value’,
        ‘order’ => ‘desc’,
        ‘meta_key’ => ‘ekikyori’, //カスタムフィールド名

        試してみてください。

        • tanaka

          kotoriさん

          ご返事ありがとうございます。

          query_postsにkotoriさんの条件で検索結果の並び替えまではできたのですが、
          その場合だと、常に駅から近いor遠い状態でしか検索できませんでした。。。

          検索結果で絞り込んだ後に、さらにユーザーが駅から近い順、駅から遠い順や築年数が新しい順、古い順などでさらに順番を昇順、降順に並び替えする方法はありますでしょうか?
          どちらもフィールド値は数値オンリーの状態です。

          例を挙げると、完全に同じではないですが、
          アットコスメのように検索後、発売日順や関心度順で並び替えるといった感じです。
          http://cosmeet.cosme.net/product/search/page/0/sad/0/srt/4/fw/%83N%83%8A%81%5B%83%80

          質問内容がわかりにくく、申し訳ありませんが、ご教授お願いいたします。

          tanaka

          • kotoriblog

            tanakaさん

            コメントありがとうございます。
            解決されたようで良かったです☆

  • saya

    初めまして。コメント失礼いたします。

    以前別の記事でもkotoriさんには大変お世話になりました。

    今回、プラグインを使わず物件情報サイトを作成しようと調べている中

    kotoriさんの記事にヒットしました。

    いつもタメになる記事をありがとうございます。

    一つだけ作成している際につまずいてしまい、お伺いしたいことがあります。

    今回、物件情報サイトをタグまたはカスタムタクソノミーで絞り込むチェックボックスを使用して作成させていただいております。

    チェックボックスの項目は上手く検索結果ページに表示できましたが

    それ以外(プルダウン)が検索結果ページに飛んでも、すべての結果が表示されてしまいます。

    質問内容ですと、以前コメントをされているsachiさんと同様の悩みになるのですが

    kotoriさんがsachiさんにコメントで送られた対処法も上手くいかず、四苦八苦な状態です。

    お時間があるときで構いません。お返事を頂けますと幸いです。

    どうぞよろしくお願い致します。

    • kotoriblog

      sayaさん
      コメントありがとうございます。
      おそらくクエリの指定がうまくいってないんだと思いますが、コードを見ないと分かりません。
      該当部分のコードを見せてください!
      あっ返事が遅れてしまいごめんなさい。

  • lee

    はじめまして。
    記事を見て色々試してみましたが、なかなかできませんでした。
    カスタム投稿と投稿を一緒に表示したいですが、可能ですか?
    どうすればいいですか?

    • kotoriblog

      leeさん
      コメントありがとうございます。

      >カスタム投稿と投稿を一緒に表示したいですが、可能ですか?
      これはこの記事の内容とは関係ないですね。
      「post_type 複数」とかでググれば情報出てくると思います。

  • 松崎

    初めまして初心者ですが、絞り込み検索を作りたくてここのブログにたどり着きました。とても勉強になりました、ほとんどコピペですが、作ってみました。
    テーマはtwentythirteenなのですが、nishikawaさんへのkotoriのアドバイスしている通りにしてみたのですが、検索はうまくいくのですが表示が思ったようにいきません。
    https://uploads.disquscdn.com/images/85c7bf78fecd84d133ffc5fe87430a41c65c6ddee95fcd50c9a3c965f15d2a6a.jpg
    上の画像のようにしたいのですが
    https://uploads.disquscdn.com/images/97455dc75ba8469f3c0bb315cbf8440b1549b05e9c25ab444b68619ffe4dfcdd.jpg
    このように左に寄って変な風に表示されてしまいます。

    多分PHPの事をわかってない私が悪いのでしょうが、もしよろしければアドバイスお願いします。

    • kotoriblog

      松崎さん
      コメントありがとうございます。お返事が大変遅れてしまいごめんなさい。
      それはPHPというよりCSSの問題かもしれませんね。dotinstall等でCSSの学習をおススメします。
      http://dotinstall.com/
      それかURLお教えいただければもうちょっと助言できるかもしれません。もう遅いと思いますが。。

  • まるちゃん

    はじめまして。
    こちらの記事、とっても勉強になり、また助かりました。ありがとうございます。
    なんとか下記のような検索フォームを完成させる事が出来たのですが、
    何故か、個別ページ(page.php)に限り、
    フォーム内のタグのチェックボックスのみが表示されません。
    今現在、page.phpにはheader含め他のちゃんと表示されているページと内容は変わらず
    (page.php)には、未だしか入れていません。
    原因を探っていますが見つけられず困っています。
    もし、わかる事が有れば教えていただきたいのですが…。

    <form method="get" id="searchform" action="”>

    カテゴリー

    <input type="checkbox" name="catnum[]" checked="checked" value="term_id; ?>”>name; ?>

    タグ
    get_post_type(), ‘taxonomy’ => $taxonomy_name, ‘term’ => $taxonomy->slug ) );
    if($tax_posts):
    ?>
    <input type="checkbox" name="post_tag[]" value="slug; ?>”>name; ?>

    お忙しいところ申し訳御座いませんが、お返事いただけると幸いです。

    • まるちゃん

      すみません↑の7行目の、「未だしか入れていません。」の部分は
      未だ、headerとfooterのインクルードタグしか入れていません。です。

      • kotoriblog

        まるちゃん
        コメントありがとうございます。お返事が遅くなってしまいごめんなさい。
        ん~実際のサイトみないと何ともいえないので、できればサイトのURLを教えてもらえたらご助言できるかもしれません。

        • まるちゃん

          お忙しい中お返事いただきありがとうございました。
          結局、原因はわからなかったのですが
          taxonomyではなくtagsにすることで解決致しました。
          ありがとうございました!

  • WP初心者

    是非とも絞り込み検索をプラグインを使わずにチェックボックスの検索ボックスを作ってみたいのですが、simplicity2のテーマを使っていますが、検索結果のソースをどこにいれていいかわかりません。searchpage.php作ってみたのですが、うまくいきませんでした。教えていただけたら幸いです。

    • WP初心者

      何度も申し訳ありません。上記の悩みは子テーマにindex.phpを作る事で解決しました。検索もうまくいっているのですが、記事本文を表示するのではなく記事一覧表示にすれば、どうすればいいでしょうか。あと、タグをを入れてもとってきてくれません、忙しいとは思いますがよろしくお願いします。

      • WP初心者

        ここのテンプレートタグをいじればいいのでしょうが、http://www.wordpressmatome.com/%E8%A6%9A%E3%81%88%E3%82%8B%E3%81%B9%E3%81%8Dwordpress%E3%83%86%E3%83%B3%E3%83%97%E3%83%AC%E3%83%BC%E3%83%88%E3%82%BF%E3%82%B0/ちょっと悩んでいます。よくある検索結果のようにタイトルがあり本文が少し抜粋されててタイトルから記事ページに飛びたいのですが…。

        • kotoriblog

          WP初心者さん
          コメントありがとうございます。

          記事一覧表示とは、記事概要を表示するということですか?
          であれば、
          the_excerpt();
          タグを使用すればよいかと。

          タグをとってきてくれない
          とはどういうことでしょうか。
          the_tags();
          などで表示されませんでしょうか。

  • Hisanori Sakurai

    ACFを使ったカスタム検索、とても有意義に使わせてもらっています。

    この絞り込み検索を独立して使用する分には問題はないのですが、GETに渡す前から、選択中の項目を一覧表示する場所を作りたくて
    「js】フォームの内容を特定の要素に即反映」(http://qiita.com/ituki_b/items/a005d9dad33abe333857#%E6%99%AE%E9%80%9A%E3%81%AEjs%E3%81%AE%E5%A0%B4%E5%90%88)
    の「普通のjsの場合」というのをもとに書いてみました。
    チェックボックスしか使用しない絞り込みなのですが、inputタグのNAMEが配列になっていると動かないようで・・・

    inputのnameを配列にしない方法でこの絞り込み検索は動かすことはできないでしょうか・・・?

  • mu-ni

    テキスト検索にカスタムフィールドの項目も含めたく、プラグイン「Search Everything 8.1.9」を入れたのですが、テキスト検索は正常に動作するのですが、他の絞り込み検索が正常に動作しなくなってしまいました。(結果が該当なしになってしまう)これはなぜなのでしょう。もし何か分かるのであればご教授いただきたくコメントさせていただきました。何卒よろしくお願いいたします。

    • kotoriblog

      mu-niさん
      お返事が遅れてしまい申し訳ありません。もう解決されてるかと思いますが回答します。
      結論から申し上げると「Search Everything」のバージョンアップにより本記事で紹介している方法では正常に動作しなくなってしまったようです。
      解決策としてはkotoriのサンプルサイトで正常に動作しているバージョンをインストールすることを提案します。リンク置いときます。
      https://downloads.wordpress.org/plugin/search-everything.8.0.zip

  • へっぽこ

    初めまして。絞り込み検索の記事を拝見し、それをもとにして何とか動作してくれるページを作ることが出来ました。
    もう本当にありがとうございます!の気持ちでいっぱいだったのでまずはお礼をかねてコメントさせていただきました。

    僕は今回全てカスタムフィールドを使って動作するものを作りました。
    検索結果のページを見ていて、カスタムフィールドの数値で並び替えが出来る機能を追加できないものかと思ったのです。
    「FE Advanced Search」のデモにも搭載されているのですが、やってみようとかなりの時間検索したり試したりをしたのですが全くだめでした。

    もしKotoriさんがそのようなことを試されたことがあれば、お聞かせいただけないかと思いまして。
    現状、絞り込みができるようになっただけでひとまずは大満足なので、気長に検証してみようと思います。

    • kotoriblog

      へっぽこさん
      コメントありがとうございます!お役に立ててこちらも嬉しいです!!

      >検索結果のページを見ていて、カスタムフィールドの数値で並び替え
      試していないのでアイデアベースになります。
      下記の前提条件でゴリゴリコーディングすればいけそうな気がします。

      ・ソートの種類は「?sort=1」などGETパラメーターで判別
      ・検索結果ページに設置するソートボタンは、現在のURL+GETパラメータのURLでページ切り替え

      まとまった時間とれたら実際に検証してみますね!!

  • てんてん

    こちらの方法だと、検索後に「1つの記事が表示される」のですね。勉強になります。ありがとうございます。
    ところで、「1つの記事が表示される」でなく、「1つの記事にカスタムフィールドの内容がリスト表示される」という方法がこちらにありました。
    https://kurubusi.net/expertise/webblog/wp-suumo/search/
    どぞご参考に。

  • てんてん

    プラグインがありました!
    Ultimate WP Query Search Filter
    ご報告まで~^^

    • kotoriblog

      てんてんさん
      コメントありがとうございます!また情報提供ありがとうございます!!やっと使えそうなプラグイン出てきましたか。この記事書いてから3年たってますからね~!絞り込み検索なんぞ難しい設定なしでプラグイン一発で実装できるべきだと思います!どんどん便利になっていけばいいと思います!!

  • takuchan

    はじめまして!
    kotoriさんのサイトを参考にカスタムフィールドでの絞り込み検索を実装しました。
    ですが、検索結果ページでは選択したチェックボックスが外れてしまいます。
    カスタムタクソノミーでの方法はご回答されておりますが、
    カスタムフィールドにおいての検索結果ページでも、選択したチェックボックスをそのままチェック状態にしておく事は可能でしょうか?
    ご教示の程、よろしくお願いいたします。

  • NAOYA TAKEI

    カスタムフィールドの内容を個別のinputから検索して表示させたいという思いで検索し、ここにたどり着きました。
    検索自体はでき、検索結果も表示できるようになりました。ありがとうございます。
    ただ、検索結果のヒット数を表示させたいと思っているのですが、どうすれば表示できるのかわかりません。
    また、カスタムフィールドでプルダウンにしている項目を自動で取れれば便利だとうなと考えているのですが、実装方法がわかりません。
    WPどころかプログラムもほとんど触ったことがない人間なので、要領を得ないご質問で恐縮ですが、以下の2つを実装できればと思っています。
    1.検索結果に検索結果のヒット数を表示したい
    2.特定のカスタムフィールドのプルダウンとして登録している内容を自動で取りたい
    カスタムフィールドの実装は「Advanced Custom Fields」です。
    古い記事へのご質問なので、もう見ていないかと思いますが、お返事をいただければ幸いです。

    • NAOYA TAKEI

      上記1はなんとか解決しました。
      ただ、ページ送りが出来ません。

      $metaquerysp,
      )
      );
      ?>

      があるとページ送りが出来ず、無いと(当然)検索ができません。
      何か良い歩法はないでしょうか?

      • NAOYA TAKEI

        なんとか手探りですが、実装できました。
        大変参考になりました。がりがとうございます。

  • 初心者がんばってる

    いつも参考にさせてもらってます。有用な記事をたくさんありがとうございます。
    質問なのですが。記事を参考にさせてもらいソースまるまるコピーで
    動作テストをしているのですが。
    間取りのタクソノミーの検索部分は(タクソノミーネームは place です)
    全て検索結果に含まれてしまい困っています。
    検索画面の間取りからどれを選んでもすべての物件が出てきてしまいます。
    1DKでも2DKでも、選択していないものまで全てです。ことりさんのデモを見る限り正常に動いているので
    私のタクソノミーの記述が何か間違っているようなので。予測つく範囲でいいのでご教授いただけるとうれしいです。
    CPTUIでタクソノミー追加をスラッグとラベルを placeで投稿タイプPOSTに設定してあります。

  • 45RPM

    すみません。なんだか、ソースコードうまく表示されない箇所があります。基本KoToRi様のソースをコピーしています。

  • 45RPM

    初めまして、KoToRi様、複数ドロップボックスからのAND検索でググってましたら、ようやく辿り着きましてうまくいった喜んでいました。ありがとうございます。

    しかし、検索条件を何も入れないと、関係ない投稿、固定ページがヒットしてしまいます。

    これは、どこがいけないのでしょうか。下記がソースコードになります。

    カテゴリーの複数(3個)のドロップボックになります

    search-form.php

    search.php

    $s = $_GET[‘s’];

    $catnum1 = $_GET[‘catnum1’];

    $catnum2 = $_GET[‘catnum2’];

    $catnum3 = $_GET[‘catnum3’];

    if($catnum1){

    $taxquerysp[] = array(

    ‘taxonomy’=>’category’,

    ‘terms’=> $catnum1,

    ‘include_children’=>false,

    ‘field’=>’term_id’,

    ‘operator’=>’AND’

    );

    }

    if($catnum2){

    $taxquerysp[] = array(

    ‘taxonomy’=>’category’,

    ‘terms’=> $catnum2,

    ‘include_children’=>false,

    ‘field’=>’term_id’,

    ‘operator’=>’AND’

    );

    }

    if($catnum3){

    $taxquerysp[] = array(

    ‘taxonomy’=>’category’,

    ‘terms’=> $catnum3,

    ‘include_children’=>false,

    ‘field’=>’term_id’,

    ‘operator’=>’AND’

    );

    }

    $taxquerysp[‘relation’] = ‘AND’;

    $metaquerysp[‘relation’] = ‘AND’;

    if (is_array($cutnum1)) { ?>カテゴリ1:カテゴリ2:カテゴリ3: $taxquerysp,

    ‘meta_query’ => $metaquerysp,

    ‘s’ => $s,

    )

    );

    こんな感じです。

    ご教授、よろしくお願い致します。

  • なんとかしたいボランティア

    こんにちは!現在、FC2ブログなどで作ったホームページをワードプレスに引っ越しするべく、作業をしておるものです。

    溜まっている記事を有効に検索するためにここでも紹介されているようなプラグインや、phpのサイトなど見てみたのですが、うまくいかず、ここへ辿り着きました。かなり古い記事のようなので反応があれば嬉しいですが…

    当サイトは山登りサークルのページで、もちろんカテゴリごとの検索も必要なのですが、検索対象のページは投稿日が山に行った日になっているので、例えば2010年にはどんな山に登ってるかな?とか、年は関係なく8月はどんな山に登ってるかな?等を検索したいです。

    なので、実現したいのは、フリーワードや、カテゴリと同じように年だけの検索項目、月だけの検索項目を作りたいのですが。。。いかがでしょうか。伝わりますでしょうか。

    またできたら、年だけの検索項目、月だけの検索項目はドロップダウンメニューで表示し、選択できる年月は検索対象のデータから引っ張ってきて表示できる(ユーザー入力でない)と一番いいのですが。。。

    サイトのリニューアル作業にかなり時間もかかってしまって追い込まれているのでお助け願えればと思います。

    宜しくお願い致します。