質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

90.62%

  • PHP

    19786questions

    PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

  • WordPress

    6943questions

    WordPressは、PHPで開発されているオープンソースのブログソフトウェアです。データベース管理システムにはMySQLを用いています。フリーのブログソフトウェアの中では最も人気が高く、PHPとHTMLを使って簡単にテンプレートをカスタマイズすることができます。

カスタム投稿のカスタムフィールドの検索について

解決済

回答 1

投稿

  • 評価
  • クリップ 2
  • VIEW 1,090

ssk

score 269

wordpressの検索についてです。
http://kotori-blog.com/wordpress/refinement_search/#refinement10_1
↑こちらのサイトを参考に進めているのですが、意図した結果が得られず困っています。(検索の範囲をカスタム投稿だけにしているつもりなんですが、なぜか特定の固定ページ2件が表示されてしまいます。)


page.php
<form method="get" id="searchform" action="<?php bloginfo("url") ?>">
<input type="text" name="s" id="s" placeholder="検索" />
<select name="low">
<option value="0" selected>範囲指定なし</option>
<option value="2009">テキスト</option>
<option value="2008">テキスト</option>
<option value="2007">テキスト</option>
<option value="2006">テキスト</option>
<option value="2005">テキスト</option>
<option value="2004">テキスト</option>
<option value="2003">テキスト</option>
<option value="2002">テキスト</option>
<option value="2001">テキスト</option>
<option value="2000">テキスト</option>
<option value="1999">テキスト</option>
<option value="1998">テキスト</option>
<option value="1997">テキスト</option>
<option value="1996">テキスト</option>
<option value="1995">テキスト</option>
</select>以上
<select name="high">
<option value="0" selected>範囲指定なし</option>
<option value="2009">テキスト</option>
<option value="2008">テキスト</option>
<option value="2007">テキスト</option>
<option value="2006">テキスト</option>
<option value="2005">テキスト</option>
<option value="2004">テキスト</option>
<option value="2003">テキスト</option>
<option value="2002">テキスト</option>
<option value="2001">テキスト</option>
<option value="2000">テキスト</option>
<option value="1999">テキスト</option>
<option value="1998">テキスト</option>
<option value="1997">テキスト</option>
<option value="1996">テキスト</option>
<option value="1995">テキスト</option>
</select>以下
<input type="submit" value="検索" />
</form>

search.php
<?php
//値を取得
$s = $_GET['s'];
$low = $_GET['low'];
$high = $_GET['high'];
//meta_query用
$metaquerysp[] = array(
            'key'=>'フィールド名',
            'value'=>array( $low, $high ),
            'compare'=>'BETWEEN',
            'type'=>'NUMERIC',
            );
?>
<?php
query_posts( array(
  'post_type' => 'カスタム投稿名',
    'meta_query' => $metaquerysp,
    's' => $s,
    )
);
?>
<!--ここから表示-->
<?php if ( have_posts() ) : while ( have_posts() ) : the_post(); ?>
ループの内容
<?php endwhile; else : ?>
該当なし
<?php endif; ?>
<?php wp_reset_query(); ?>

という書き方をしているのですが、どこか間違っているでしょうか?
  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 1

checkベストアンサー

0

WordPress 4.3.1
テーマ手を入れてない Twenty Fifteen で試してみた所上記のコードで問題なく動作していました。

もしかして、<?php wp_reset_query(); ?>より下などに、元のsearch.php のhave_posts()などがあったりしませんでしょうか?
検索フォームそのものは<input type="text" name="s" id="s" placeholder="検索" />の文字列で検索 (※未入力の場合は空文字で検索)しているので、query_postsでクエリを書き換えている箇所以外では文字での検索結果になっていますので、元のクエリに戻してwhile ( have_posts() ) : the_post(); ?>のような処理があると、文字での検索結果が表示されます。

// search.php
<?php if(isset($_GET['low']) && isset($_GET['high'])): ?>
<?php
//値を取得
$s = $_GET['s'];
$low = $_GET['low'];
$high = $_GET['high'];
  /* 略 */
?>
/* 略 */
<?php wp_reset_query(); ?>
<?php endif; ?>
上記のように$_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
<?php if(isset($_GET['low']) && isset($_GET['high'])): ?>
<? 
//値を取得
$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,
));
?>
<!--ここから表示-->
<?php if ( $cutomSearchPosts->have_posts() ) : while ( $cutomSearchPosts->have_posts() ) : $cutomSearchPosts->the_post(); ?>
ループの内容
<?php endwhile; else : ?>
該当なし
<?php endif; ?>
<?php wp_reset_query(); ?>
<?php endif; ?>

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2015/09/19 10:04

    KiKiKi_KiKiさん
    解説ありがとうございます。助かりました。
    固定ページが表示される件は、表示される2つの固定ページを削除後、再度同じ固定ページを作ると表示されなくなりました。

    検索も意図した結果が得られました。ありがとうございます><

    キャンセル

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 90.62%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る

  • PHP

    19786questions

    PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

  • WordPress

    6943questions

    WordPressは、PHPで開発されているオープンソースのブログソフトウェアです。データベース管理システムにはMySQLを用いています。フリーのブログソフトウェアの中では最も人気が高く、PHPとHTMLを使って簡単にテンプレートをカスタマイズすることができます。