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

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

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

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

検索

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

Q&A

解決済

1回答

3519閲覧

Wordpress カスタムフィールドの値も絞り込み検索できるようにしたい

TakahitoSugiura

総合スコア13

WordPress

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

検索

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

0グッド

0クリップ

投稿2019/03/08 08:27

編集2019/03/11 08:30

Wordpressの検索機能を実装しているのですが実現できず困っています。

2019/03/11-17:26
最新のソースコードに修正しました。

■実装したい事
1.フリーワード検索(実装済み)
2.クソノミー、ターム絞り込み検索(実装済み)
3.カスタムフィールドの絞り込み検索(未実装)

フリーワード検索は独立していていいのですが、投稿タイプ内でカテゴリ、カスタムフィールドを全て検索対象にして、
絞り込み検索できるようにしたいです。
タブでカテゴリの要素を出したものと複数のカスタムフィールドが混在している少しごちゃごちゃした検索項目の出し方です。

カスタムフィールド単体では検索にヒットするようになりましたが複数検索させるやり方がわかりません。

主に以下の参考サイトより自分の知識で出来る範囲で試してみましたが駄目でした。
https://www.webtoolnavi.com/wordpress-search-everything/
http://wpcj.net/1363
https://izizm.net/webizm/web-management/wordpress/1754/
http://kotori-blog.com/wordpress/refinement_search/
https://sheeplog.work/acf_custom_search_hudosan/

以下現時点でのソースです。
■search.php

<?php $s = $_GET['s']; $my_taxonomy = $_GET['my_taxonomy']; $term_slug = $_GET['term_slug']; $and_or = $_GET['and_or']; $market = $_GET['market']; $use = $_GET['use']; if($term_slug){ $tax_query[] = array( 'taxonomy'=> $my_taxonomy, 'terms'=> $term_slug, 'include_children'=> false, 'field'=> 'slug', 'operator'=> $and_or ); } $args = array( 'tax_query' => $tax_query, 's' => $s, 'posts_per_page' => -1, 'meta_query' => array( 'relation'=>'OR', 'market_car' => array( 'value' => '$market[0]', 'compare' => 'LIKE', ), 'cat_use' => array( 'value' => $use[0], 'compare' => 'LIKE', ), ) ); $wp_query= null; $the_query = new WP_Query( $args ); ?> <?php if ( $the_query->have_posts() ) : ?> <section id="archive_area"> <ul class="item_list"> <!-- ループはじめ --> <?php while ( $the_query->have_posts() ) : $the_query->the_post(); ?> <li><a href="<?php the_permalink(); ?>"> <p class="tl"><?php the_title(); ?></p> </a></li> <?php endwhile; ?> <!-- ループおわり --> </ul> </section> <?php wp_reset_postdata(); ?> <?php else : ?> <p>お探しの記事はありませんでした。</p> <?php endif; ?>

■searchform.php

