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

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

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

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

PHP

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

検索

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

Q&A

解決済

1回答

1914閲覧

Wordpressの絞り込み検索(AND) カテゴリーの指定方法が分かりません

hesogoma46

総合スコア44

WordPress

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

PHP

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

検索

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

0グッド

1クリップ

投稿2019/03/20 14:55

編集2019/03/20 14:58

ワードプレスの絞り込み検索を作成しています。

フリーキーワードとカテゴリー入力欄が2つあり、それぞれカテゴリーを選択し検索した場合 OR検索ではなくAND検索としたいのですが

検索ページには

<form method="get" id="searchform" action="<?php echo home_url(); ?>" > <select name="cat" class="list-box"> <option value='' disabled selected style='display:none;'>カテゴリー1</option> <?php $categories = get_terms( 'category', array( 'orderby' => 'count', 'hide_empty' => 0, 'child_of' => 1個目の親カテゴリー, ) );
foreach($categories as $value):

?>

<option value="<?php echo $value->term_id; ?>"><?php echo $value->name;?></option> <?php endforeach; ?> </select> <select name="cat" class="list-box"> <option value='' disabled selected style='display:none;'>カテゴリー2</option> <?php $categories = get_terms( 'category', array( 'orderby' => 'count', 'hide_empty' => 0, 'child_of' => 2個目の親カテゴリー, ) );
foreach($categories as $value):

?>

<option value="<?php echo $value->term_id; ?>"><?php echo $value->name;?></option> <?php endforeach; ?> </select> <a><input class="send-btn" type="submit" title="検索する" value="検索する"></a> <input name="s" id="s" type="text" class="free-word" placeholder="フリーワード"> </form>

functions.php には

function my_pre_get_posts_search( $query ) {
if ( !is_admin() && $query->is_main_query() ) {
if ( $query->is_search ) {
$cats = get_query_var('cat');
$cat_array = explode( ',', $cats );
$query->set( 'category__and', $cat_array );
}
}
}

add_action( 'pre_get_posts','my_pre_get_posts_search' );

とし検索自体は動作するのですが結果はOR検索のままです。

search.phpに切り替わった際のURLに表示される引数が、サイトURL/cat=〇&cat=〇&s= となりますが
これが サイトURL/cat=〇,〇&s= であればANDの結果が表示されます。

functions.phpに追記したものが効いていないのかよくわからないのですが、cat=〇&cat=〇 を
cat=〇,〇 に変更する方法はありますでしょうか?

よろしくお願いいたします。

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

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

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

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

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

guest

回答1

0

ベストアンサー

html

1<select name="cat" 23<select name="cat[]"

投稿2019/03/20 15:46

KazuhiroHatano

総合スコア7802

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

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

hesogoma46

2019/03/21 01:58

回答いただきありがとうございました。早速カテゴリーを選択するセレクトボックスのnameを cat[] に変えてみたのですが、相変わらず URL/cat=〇&cat=〇&s= と変わりません。他にも ・上記カテゴリー2つ(A、B)はカスタムフィールドで入力 ・別カテゴリー(C)は検索対象から外す ・検索対象は投稿のみ(固定ページは外す) ということから functions.phpには以下を追記していますが、これらが悪さをしていますでしょうか? ** functions.php ** // 投稿のみ検索 function custom_search( $search, $wp_query ) { //サーチページ以外だったら終了 if ( !$wp_query->is_search ) return; //投稿記事のみ検索 $search .= " AND post_type = 'post'"; return $search; } // 検索からお知らせを除外 function SearchFilter($query) { if (!is_admin() && $query->is_main_query() && $query->is_search()) { $query->set('category__not_in', array(19)); } return $query; } add_action('pre_get_posts','SearchFilter'); // AND検索 function my_pre_get_posts_search( $query ) { if ( !is_admin() && $query->is_main_query() ) { if ( $query->is_search ) { $cats = get_query_var('cat'); $cat_array = explode( ',', $cats ); $query->set( 'category__and', $cat_array ); } } } add_action( 'pre_get_posts','my_pre_get_posts_search' ); // カスタムフィールドも検索対象に含める function cf_search_join($join) { global $wpdb; if (is_search()) { $join .=' LEFT JOIN '.$wpdb->postmeta. ' ON '. $wpdb->posts . '.ID = ' . $wpdb->postmeta . '.post_id '; } return $join; } add_filter('posts_join', 'cf_search_join'); function cf_search_where($where) { global $wpdb; if (is_search()) { $where = preg_replace( "/(\s*".$wpdb->posts.".post_title\s+LIKE\s*(\'[^\']+\')\s*)/", "(".$wpdb->posts.".post_title LIKE $1) OR (".$wpdb->postmeta.".meta_value LIKE $1)", $where); } return $where; } add_filter('posts_where', 'cf_search_where'); function cf_search_distinct($where) { global $wpdb; if (is_search()) { return "DISTINCT"; } return $where; } add_filter('posts_distinct', 'cf_search_distinct');
hesogoma46

2019/03/21 02:23

追加報告です。 KazuhiroHatano様よりご教授いただいた cat[] に変更で正常にAND検索できるようになりました。 サーバーのキャッシュが悪さをしていたようです。ありがとうございました。 しかしながら別問題が発生し、カスタムフィールドの検索がうまく機能しなくなりました。 functions.phpにはカスタムフィールドも検索対象に含めるよう上記追記がしてありますが正常に機能していないでしょうか。 重ね重ねよろしくお願いいたします。
KazuhiroHatano

2019/03/21 05:58

var_dump(false and false or true);//true var_dump(false and (false or true));//false var_dump(true or true and false);//true var_dump((true or true) and false);//false
hesogoma46

2019/03/21 13:52

再度の回答ありがとうございます。 恥ずかしながら必要な機能をサイトで検索しては組み込んでいることが多く、ご教授いただいたものをどこに追記すればいいかわかりません。 お手数をおかけいたしますが、追記個所を教えていただいてもよろしいでしょうか。 よろしくお願いいたします。
KazuhiroHatano

2019/03/21 14:16

生成されるであろうSQL文を追ってみて 生成される$whereは 「タイトル OR カスタムフィールド AND カテゴリ」 ではなく 「(タイトル OR カスタムフィールド) AND カテゴリ」 にならなきゃいけないんじゃないかな?
hesogoma46

2019/03/21 14:41

他力本願に頼りっきりではなく、自分でも調べて理解しないとダメですね! 遅くにも拘らずご助言ありがとうございました。 教えていただいた意味をよく考え頑張ってみます!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問