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

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

ただいまの
回答率

89.99%

Wordpress でphpを使って複数タグのand検索の実装

受付中

回答 2

投稿 編集

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

hwhshsq

score 5

私はWordpressもphpも初心者で練習中です。
今は練習でサイトを作っています。

実装したいのは、
「キーワード、カテゴリ、タグ1、タグ2の3つの条件にAND条件でヒットする記事を表示する」
ためのsearchform.phpです。

初心者向けのサイトを見ながら、searchform.phpを以下のように記述しました。

<form method="get" action="<?php bloginfo( 'url' ); ?>">
    <input name="s" id="s" type="text" placeholder="キーワードを入力"/><br /><br />

    <?php wp_dropdown_categories('depth=0&orderby=name&hide_empty=1&show_option_all=▽カテゴリーを選択&include=3,122'); ?>

    <?php $tags = get_tags('include=6,7,8,9,10,11,12,13,20'); if ( $tags ) : ?>
     <input type="hidden" name="and-or" value="AND"> / * ◆追加◆ * /
    <select name='tag[]' id='tag1'> / * ◆変更◆ * /
    <option value="" selected="selected">▽タグ1を選択</option>
    <?php foreach ( $tags as $tag ): ?>
    <option value="<?php echo esc_html( $tag->slug); ?>"><?php echo esc_html( $tag->name ); ?></option>
    <?php endforeach; ?>
    </select>
    <?php endif; ?>    

    <?php $tags = get_tags('exclude=6,7,8,9,10,11,12,13,20'); if ( $tags ) : ?>
        <input type="hidden" name="and-or" value="AND"> / * ◆追加◆ * /
    <select name='tag[]' id='tag2'> / * ◆変更◆ * /
    <option value="" selected="selected">▽タグ2を選択</option>
    <?php foreach ( $tags as $tag ): ?>
    <option value="<?php echo esc_html( $tag->slug); ?>"><?php echo esc_html( $tag->name ); ?></option>
    <?php endforeach; ?>
    </select>
    <?php endif; ?><br />    

    <input id="submit" type="submit" value="検索" />    

</form>

上記の記述でできた検索フォームですと、タグ1が検索結果に反映されません。
検索結果画面のURLを見ると、

~~/?s=&cat=0&tag=tag1&tag=tag2

のようになっており、カテゴリIDが0でタグにtag2を持つ記事が一覧表示されます。
期待しているのは、カテゴリIDが0、タグにtag1とtag2を持つ記事の一覧表示です。

末尾が tag=tag1+tag2 になれば私が求める結果が得られると考えていますが、実装方法がわかりません。

ご教授いただけますと幸いです。
宜しくお願い致します。

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

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

回答 2

+2

方針のみ回答させてください。

今の回答の流れですと、オリジナルのクエリが使えれば良さそうですね。
add_query_vars_filter()をfunction.phpに書くと、オリジナルのクエリ変数を使えるようになり、get_query_var()によってそのクエリの内容を取得できます。
ベタですが、tag1,tag2といった名前でフォームから送信できるようになります。

次に検索結果画面ですが、この方法で取得したクエリを元に、WP_Queryを使って検索を行います。
が、これは結構難しいので練習あるのみです!!

実現の方針としては、WP_Queryの引数にtax_queryを指定することで、カテゴリーやタグ、自分で作ったカスタムタクソノミーなどを検索条件に加えます。キーワード検索も勿論できます。

各タクソノミーをAND条件で検索するには、tax_queryのパラメータのうちrelationをANDにします。
上記リンクの「複数のカスタム分類の取り扱い:」のコードが参考になると思います。
tax_queryは多段にできるので全体はORで部分的にANDにするなど細かい検索ができます。

ちなみにタクソノミーが一つのみのときはrelationは指定できないので、タグが1つしか指定されないパターンがあるなら、tax_queryは1つの場合と2つの場合を用意する必要があります。

