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

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

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

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

PHP

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

Q&A

解決済

3回答

1057閲覧

wordpressで特定のカテゴリーで記事を絞り込んだ際に、別のカテゴリーも絞り込みの対象にしたい

nekomaru01

総合スコア13

WordPress

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

PHP

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

0グッド

0クリップ

投稿2020/04/16 18:55

編集2020/04/16 19:36

wordpressでカテゴリーに「時給」という親カテゴリーがあるとして、その子カテゴリーとして以下のような大まかな時給の子カテゴリーを作りました。
・~800円
・800円以上
・1000円以上
・1500円以上

当方、カテゴリーから記事を絞り込む機能を実装しており、普通に子カテゴリーを作っただけでは、800円以上のカテゴリーで記事を絞り込んだ場合、1000円以上および1500円以上の記事も表示されてほしいのですが、どうすればよいのか解決策や妥協案すら思いつきません・・・

以下、絞り込みのフロント側のコードです

php

1<form method="get" action="<?php bloginfo( 'url' ); ?>"> 2 <input type="hidden" name="s" value=""> 3 <?php wp_dropdown_categories('name=cats[]&show_option_none=時給を選択してください&child_of=20'); ?> 4 <?php wp_dropdown_categories('name=cats[]&show_option_none=部署を選択してください&child_of=13'); ?> 5 <?php wp_dropdown_categories('name=cats[]&show_option_none=職種を選択してください&child_of=14'); ?> 6 <input id="submit" type="submit" value="検索" /> 7</form>

以下複数カテゴリーの絞り込みのコード

functions.php

