質問: wordpressの検索についてです。 http://kotori-blog.com/wordpress/refinement_search/#refinement10_1 ↑こちらのサイトを参考に進めているのですが、意図した結果が得られず困っています。(検索の範囲をカスタム投稿だけにしているつもりなんですが、なぜか特定の固定ページ2件が表示されてしまいます。) page.php ``` "> 範囲指定なし テキスト テキスト テキスト テキスト テキスト テキスト テキスト テキスト テキスト テキスト テキスト テキスト テキスト テキスト テキスト 以上 範囲指定なし テキスト テキスト テキスト テキスト テキスト テキスト テキスト テキスト テキスト テキスト テキスト テキスト テキスト テキスト テキスト 以下 ``` search.php ``` 'フィールド名', 'value'=>array( $low, $high ), 'compare'=>'BETWEEN', 'type'=>'NUMERIC', ); ?> 'カスタム投稿名', 'meta_query' => $metaquerysp, 's' => $s, ) ); ?> ループの内容 該当なし ``` という書き方をしているのですが、どこか間違っているでしょうか?
回答: WordPress 4.3.1 テーマ手を入れてない Twenty Fifteen で試してみた所上記のコードで問題なく動作していました。 もしかして、``より下などに、元のsearch.php の`have_posts()`などがあったりしませんでしょうか? 検索フォームそのものは**の文字列**で検索 (*※未入力の場合は空文字で検索*)しているので、`query_posts`でクエリを書き換えている箇所以外では**文字での検索結果**になっていますので、元のクエリに戻して`while ( have_posts() ) : the_post(); ?>`のような処理があると、文字での検索結果が表示されます。 // search.php ``` /* 略 */ ``` 上記のように`$_GET['low']`と`$_GET['high']`が無ければ絞り込み検索を実行しないようにして、URLのパラメーターを`?s=`だけにしたときに同じ*特定の固定ページ2件*が表示されているのであれば、上記の文字での検索結果が表示されている可能性が高いかと思います。 少し話は違うのですが、`query_posts()`はメインクエリを書き換えてしまう関数のため**非推奨**になっているので、処理としてあまりよろしくないかと思います。 テンプレートタグ/query posts > 注 1: この関数はプラグインまたはテーマの中で使われることを想定されていません。後ほど出てくる説明にあるように、メインクエリーを変更するにはパフォーマンス面でも優れたより良いオプションが存在します。 > 注 2: query_posts() はページ内のメインクエリーを書き換え、新しいクエリーのインスタンスと置き換えるために使う関数としては過度に単純化され、問題が発生しやすい方法です。非効率的で(SQL クエリを再実行します)、一部の状況では適切に実行することもできません(特にページング処理)。モダンな WordPress コードではもっと安定したメソッドを使うべきです。例えばpre_get_posts フックを使った方法などです。ひとことで言うと、query_posts() は決して使うべきではありません。 > 一般的な投稿の取得には、WP_Queryか、get_postsを使ってください。 また、上限の`high`が**範囲指定なし**の時 XXXX〜0の間で検索しているので、0件の取得になってしまっているかと思います。 以上2点を修正した例を書いておきます。 search.php ``` //値を取得 $s = $_GET['s']; $low = intval($_GET['low']); $high = intval($_GET['high']); if($high > 0) { $value = array( $low, $high ); $compare = 'BETWEEN'; } else { $value = $low; $compare = '>='; } //meta_query用 $metaquerysp[] = array( 'key' => 'price', 'value' => $value, 'compare' => $compare, 'type' => 'NUMERIC', ); ?> $cutomSearchPosts = new WP_Query(array( 'post_type' => 'book', 'meta_query' => $metaquerysp, 's' => $s, )); ?> have_posts() ) : while ( $cutomSearchPosts->have_posts() ) : $cutomSearchPosts->the_post(); ?> ループの内容 該当なし ```