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

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

ただいまの
回答率

90.04%

wordpressプラグインを使わずにカスタムフィールドで絞り込み検索

解決済

回答 1

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 1,574

ohagin

score 12

前提・実現したいこと

よろしくお願いいたします。
http://kotori-blog.com/wordpress/refinement_search/
上記ページの「カスタムフィールドで絞り込むチェックボックス」を参考に、絞り込み検索の設置を試みています。
絞り込み方法は投稿ページにカスタムフィールドを利用し、検索フォームでチェックボックスを利用しています。
検索フォームでチェックボックスを利用するのは、どれか一つでも条件が当てはまれば投稿を表示させたいからです。

チェックボックスに見出しを付けたいため、タグではなくカスタムフィールドを利用しています。

例:
関西
□大阪 □兵庫 □京都 □奈良 □滋賀 □和歌山
四国
□徳島 □香川 □高知 □愛媛

のような形です。

発生している問題・エラーメッセージ

エラー1:カスタムフィールドでチェックボックスを使用した場合は、すべて「該当なし」と表示されます。

エラー2:カスタムフィールドでテキストを使用した場合は、カスタムフィールドのテキストボックスに一番初めに記入した文言と同じものに、検索フォームのチェックが入った場合のみ表示されます。

該当のソースコード

search.php

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

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

<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,

    )
);
?>
<?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 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="和歌山">和歌山</label>
    <input type="submit" value="検索" />
</form>

試したこと

<?php
query_posts( array(
'meta_query' => $metaquerysp,
's' => $s,
)
);
?>
上記コードでは、テキストボックスでも検索できなかったので、「's' => $s,」を削除したところ最初に記載した一件目のみ表示が可能となりました。

上手く説明できているか分からないのですが
よろしくお願いします。

インストールプラグイン
・Search Everything
・カスタムフィールドテンプレート

miz様からアドバイスをいただき、var_dump()を使ったところ下記表示となりました。
array(2) { [0]=> array(2) { ["key"]=> string(8) "kodawari" ["value"]=> string(9) "和歌山" } ["relation"]=> string(2) "OR" } string(0) ""

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

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

質問への追記・修正、ベストアンサー選択の依頼

  • miz

    2017/04/20 22:46

    まずは各変数に予期している値が予期している形で入っているか確認してください。確認のため出力する際には、var_dump()を使うとわかりやすいです。var_dump($metaquerysp); var_dump($s);の要領です。

    キャンセル

  • ohagin

    2017/04/20 23:00

    アドバイスくださりありがとうございます。確認してみました。array(2) { [0]=> array(2) { ["key"]=> string(8) "kodawari" ["value"]=> string(9) "和歌山" } ["relation"]=> string(2) "OR" } string(0) ""と出ました。取れていると思うのですが、使える状態ではないのでしょうか?

    キャンセル

回答 1

checkベストアンサー

+1

以下、回答ではなく、デバッグの手順になります。

(1)
まずは各変数に予期している値が予期している形で入っているか確認してください。
確認のため出力する際には、var_dump()を使うとわかりやすいです。

var_dump($metaquerysp); var_dump($s);


(2)
var_dumpの結果、値は正常そうですが、以下の点がひっかかります。
meta_queryの解説には、

relation (文字列) - meta_query の中に2つ以上の配列を入れたときの論理的な関係。使える値は 'AND' と 'OR' です(デフォルト: 'AND')。ひとつだけ配列を入れるときは使わないでください。

とあるので、念のため、カスタムフィールドの値がひとつのときには、relationをセットしないようにしてみてください。

if( 1<count($metaquerysp) ) {
   $metaquerysp['relation'] = 'OR';
}


https://wpdocs.osdn.jp/%E9%96%A2%E6%95%B0%E3%83%AA%E3%83%95%E3%82%A1%E3%83%AC%E3%83%B3%E3%82%B9/WP_Query#.E3.82.AB.E3.82.B9.E3.82.BF.E3.83.A0.E3.83.95.E3.82.A3.E3.83.BC.E3.83.AB.E3.83.89.E3.81.AE.E3.83.91.E3.83.A9.E3.83.A1.E3.83.BC.E3.82.BF

投稿

編集

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2017/04/20 23:55

    ありがとうございました。
    教えていただいたコードを入れたところ、希望の動き方をしました。
    突然動き出したので理解ができていないのですが、教えて頂きましたコードをじっくりと調べてみます。
    本当にありがとうございました。

    キャンセル

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

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