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

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

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

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

Q&A

1回答

4572閲覧

WordPress検索機能で複数のタームを設定したい。

ryuji0205

総合スコア15

WordPress

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

0グッド

1クリップ

投稿2018/04/12 07:18

編集2018/04/16 10:20

オリジナルテーマを作成しWordPress内で設定したカスタム投稿のカスタムタクソノミー検索を行いたいのですが、いまいち結果が出ずご相談させてください。

住宅ポータルサイトを作成し一つのカスタム投稿内に複数のタクソノミーを設定してます。
●例:【住宅情報】と言うカスタム投稿内に
「新宿区」「足立区」「板橋区」などのタクソノミーAと
「家賃10万円以上」「家賃15万円以上」「家賃20万円以上」のタクソノミーBを設定。
住宅情報を更新する際は、それぞれ条件に当てはまるタクソノミーからタームを選択し、「地区」「家賃」と言ったリンクから対応したタクソノミーの一覧情報(記事)のみ表示させるようにしてます。

●質問
チェックボックスから複数の条件をヒットさせる方法を教えてください。
サイドバー内に検索部分を設置し「新宿区」「家賃20万円以上」をチェック「検索する」ボタンを押して、2つの条件にヒットしたもののみ検索結果一覧に表示させたいです。

●現状
地域としてタクソノミー設定した area_all を自動ですべて表示させるようにしてます。ここに他のタクソノミーを表示させ、チェックボックスを付けた検索を行いたいです。

【searchform.php】

<form method="get" id="search-form" action="<?php echo esc_url(home_url('/')); ?>"> <input type="hidden" name="post_type" value="area"> <input type="hidden" class="field" name="s"> <?php $taxonomy_name = 'area_all'; $args = array( 'orderby' => 'description', 'hide_empty' => false ); $taxonomys = get_terms($taxonomy_name,$args); if(!is_wp_error($taxonomys) && count($taxonomys)): foreach($taxonomys as $taxonomy): $tax_posts = get_posts(array('post_type' => 'area', 'taxonomy' => $taxonomy_name, 'term' => $taxonomy->slug ) ); if($tax_posts): ?> <label class="search-label-<?php echo $taxonomy->slug; ?>"><input type="checkbox" name="cat_area[]" value="<?php echo $taxonomy->slug; ?>"><?php echo $taxonomy->name; ?></label> <?php endif; endforeach; endif; ?> <input type="submit" value="検索"> </form>

検索結果の
【search.php】

<?php //絞り込みの値を取得 $s = $_GET['s']; $post_type = $_GET['post_type']; $cat_area = $_GET['cat_area']; $post_tag = $_GET['post_tag']; //絞り込みの値をクエリ用に代入 if( !empty($cat_area) ) { $cat_area_selected = array('taxonomy'=>'area_all','terms'=>$cat_area,'field'=>'slug','operator'=>'IN'); } if( !empty($post_tag) ) { //タグの場合 $post_tag_selected = array('taxonomy'=>'post_tag','terms'=>$post_tag,'field'=>'slug','operator'=>'IN'); } //タクソノミー絞り込みの場合はクエリを指定 if( !empty($cat_area) || !empty($post_tag) ) { query_posts( array( 'paged' => $paged, 'post_type' => $post_type, 's' => $s, 'tax_query' => array( 'relation' => 'AND', $cat_area_selected, $post_tag_selected ) ) ); } ?> <?php if( !empty($cat_area) || !empty($post_tag) ) { ?> <div class="refine-by">&#8216; <?php if(is_array($cat_area)) { foreach($cat_area as $val){ echo get_term_by('slug',$val,"area_all")->name." "; } } if(is_array($post_tag)) { //タグの場合 foreach($post_tag as $val){ echo get_term_by('slug',$val,"post_tag")->name." "; } } ?> &#8217 の検索結果</div> <?php } else { echo '<div class="refine-by">&#8216;'.$s.'&#8217; の検索結果</div>'; } ?> <ul> <?php if( have_posts() ): while ( have_posts() ) : the_post(); ?> <li><a href="<?php the_permalink(); ?>" title="<?php the_title_attribute(); ?>"><?php the_title(); ?></a></li> <?php endwhile; else: endif; ?> </ul> <?php if (isset($_GET['s']) && empty($_GET['s'])) { ?> <p>検索条件が入力されていません。</p> <?php } else { ?> <?php if(have_posts()): ?> <?php while(have_posts()): the_post(); ?> <li><a href="<?php the_permalink(); ?>"><?php the_title(); ?></a></li> <?php endwhile; ?> <?php else : ?> <p><?php echo $search_query; ?> に一致する情報は見つかりませんでした。</p> <?php endif; ?> <?php } ?> --------------------------------- <?php if( !empty($cat_area) || !empty($post_tag) ) { ?> <h2>絞り込み検索結果</h2> <ul> <?php if( have_posts() ): while ( have_posts() ) : the_post(); ?> <li><a href="<?php the_permalink(); ?>" title="<?php the_title_attribute(); ?>"><?php the_title(); ?></a></li> <?php endwhile; else: endif; ?> </ul> <?php } else{ ?> <h2>キーワード検索結果</h2> <ul> <?php if( have_posts() ): while ( have_posts() ) : the_post(); ?> <li><a href="<?php the_permalink(); ?>" title="<?php the_title_attribute(); ?>"><?php the_title(); ?></a></li> <?php endwhile; else: endif; ?> </ul> <?php } ?>