<form role="search" method="get" id="searchform" class="search-form" action="<?php echo home_url('/test/'); ?>"> <div class="free_serach"> <div class="input_box"> <input type="text" class="field" name="s" id="s" placeholder="入力してください。" value="<?php the_search_query(); ?>"> <input type="image" src="<?php echo site_url(); ?>/wp-content/uploads/product/ico_search_01.png" class="submit" name="submit" value="検索"> </div> </div> <section id="tabArea"> <?php $my_taxonomy = 'test_cat'; $cat_args = array( 'parent' => 0, //トップレベルのタームのみ 'hierarchical' => 0 //子タームを含めない ); $i = 0; $terms = get_terms($my_taxonomy,$cat_args); ?> <ul id="tabMenu"> <li><a href="#cat00" class="open">カテゴリ01</a></li> <li><a href="#cat01">カスタムフィールド01</a></li> <li><a href="#cat02">カスタムフィールド02</a></li> </ul> <!-- フォームの追加はじめ --> <div id="cat00"> <div class="btn_box"> <?php foreach( $terms as $term ): $child_cats = get_terms($my_taxonomy,'hierarchical=0&hide_empty=1&parent='.$term -> term_id); if($child_cats): ?> <?php foreach($child_cats as $child_cat): ?> <?php $child_cat_name = esc_html($child_cat -> name); $target_cat_slug = esc_html($child_cat->slug); ?> <label><input type="checkbox" name="term_slug[]" value="<?php echo $child_cat->slug; ?>"><span><?php echo $child_cat->name; ?></span></label> <?php endforeach;?> <?php endif; ?> <?php wp_reset_postdata(); ?> <?php endforeach; ?> </div> </div> <div id="cat01"> <div class="btn_box"> <label><input type="checkbox" name="market[]" value="market_01"><span>カスタムフィールドの項目</span></label> <label><input type="checkbox" name="market[]" value="market_02"><span>カスタムフィールドの項目</span></label> <label><input type="checkbox" name="market[]" value="market_03"><span>カスタムフィールドの項目</span></label> <label><input type="checkbox" name="market[]" value="market_04"><span>カスタムフィールドの項目</span></label> </div> </div> <div id="cat02"> <div class="btn_box"> <label><input type="checkbox" name="use[]" value="use_01"><span>カスタムフィールドの項目</span></label> <label><input type="checkbox" name="use[]" value="use_02"><span>カスタムフィールドの項目</span></label> <label><input type="checkbox" name="use[]" value="use_03"><span>カスタムフィールドの項目</span></label> <label><input type="checkbox" name="use[]" value="use_04"><span>カスタムフィールドの項目</span></label> </div> </div> <input type="hidden" name="my_taxonomy" value="<?php echo $my_taxonomy ?>"> <select name="and_or" id="and_or"> <option value="AND">AND</option> <option value="IN">OR</option> </select> <!-- フォームの追加おわり --> <input type="submit" class="search-submit" value="<?php echo esc_attr_x( 'Search', 'submit button' ) ?>" /> <input type="hidden" name="post_type" id="post_type" value="product"> </section> </form>

■Advanced Custom Fields登録例

フィールド名:cf_market market_01 : テキスト01 market_02 : テキスト02 market_03 : テキスト03 market_04 : テキスト04 フィールド名:cf_use use_01 : テキスト01 use_02 : テキスト02 use_03 : テキスト03 use_04 : テキスト04

不足情報等ありましたら何なりとお申し付け下さい。
すみませんが反応して頂けたらとても助かります。
どうぞよろしくお願い致します。

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

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

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

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

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

guest

回答1

0

ベストアンサー

詳細まで拝見していませんが、今のコードを少し変えて $args のキー meta_query$args の直下に移動すると機能するようになるのではないかと思います。

patch

1if($term_slug){ 2 $tax_query[] = array( 3 'taxonomy'=> $my_taxonomy, 4 'terms'=> $term_slug, 5 'include_children'=> false, 6 'field'=> 'slug', 7 'operator'=> $and_or, 8- 'meta_query' => array( 9- array( 'key'=>'cf_market', 10- 'value'=>$market[0], 11- 'compare'=>'like', 12- ), 13- 'relation'=>'AND' 14- ) 15 ); 16} 17$args = array( 18 'tax_query' => $tax_query, 19 's' => $s, 20 'posts_per_page' => -1 21+ 'meta_query' => array( 22+ array( 23+ 'key' => 'cf_market', 24+ 'value' => $market[0], 25+ 'compare' => 'like', 26+ ), 27+ 'relation' => 'AND', 28+ ) 29);

変更後のコードに対して私の手元で動作確認をしているわけではないので、上のコードが正しく動くとはかぎりません。コピペするのではなく、アイデアだけ参考にしていただければと思います。

ちなみに WP_Query の使い方については Codex 上でとても詳しく説明されているので一度目を通されてみてください :D

追記 2019/03/14

単体では検索にヒットしますが、確かに複数指定するとヒットしません。
引き続き調べながら作業しますが、ループ処理に関してヒントとなるものはありますでしょうか?

上 ↑ でご紹介した Codex のページはご覧になりましたか?そこにそのままズバリなヒントが載っていますので、もしまだお読みになっていなければ読んでみてください。

上 ↑ の Codex のページの該当箇所をかんたんに解説しますね。 2 つの例が紹介されています。

php

1$args = array( 2 'post_type' => 'product', 3 'meta_query' => array( 4 'relation' => 'OR', 5 array( 6 'key' => 'color', 7 'value' => 'blue', 8 'compare' => 'NOT LIKE', 9 ), 10 array( 11 'key' => 'price', 12 'value' => array( 20, 100 ), 13 'type' => 'numeric', 14 'compare' => 'BETWEEN', 15 ), 16 ), 17); 18$query = new WP_Query( $args );

ひとつめ ↑ は「 投稿タイプ product の投稿のうち、【カスタムフィールド color の値が blue ではないもの】と【カスタムフィールド price の値が 20 〜 100 の間のもの】 」を取得するサンプルです。

php

1$args = array( 2 'post_type' => 'product', 3 'meta_query' => array( 4 'relation' => 'OR', 5 array( 6 'key' => 'color', 7 'value' => 'orange', 8 'compare' => '=', 9 ), 10 array( 11 'relation' => 'AND', 12 array( 13 'key' => 'color', 14 'value' => 'red', 15 'compare' => '=', 16 ), 17 array( 18 'key' => 'size', 19 'value' => 'small', 20 'compare' => '=', 21 ), 22 ), 23 ), 24); 25$query = new WP_Query( $args );

ふたつめのこちら ↑ は「 投稿タイプ product の投稿のうち、【カスタムフィールド colororange のもの】と【カスタムフィールド colorred でカスタムフィールド sizesmall のもの】 」を取得するサンプルです。

ロジックと実際のコードの構成を見比べて、ご自身の場合だとどのように書けばよいか、考えてみてください。

「ループ」というのは、クライアントから送られた marketuse (いずれも配列)に対してループを回して、最終的に meta_query をこのような形で組むということです。

「ループ」と言いましたが、もし完全一致( = )での検索でよいのであれば、次のような感じで IN を使えばループを回さなくてもいけるかもしれません(あくまでもイメージです)。

php

1$args = [ 2 // ... 3]; 4 5$meta_query_market = [ 6 'key' => 'market', 7 'value' => $market, 8 'compare' => 'IN', 9]; 10 11$meta_query_use = [ 12 'key' => 'use', 13 'value' => $use, 14 'compare' => 'IN', 15]; 16 17$meta_query = [ 18 'relation' => 'AND', 19 $meta_query_market, 20 $meta_query_use, 21]; 22 23$args['meta_query'] = $meta_query;

この説明でもどうもよくわからないなという場合は、 Codex をまずは丹念に読んでみることをおすすめします。というのと、これ以上は WordPress というよりは PHP の知識の問題だと思いますので、 PHP でのループの回し方等をお調べになってください。がんばってください :D

投稿2019/03/10 12:16

編集2019/03/14 14:30
gh640

総合スコア1407

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

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

TakahitoSugiura

2019/03/10 12:27

ご回答ありがとうございます!助かります! この検索機能は実現したいので、ご指摘頂いた箇所を試行錯誤しながら試してみたいと思います。
gh640

2019/03/10 12:45

最終的には複数指定された `market` に対して動作するようにされたいものと思います。それには `meta_query` の作成時にループを回す等する必要がありこの回答のコードそのままではいけませんが、(回答を参考に)まずは `market` のひとつめで絞り込みができるところまでを実現されて、その後に複数の `market` に対応する、という流れで進められるとよいかと思います。がんばってください :)
TakahitoSugiura

2019/03/10 15:40

まずはひとつめでの動作確認が目標ですね。 今週頑張ってみます!アドバイスありがとうございます。
TakahitoSugiura

2019/03/11 02:24

ご指摘頂いたやり方でまずは一つのカスタムフィールドが検索にヒットするようになりました。 ありがとうございます! それからもう一つuseというカスタムフィールドを作成してテストしました。 単体では検索にヒットしますが、確かに複数指定するとヒットしません。 引き続き調べながら作業しますが、ループ処理に関してヒントとなるものはありますでしょうか? ▽現在の'args'の中身です。 $args = array( 'tax_query' => $tax_query, 's' => $s, 'posts_per_page' => -1, 'meta_query' => array( 'relation'=>'OR', 'cat_market' => array( 'value' => $market[0], 'compare'=>'like', ), 'cat_use' => array( 'value' => $use[0], 'compare'=>'like', ), ) );
gh640

2019/03/14 14:32

ご質問「ループ処理に関してヒントとなるものはありますでしょうか?」に対する回答を、回答文に追記しました。ご覧になってみてくださいー
TakahitoSugiura

2019/03/18 06:08

追記ありがとうございます! 丁寧に解説頂き感謝です。参考にしながら取り組んでみたいと思います。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問