1function customize_main_query($query) { 2 if ( is_admin() || ! $query->is_main_query() ) 3 return; 4 5 //検索クエリのカスタマイズ 6 if ( $query->is_search()){ 7 if(isset( $_GET['cats'])){$cat = $_GET['cats'];}else{$cat = "";} 8 9 if($cat){ 10 $cat = array_diff($cat, array("-1")); 11 $taxquerysp[] = array( 12 'taxonomy'=>'category', 13 'terms'=> $cat, 14 'include_children'=>false, 15 'field'=>'term_id', 16 'operator'=>'AND' 17 ); 18 $query->set('tax_query' , $taxquerysp); 19 } 20 } 21} 22add_action( 'pre_get_posts', 'customize_main_query' );

難しい質問かもしれませんが、もしお詳しい方がいらっしゃいましたらどうぞご教示おねがいいたします。

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

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

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

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

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

guest

回答3

0

ベストアンサー

カテゴリの方向で行くようなので蛇足かも知れませんが、↑の回答の「価格のフィールド値で切り分ける」というのは例えばこんな方法です。

※時給フィールドを「wage」と仮定して。

html

1<form action=""> 2 <label for="r1"> 3 <input id="r1" type="radio" name="wage" value="under800"> 4 <span>〜800円</span> 5 </label> 6 <label for="r2"> 7 <input id="r2" type="radio" name="wage" value="800"> 8 <span>800円以上</span> 9 </label> 10 <label for="r3"> 11 <input id="r3" type="radio" name="wage" value="1000"> 12 <span>1000円以上</span> 13 </label> 14 <label for="r4"> 15 <input id="r4" type="radio" name="wage" value="1500"> 16 <span>1500円以上</span> 17 </label> 18 <input type="hidden" name="s"> 19 <button type="submit">検索</button> 20</form>

php

1function wagePost( $query ) { 2 if ( is_admin() || ! $query->is_main_query() ){ 3 return; 4 } 5 if ( $query->is_search() ) { 6 if($_GET['wage']){ 7 $wage = $_GET['wage']; 8 $meta_query = array(); 9 if($wage == 'under800'){ 10 $meta_query = array( 11 array( 12 'key' => 'wage', 13 'value' => 800, 14 'type' => 'NUMERIC', 15 'compare' => '<=' 16 ) 17 ); 18 }else{ 19 $meta_query = array( 20 array( 21 'key' => 'wage', 22 'value' => $wage, 23 'type' => 'NUMERIC', 24 'compare' => '>=' 25 ) 26 ); 27 } 28 $query->set('meta_query', $meta_query); 29 } 30 } 31} 32add_action('pre_get_posts','wagePost');

このようにフィールド値(時給)の比較で出力を切り分ける方が、メンテナンス性の意味でも楽かなと思います。

投稿2020/04/21 16:03

kchiku

総合スコア146

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

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

nekomaru01

2020/04/23 23:37

kchiku様 返信が遅くなり申し訳ございません。 代替案をご提示いただきありがとうございます。 質問があるのですが、ご提示いただいたコードは、私の記載したコードと共存可能でしょうか? ・ほかのカテゴリーとの複合での絞り込みが可能かどうか(例えば、時給800円以上 と 職種のプルダウンのカテゴリーを含めた絞り込みが可能かどうか) ・時給単体での絞りこみが可能かどうか 当方、エンジニアではないうえに知識もほとんどない状態で作業をまかせられており、とんちんかんなコメントをしてしまっているかもしれませんが、なにかおわかりでしたらどうぞご教示をお願いいたします。
kchiku

2020/04/24 01:07

getパラメータにカテゴリ情報を追加して、$query->set文を追加して絞り込めば可能です。 いきなり全部やらず、金額の切り分けから一つずつ試行してみてください。
nekomaru01

2020/04/24 03:17 編集

kchiku様 とても難しいのですが頑張ってみます。の前に質問させてください。 もし私の認識が違っていたらお手数ですがご指摘下さい。。 ~時給800円の場合 ご提示いただいたコードで、時給が800円以上の記事に対してwordpress側でなにか変更しなければいけないことはありますか? kchiku様の書かれている文面から、カテゴリーは使わないようなニュアンスとして受け取りましたが、 時給800円以上のカテゴリーで登録している記事と、ご提示いただいたコードがどこでどう紐づいているのか見当もつかない状態です。 フィールド値 というのはカスタムフィールドのことを指しているのでしょうか? もしその場合、投稿編集画面のカスタムフィールドの「名前」をwage、値を「under800」や「800」、「1000」などにすればよいということでしょうか? 検討違いの質問でしたらすみません。。 ------------- 追記 カスタムフィールドをいじってみて、フィールド値 = カスタムフィールド だということが理解できました。(違っていたらすみません。。) ~時給800円を選んだ場合と時給1500円以上を選んだ場合は、ほかのカテゴリーとも複合して絞り込みができましたが、 1000円以上と1500円以上の場合がどうもうまくいかず、すべての投稿が表示されてしまいます。 おそらく else{ $meta_query = array( array( 'key' => 'wage', 'value' => $wage, 'type' => 'NUMERIC', 'compare' => '>=' ) ); } この部分でなにかしないといけないと思っているのですが、1000円以上、1500円以上の場合、この部分がどうなるのかご教示いただけないでしょうか。 ------------ さらに追記 こちら、else if で各時給を追加するだけでよかったのですね。 なんとなく解決いたしました! とても助かりました!
kchiku

2020/04/24 03:28

フィールド値=カスタムフィールドはその通りです。 シンプルなコードなので把握されてると思いますが、800円以下だけ比較演算子が変わるので、800円以下とそれ以外で処理を分けています。 800円以下だけカテゴリ分けが機能しているとしたら、憶測ですが金額の分岐のif文内にカテゴリ分岐を書いていませんか? そうなら外に出してみてください。
guest

0

当方、カテゴリーから記事を絞り込む機能を実装しており、普通に子カテゴリーを作っただけでは、800円以上のカテゴリーで記事を絞り込んだ場合、1000円以上および1500円以上の記事も表示されてほしいのですが、どうすればよいのか解決策や妥協案すら思いつきません・・・

カテゴリー階層が同じ場合は、標準機能で関連するカテゴリーを含めて検索させるのは無理ですね...

たとえば、

~800円   cat id = 1
800円以上 cat id = 2
1000円以上 cat id = 3
1500円以上 cat id = 4

とした場合、

$cat_add = array(); foreach ( $cat as $c ){ if( $c == 2 ){ $cat_add = array( 3, 4 ); } if( $c == 3 ){ $cat_add = array( 4 ); } } $cat = array_merge( $cat, $cat_add );

のような感じで選択された カテゴリーID をチェックして、同時に検索したいカテゴリーID を追加して検索する感じでしょうか。

投稿2020/04/16 23:09

編集2020/04/16 23:10
CHERRY

総合スコア25171

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

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

nekomaru01

2020/04/20 09:06 編集

CHERRY様 素敵なご提案ありがとうございます。 一点質問させていただきたいのですが、ご提示いただいたソースコードは私が記載しましたfunctions.phpにID部分を変えてコピペするだけで動くものでしょうか? functions.phpの //検索クエリのカスタマイズ以降、 ・if ( $query->is_search()){ の直下 ・if(isset( $_GET['cats'])){$cat = $_GET['cats'];}else{$cat = "";} の直後 ・if($cat){ の直下 上記3パターン、カテゴリーID部分を変えて試してみましたが時給での絞り込み結果には変化がありませんでした... もし何かおわかりでしたらお手数ではございますがご助言をお願いいたします。。 追記 $catをvar_dumpしたところ、選択したカテゴリーID自体は$catに入ってはいるのですが、それ以上の時給のカテゴリーIDは入っていませんでした。 $cat_addをvar_dumpしたところ、NULLと表示されました。
guest

0

長期的な運用の面倒さを考慮しないのなら、1500円の投稿に800円以上、1000円以上のカテゴリも付与すれば実現できるのではないでしょうか。

でなければ、カテゴリでの処理をやめて、価格のフィールド値で切り分けるとかですかね。

投稿2020/04/16 22:56

kchiku

総合スコア146

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

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

nekomaru01

2020/04/20 08:26

kchiku様 投稿ごとにカテゴリーを都度追加も考えたのですが、登録時にとても手間がかかってしまうため断念しました。。。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問