まずはタグ検索のみ練習、続いてタグとカテゴリー、最後にキーワードも含めたクエリ生成をするなど段階的にトライしてみてください。

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2018/02/23 19:11

    回答ありがとうございます。ですが、不勉強でご回答の内容が理解できません。。。
    現在は投稿ページのタグを複合検索をしようと思っていますが、カスタム投稿のカスタムタクソノミーでの検索をしようとする際も、同様になるのでしょうか?
    もし、カスタムタクソノミーを利用したほうが簡単なのであれば、そちらも検討しようと思っています。

    キャンセル

  • 2018/02/25 05:08

    下手な回答ですみません。。。

    >カスタム投稿のカスタムタクソノミーでの検索をしようとする際も、同様になるのでしょうか?
    すみません試してないんですが、こちら↓
    https://wpdocs.osdn.jp/WordPress_Query_Vars#.E3.82.AF.E3.82.A8.E3.83.AA.E3.81.AE.E4.BE.8B
    を見る限りカスタム投稿タイプやカスタムタクソノミーはパブリッククエリになるみたいですね。
    ただコード量や影響量からすると、自作のクエリ変数をadd_query_var_filterでセットする方が、カスタムタクソノミーを作るより低コストですね。

    別の方法としてこんなのも見つけたんですが、フィルターやアクションフックを使って、送信されたクエリをいじる例がありました↓ よりスマートかもしれません。
    https://wpdocs.osdn.jp/%E3%82%AB%E3%82%B9%E3%82%BF%E3%83%A0%E3%82%AF%E3%82%A8%E3%83%AA#.E3.82.AD.E3.83.BC.E3.83.AF.E3.83.BC.E3.83.89.E6.A4.9C.E7.B4.A2.E3.83.97.E3.83.A9.E3.82.B0.E3.82.A4.E3.83.B3.E3.83.86.E3.83.BC.E3.83.96.E3.83.AB
    アクションフック、フィルターってなんぞやという状態だと思うので学習が必要となると思いますが。。。。これだとURL中のタグ名を「+」で結合する方針も、WP_Queryで検索する方法もとれます。

    (あとはjavascriptで何とかしてもいいと思いますが、WPの勉強にはなりませんね笑)

    キャンセル

+1

これでどうでしょう。ちなみに HTMLでは同じページ内に同じ名称の id を持てませんので、別の名前にしてください。

<input type="hidden" name="and-or" value="AND">
<!-- ↑ 追加
<select name='tag' id='tag'>
                ↓         ↓ -->
<select name='tag[]' id='tag1'>

【[WordPress] プラグインを使わずコードを編集して独自の検索フォームと検索機能を作る - Qiita】
https://qiita.com/kent_ocean/items/e7977fd9d3b0ff9e368b

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2018/02/14 04:10

    ご回答ありがとうございます。
    ご指摘を基に追加および変更を行いました。
    (質問文内のコードを変更し、変更・追加箇所をコメントしました)

    ですが、この変更では、タグ1とタグ2による OR検索になりました。
    (カテゴリ、キーワードとタグとはAND検索になっています)
    恐らく、私の理解不足で変更が間違っているのかと思います。

    再度ご指摘頂けますと幸いです。

    キャンセル

  • 2018/02/14 04:30

    「tag[]」を「tag__and[]」に変えてみるとか。あと、「and-or」は1つで十分です。

    また、回答が付いた質問の編集は慎重に行ってください。質問文のコードについて回答にて指摘があった場合は「追記」し、元のコードを編集する場合も「直したこと」がわかるようにしてください。

    キャンセル

  • 2018/02/14 19:20

    ご返答およびご指摘ありがとうございます。and-orは1つに致しました。

    tag[]をtag__and[]に変更したところ、どちらのタグも機能していないようです。

    検索結果画面のURLは以下のようになっています。
    (example1および2はタグ名です)

    <~~~>jp/?s=&cat=0&and-or=AND&tag__and%5B%5D=example1&tag__and%5B%5D=example2

    キャンセル

  • 2018/02/14 21:56

    tag__and は「Private query vars」になっていますね、すみません。

    【WordPress Query Vars « WordPress Codex】
    https://codex.wordpress.org/WordPress_Query_Vars

    【WordPressのサイト上で簡単に並び替え&絞り込みする方法 | 福岡のホームページ制作会社・株式会社マグネッツ】
    https://magnets.jp/web_design/3124/
    > Privateとなっているパラメータはそのままでは使用出来ませんが、以下のように追加してあげることで使用可能になります。

    上記方法で使えるかもしれませんが、検証環境が手元に無く今手が離せないので、他の方の回答を待ってみてください。

    キャンセル

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

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