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

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

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

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

PHP

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

検索

検索は、あるデータの集まりの中から 目的のデータを見つけ出すことです。

Q&A

1回答

1194閲覧

Wordpressでカテゴリ&タグ&フリーテキストで複数条件で検索させたい

marcos_grohl

総合スコア14

WordPress

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

PHP

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

検索

検索は、あるデータの集まりの中から 目的のデータを見つけ出すことです。

0グッド

0クリップ

投稿2020/04/09 01:04

お世話になります。

【Xeory base】というテーマで子テーマを作成し、
検索フォーム(searchform.php)をカスタマイズし、
フリーテキスト以外にもカテゴリ&タグも検索条件に含めたいと思い、
https://www.akaeho.net/wp-searchform/
を参考に検索フォーム自体は作成する事が出来ました。

検索フォーム(searchform.php)のコード

php

1<form method="get" action="<?php echo home_url('/'); ?>" > 2<?php wp_dropdown_categories('show_option_none=カテゴリを選択'); ?> 3 <?php $tags = get_tags(); if ( $tags ) : ?> 4 <select name="tag"> 5 <option value="" class="selected">タグを選択</option> 6 <?php foreach ( $tags as $tag ): ?> 7 <option value="<?php echo esc_html( $tag->slug); ?>"><?php echo esc_html( $tag->name ); ?></option> 8 <?php endforeach; ?> 9 </select> 10 <?php endif; ?> 11 <input name="s" id="s" type="text" placeholder="キーワードを入力"> 12 <input id="submit" type="submit" value="検索"> 13 <input id="reset" type="reset" value="リセット"> 14</form>

上記コードでそれぞれ選択or入力して検索すると、パラメーターが
https://●●●●●.com/?cat=カテゴリID&tag=タグ名&s=キーワード名
として表示されます。

これがhttps://●●●●●.com/?cat=カテゴリID
など、どれか一つだけですと正常に検索結果ページで一覧表示されるのですが、
タグとキーワードが未選択or未入力の場合、パラメーターが
https://●●●●●.com/?cat=カテゴリID&tag=&s=
となり、検索結果ページで該当無しとなってしまいます。

検索条件に未選択or未入力がある場合、
それらをパラメーターに含まない、または含んだ場合も
選択した条件のみで検索結果に反映させたいのです。

参考になりそうなページを探しているのですが見つからず、
このままだと、リダイレクトしか無いかなと考えておりますが、
何か良い方法をご存知の方がいれば、
ご教授頂けますと幸いです。

なお、検索結果ページのコードは以下になります。

検索結果 (search.php)のコード(デフォルトのままです)

php

1<?php get_header(); ?> 2 3<div id="content"> 4 5<div class="wrap"> 6 <?php bzb_breadcrumb(); ?> 7 8 <div id="main" <?php bzb_layout_main(); ?>> 9 10 <div class="main-inner"> 11 12 <section class="cat-content"> 13 <header class="cat-header"> 14  <h1 class="post-title"><?php bzb_title(); ?></h1> 15 </header> 16 <?php if( is_category() ) { ?> 17 <?php bzb_category_description(); ?> 18 <?php } ?> 19 20 </section> 21 22 <div class="post-loop-wrap"> 23 <?php 24 25 if ( have_posts() ) : 26 27 while ( have_posts() ) : the_post(); 28 29 ?> 30 31<article id="post-<?php echo the_ID(); ?>" <?php post_class(); ?> itemscope="itemscope" itemtype="http://schema.org/BlogPosting"> 32 33 <header class="post-header"> 34 <ul class="post-meta list-inline"> 35 <li class="date updated" itemprop="datePublished" datetime="<?php the_time('c');?>"><i class="fa fa-clock-o"></i> <?php the_time('Y.m.d');?></li> 36 </ul> 37 <h2 class="post-title" itemprop="headline"><?php the_title(); ?></h2> 38 </header> 39 40 <section class="post-content" itemprop="text"> 41 <div id="sponsor_url"><?php $text_field = get_field('sponsor_url'); ?><a href="<?php echo $text_field; ?>" target="_blank"><?php echo $text_field; ?></a></div> 42 </section> 43 44 </article> 45 <?php 46 47 endwhile; 48 49 else : 50 ?> 51 52 <article id="post-404"class="cotent-none post" itemscope="itemscope" itemtype="http://schema.org/BlogPosting"> 53 <section class="post-content" itemprop="text"> 54 <?php echo get_template_part('content', 'none'); ?> 55 </section> 56 </article> 57 58 <?php 59 endif; 60 ?> 61 <?php if (function_exists("pagination")) { 62 pagination($wp_query->max_num_pages); 63 } ?> 64 </div><!-- /post-loop-wrap --> 65 </div><!-- /main-inner --> 66 </div><!-- /main --> 67 68<?php get_sidebar(); ?> 69 70</div><!-- /wrap --> 71 72</div><!-- /content --> 73 74<?php get_footer(); ?>

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

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

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

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

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

