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

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

新規登録して質問してみよう
ただいま回答率
85.48%
WordPress

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

PHP

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

Q&A

解決済

1回答

3065閲覧

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

ssk

総合スコア332

WordPress

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

PHP

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

0グッド

2クリップ

投稿2015/09/16 01:03

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(); ?>

という書き方をしているのですが、どこか間違っているでしょうか?

気になる質問をクリップする

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

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

1<?php if(isset($_GET['low']) && isset($_GET['high'])): ?> 2<?php 3//値を取得 4$s = $_GET['s']; 5$low = $_GET['low']; 6$high = $_GET['high']; 7 /* 略 */ 8?> 9/* 略 */ 10<?php wp_reset_query(); ?> 11<?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

1<?php if(isset($_GET['low']) && isset($_GET['high'])): ?> 2<? 3//値を取得 4$s = $_GET['s']; 5$low = intval($_GET['low']); 6$high = intval($_GET['high']); 7if($high > 0) { 8 $value = array( $low, $high ); 9 $compare = 'BETWEEN'; 10} else { 11 $value = $low; 12 $compare = '>='; 13} 14//meta_query用 15$metaquerysp[] = array( 16 'key' => 'price', 17 'value' => $value, 18 'compare' => $compare, 19 'type' => 'NUMERIC', 20); 21?> 22$cutomSearchPosts = new WP_Query(array( 23 'post_type' => 'book', 24 'meta_query' => $metaquerysp, 25 's' => $s, 26)); 27?> 28<!--ここから表示--> 29<?php if ( $cutomSearchPosts->have_posts() ) : while ( $cutomSearchPosts->have_posts() ) : $cutomSearchPosts->the_post(); ?> 30ループの内容 31<?php endwhile; else : ?> 32該当なし 33<?php endif; ?> 34<?php wp_reset_query(); ?> 35<?php endif; ?>

投稿2015/09/17 17:24

KiKiKi_KiKi

総合スコア596

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

ssk

2015/09/19 01:04

KiKiKi_KiKiさん 解説ありがとうございます。助かりました。 固定ページが表示される件は、表示される2つの固定ページを削除後、再度同じ固定ページを作ると表示されなくなりました。 検索も意図した結果が得られました。ありがとうございます><
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問