■補足
上記のソースで検索フォームに「 area_all 」タクソノミーで設定したタームは表示されており、検索結果で絞り込みは出来ております。ただ「 area_all 」のタームしか表示されないので、別のタクソノミーを追加表示し、そのタームも検索できるようにしたいのが最終形態です。
よろしくお願い致します。

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

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

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

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

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

guest

回答1

0

結果が出ず、ということですが、query_postsでデータが取得できていますか?

$_GET['post_tag']がformにありませんが、query_postsで$post_tag_selectedを呼び出しています。
以下のような書き方はいかがでしょうか。

php

1if(!empty($_GET["cat_area"])||!empty($_GET["post_tag"])){ 2 $taxquery = array('relation' => 'AND'); 3 if(!empty($_GET["cat_area"])){ 4 $cat_area = $_GET["cat_area"]; 5 $taxquery[] = array( 6 'taxonomy'=>'area_all', 7 'terms'=>$cat_area, 8 'field'=>'slug', 9 'operator'=>'IN' 10 ); 11} 12if(!empty($_GET["post_tag"])){ 13 $post_tag = $_GET["post_tag"]; 14 $taxquery[] = array( 15 'taxonomy'=>'post_tag', 16 'terms'=>$post_tag, 17 'field'=>'slug', 18 'operator'=>'IN' 19 ); 20 } 21}else{ 22 $taxquery = NULL; 23} 24query_posts(array( 25'paged' => $paged, 26'post_type' => $post_type, 27's' => $s, 28'tax_query' => $taxquery 29) 30); 31 32

<<追記>>
すみません、質問を読み違えていました。
$taxonomy_nameを配列にしてループを回せば良いと思います。
以下のソースではinputのnameが全てcat_area[]になりますのでその点は必要に応じて修正してください。

PHP

1<?php 2$taxonomy_name = array('area_all','taxonomy1','taxonomy2'); 3$args = array( 'orderby' => 'description', 'hide_empty' => false ); 4foreach($taxonomy_name as $value): 5 $taxonomys = get_terms($value,$args); 6 if(!is_wp_error($taxonomys) && count($taxonomys)): 7 foreach($taxonomys as $taxonomy): 8 $tax_posts = get_posts(array('post_type' => 'area', 'taxonomy' => $value, 'term' => $taxonomy->slug ) ); 9 if($tax_posts): 10?> 11<label class="search-label-<?php echo $taxonomy->slug; ?>"><input type="checkbox" name="cat_area[]" value="<?php echo $taxonomy->slug; ?>"><?php echo $taxonomy->name; ?></label> 12<?php 13endif; 14endforeach; 15endif; 16endforeach; 17?>

投稿2018/04/13 04:47

編集2018/04/17 04:53
rmrmnrm

総合スコア139

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

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

ryuji0205

2018/04/16 06:07

<form method="get" id="search-form" action="<?php echo esc_url(home_url('/')); ?>"> <input type="hidden" name="post_type" value="area"> <input type="hidden" class="field" name="s"> <?php if(!empty($_GET["cat_area"])||!empty($_GET["cat_area"])){ $taxquery = array('relation' => 'AND'); if(!empty($_GET["cat_area"])){ $cat_area = $_GET["cat_area"]; $taxquery[] = array( 'taxonomy'=>'area_all', 'terms'=>$cat_area, 'field'=>'slug', 'operator'=>'IN' ); } if(!empty($_GET["cat_area"])){ $cat_area = $_GET["cat_area"]; $taxquery[] = array( 'taxonomy'=>'yachin', 'terms'=>$cat_area, 'field'=>'slug', 'operator'=>'IN' ); } }else{ $taxquery = NULL; } query_posts(array( 'paged' => $paged, 'post_type' => $post_type, 's' => $s, 'tax_query' => $taxquery ) ); <input type="submit" value="検索"> </form> すいません、上記のように設定しましたがチェックボックスが表示されませんでした... このあたり結構無知なので、おそらく自分の書き方が間違ってると思うのですがご教授頂けますでしょうか。 よろしくお願い致します。。
rmrmnrm

2018/04/16 07:39

指定した記述はチェックボックスを出力するものでなく、form送信後の絞り込みのためのものです。 チェックボックス部分は初期の状態に戻して頂いて、search.phpのquery_postsを書き換えてください。 わかりにくくてすみません。
ryuji0205

2018/04/16 10:23

すいません、私の説明が不足していたので補足部分を追記しました。 検索結果ではなく検索窓に他のタームを表示し、そこに表示されてるタームを自由にチェックボックスで選択、選択したタームの記事を表示させたいです。 上記のソースで検索→絞り込みは出来たのですが、他のタームも表示させたいのが希望です。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

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

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

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問