guest

回答1

0

都合の良いプラグインがあるか分かりませんが、自分ならば機能するように組んじゃいますね。
簡単にヒントだけですが参考になれば。

記事の絞り込み

まず条件に合致した記事を絞り込みます。
絞り込みのパラメータは下記urlを参照してください。
http://notnil-creative.com/blog/archives/1288

今回のケースだとカテゴリー、タグ、ワードの条件を繋げば、期待する記事一覧が取り出せるはずです。
getパラメータの取得が分からなければ、まずは決め打ち('category_name' => '{カテゴリスラッグ名}')などで取得してみましょう。

後述のpre_get_postsが分からないようでしたら、ページ下にあるWP_Query関数で生成した一覧をループ処理で表示して確認してみてください。

pre_get_postsでメインクエリを制御する

期待した結果が取得できたらpre_get_postsでsearch.phpのメインクエリを制御します。
https://www.tam-tam.co.jp/tipsnote/cms/post9420.html
is_search()で条件分岐すればsearch.phpだけで制御できます。

↑のWP_Queryを使ったループでも結果表示は可能ですが、ページャー処理でもうひと手間必要になるので、できればpre_get_postsのほうが良いと思います。

GETパラメータの取得

パラメータの決め打ちでメインクリエ制御までできたら、値をGETパラメータに置き換えてください。
https://web-dev.xyz/php-get/

場合によっては他に条件分岐が必要になるかも知れませんが、概ねこの手順でAND OR検索は実現できるはずです。

投稿2020/04/09 12:05

編集2020/04/09 12:13
kchiku

総合スコア146

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

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

marcos_grohl

2020/04/11 08:50

詳しいご説明ありがとうございます! ご連絡頂いたページやその他のページも色々参照してみた結果、 質問ではタグ&キーワードに未入力の場合は、該当する記事が表示されないと書いておりましたが、 厳密には【キーワードに未入力の場合のみ】該当する記事が0になるようでした。 https://●●●●●.com/?cat=カテゴリID&tag=タグ名 の状態では該当する記事が絞り込めて一覧表示になりました。 また、キーワード未入力時の条件分岐の実装も出来たのですが、 【キーワード未入力時にカテゴリとタグのみを参照して絞り込む】為に色々試してはいるのですが、 【キーワード未入力時】にはキーワード検索自体を無効にしないと 結局は【カテゴリとタグのみを参照して絞り込み】しても 最終的に空欄の検索キーワードでAND検索になってしまうのでは無いか、 との結論に到り、そうなると【キーワード未入力時】には search.phpでは無く、archive.phpで絞り込みをした方が良いのかなど、 収集がつかなくなって来ました。。。
kchiku

2020/04/11 12:13

うろ覚えですが、以前似たようなものを作ったときに同じようなトラブルがあったと思います。 なのでGETパラメータで分岐をかけて対応しました。 if(empty($_GET['s']){ //キーワード未入力時のループ }else{ //キーワード入力時のループ } こんな感じで、検索ワード(s)があるかないかで生成するループを変えれば良いと思います。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

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

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

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問