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

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

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

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

PHP

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

Q&A

2回答

1133閲覧

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

hwhshsq

総合スコア19

WordPress

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

PHP

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

0グッド

2クリップ

投稿2018/02/13 18:30

編集2022/01/12 10:55

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

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

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

php

1<form method="get" action="<?php bloginfo( 'url' ); ?>"> 2 <input name="s" id="s" type="text" placeholder="キーワードを入力"/><br /><br /> 3 4 <?php wp_dropdown_categories('depth=0&orderby=name&hide_empty=1&show_option_all=▽カテゴリーを選択&include=3,122'); ?> 5 6 <?php $tags = get_tags('include=6,7,8,9,10,11,12,13,20'); if ( $tags ) : ?> 7 <input type="hidden" name="and-or" value="AND"> / * ◆追加◆ * / 8 <select name='tag[]' id='tag1'> / * ◆変更◆ * / 9 <option value="" selected="selected">▽タグ1を選択</option> 10 <?php foreach ( $tags as $tag ): ?> 11 <option value="<?php echo esc_html( $tag->slug); ?>"><?php echo esc_html( $tag->name ); ?></option> 12 <?php endforeach; ?> 13 </select> 14 <?php endif; ?> 15 16 <?php $tags = get_tags('exclude=6,7,8,9,10,11,12,13,20'); if ( $tags ) : ?> 17 <input type="hidden" name="and-or" value="AND"> / * ◆追加◆ * / 18 <select name='tag[]' id='tag2'> / * ◆変更◆ * / 19 <option value="" selected="selected">▽タグ2を選択</option> 20 <?php foreach ( $tags as $tag ): ?> 21 <option value="<?php echo esc_html( $tag->slug); ?>"><?php echo esc_html( $tag->name ); ?></option> 22 <?php endforeach; ?> 23 </select> 24 <?php endif; ?><br /> 25 26 <input id="submit" type="submit" value="検索" /> 27 28</form>

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

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

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

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

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

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

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

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

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

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

guest

回答2

0

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

今の回答の流れですと、オリジナルのクエリが使えれば良さそうですね。
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/22 17:11

Artz

総合スコア158

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

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

hwhshsq

2018/02/23 10:11

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

2018/02/24 20: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の勉強にはなりませんね笑)
guest

0

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

HTML

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

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

投稿2018/02/13 18:45

kei344

総合スコア69364

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

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

hwhshsq

2018/02/13 19:10

ご回答ありがとうございます。 ご指摘を基に追加および変更を行いました。 (質問文内のコードを変更し、変更・追加箇所をコメントしました) ですが、この変更では、タグ1とタグ2による OR検索になりました。 (カテゴリ、キーワードとタグとはAND検索になっています) 恐らく、私の理解不足で変更が間違っているのかと思います。 再度ご指摘頂けますと幸いです。
kei344

2018/02/13 19:30

「tag[]」を「tag__and[]」に変えてみるとか。あと、「and-or」は1つで十分です。 また、回答が付いた質問の編集は慎重に行ってください。質問文のコードについて回答にて指摘があった場合は「追記」し、元のコードを編集する場合も「直したこと」がわかるようにしてください。
hwhshsq

2018/02/14 10: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
kei344

2018/02/14 12: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となっているパラメータはそのままでは使用出来ませんが、以下のように追加してあげることで使用可能になります。 上記方法で使えるかもしれませんが、検証環境が手元に無く今手が離せないので、他の方の回答を待ってみてください。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問