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

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

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

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

Q&A

解決済

1回答

2430閲覧

[WP] タームごとに表示したいです

cues

総合スコア23

WordPress

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

0グッド

0クリップ

投稿2017/07/10 11:08

編集2017/07/11 03:16

###前提・実現したいこと
お世話になります。
Wordpressで、カテゴリーをタブで切り替え、タグをチェックボックスで絞込みしたいと思っております。
カテゴリーをタブで切り替えする方法はわかるのですが、タグをチェックボックスで絞込みがうまくいきません。
参考イメージ(トップのニュース一覧):http://www.sanda.or.jp/

今回はカスタム投稿「チラシ:flyer」を作成しました。
ターム:お知らせ:notice、イベント:event(flyer_cat)
春:spring、夏:summer(flyer_tag)

もっと良いやり方があるのであれば、ご教授いただければ幸いですが、
JQでclassをつけることで、チェックボックスの絞込みができるものを見つけたので、
その方法で春のタームが表示されるときは、liにspringのクラスがついて表示されるような流れで考えています。

###発生している問題・エラーメッセージ
PHPのif条件がうまくいっていないのか、
最後の <li class="spring summer">しか表示されません。
もし、タームに春がついているときは<li class="spring">を表示、
タームに夏がついているときは、<li class="summer">を表示、
タームに春、夏がついているときは <li class="spring summer">を表示する形にしたいです。

php

1 2 3<!-- 絞込み要素選択ここから --> 4<div id="select"> 5 6 <!-- 絞り込まない(全表示)ボタン --> 7 <label class="selected"><input type="radio" id="all" checked="checked">絞り込まない</label> 8 9 <!-- 絞込みに使うタグをidとして指定します --> 10 <label><input type="checkbox" id="spring" class="sort"></label> 11 <label><input type="checkbox" id="summer" class="sort"></label> 12 13</div> 14<!-- 絞込み要素選択ここまで --> 15 16 17<!-- 絞込まれる要素ここから --> 18<div id="result"> 19 20 <!-- 絞込みに使うタグをclassとして指定します --> 21 22 <ul> 23 <?php 24$goodslist = get_posts( array( 25 'post_type' => 'flyer', //特定のカスタム投稿タイプスラッグを指定 26 'taxonomy' => 'flyer_cat', //特定のカスタムタクソノミースラッグを指定 27 'term' => 'event', //特定のカスタムタクソノミー内のタームスラッグを指定 28 'posts_per_page' =>10//取得記事件数 29 )); 30foreach( $goodslist as $post ): 31setup_postdata( $post ); 32?> 33 <?php if (have_posts()): ?> 34 <?php while(have_posts()):the_post(); ?> 35 <?php $term = esc_html(get_post_type_object(get_post_type())->name); ?> 36 <?php if($term=='spring'): ?> 37 <li class="spring"> 38 <span class="samune"> 39 </span> 40 <span><?php echo get_the_term_list($post->ID, 'flyer_cat'); ?></span> 41 42 43 <?php 44 if ($terms = get_the_terms($post->ID, 'flyer_tag')) { 45 foreach ( $terms as $term ) { 46 $term_slug = $term -> slug; 47 echo ('<span class="') ; 48 echo esc_html($term_slug) ; 49 echo ('">') ; 50 echo esc_html($term->name) ; 51 echo ('</span>') ; 52 } 53 } 54?> 55 56 57 <h4><a href="<?php the_permalink(); ?>"><?php the_title(); ?></a></h4> 58 59 </li> 60 61 <?php elseif($term=='summer') : ?> 62 <li class="summer"> 63 <span class="samune"> 64 </span> 65 <span><?php echo get_the_term_list($post->ID, 'flyer_cat'); ?></span> 66 67 68 <?php 69 if ($terms = get_the_terms($post->ID, 'flyer_tag')) { 70 foreach ( $terms as $term ) { 71 $term_slug = $term -> slug; 72 echo ('<span class="') ; 73 echo esc_html($term_slug) ; 74 echo ('">') ; 75 echo esc_html($term->name) ; 76 echo ('</span>') ; 77 } 78 } 79?> 80 81 82 <h4><a href="<?php the_permalink(); ?>"><?php the_title(); ?></a></h4> 83 84 </li> 85 86 87 88 89 <?php else : ?> 90 <li class="spring summer"> 91 <span class="samune"> 92 </span> 93 <span><?php echo get_the_term_list($post->ID, 'flyer_cat'); ?></span> 94 95 96 <?php 97 if ($terms = get_the_terms($post->ID, 'flyer_tag')) { 98 foreach ( $terms as $term ) { 99 $term_slug = $term -> slug; 100 echo ('<span class="') ; 101 echo esc_html($term_slug) ; 102 echo ('">') ; 103 echo esc_html($term->name) ; 104 echo ('</span>') ; 105 } 106 } 107?> 108 109 110 <h4><a href="<?php the_permalink(); ?>"><?php the_title(); ?></a></h4> 111 112 </li> 113 <?php endif; ?> 114 <?php endwhile; ?> 115 116 117 <?php else : ?> 118 <p>ただいま準備中です。しばらくお待ちください。</p> 119 <?php endif; ?> 120 121 <?php wp_reset_postdata(); wp_reset_query(); ?> 122 123 124 125 <?php 126 endforeach; 127 wp_reset_postdata(); 128?> 129 </ul> 130 131 132 133 134</div> 135<!-- 絞込まれる要素ここまで -->

宜しくお願いいたします。

###試したこと追記
上記を下記のように修正したところ、
タームに春のみついているときは <li class="spring">
タームに夏のみついているときは、<li class="summer">を表示することができたのですが、
タームに春、夏 複数ついているときは <li class="spring">の条件式に当てはまってしまいます。

javascript

1 2 <ul> 3 <?php 4$goodslist = get_posts( array( 5 'post_type' => 'flyer', //特定のカスタム投稿タイプスラッグを指定 6 'taxonomy' => 'flyer_cat', //特定のカスタムタクソノミースラッグを指定 7 'term' => 'notice', //特定のカスタムタクソノミー内のタームスラッグを指定 8 'posts_per_page' =>10//取得記事件数 9 )); 10foreach( $goodslist as $post ): 11setup_postdata( $post ); 12?> 13 <?php if (is_object_in_term($post->ID, 'flyer_tag', 'spring')): ?> 14 15 <li class="spring"> 16 <span class="samune"> 17 </span> 18 <span><?php echo get_the_term_list($post->ID, 'flyer_cat'); ?></span> 19 <span><?php echo get_the_term_list($post->ID, 'flyer_tag'); ?></span> 20 <h4><a href="<?php the_permalink(); ?>"><?php the_title(); ?></a></h4> 21 22 </li> 23 24 <?php elseif (is_object_in_term($post->ID, 'flyer_tag', 'summer')): ?> 25 <li class="summer"> 26 <span class="samune"> 27 </span> 28 <span><?php echo get_the_term_list($post->ID, 'flyer_cat'); ?></span> 29 <span><?php echo get_the_term_list($post->ID, 'flyer_tag'); ?></span> 30 31 <h4><a href="<?php the_permalink(); ?>"><?php the_title(); ?></a></h4> 32 33 </li> 34 35 36 <?php elseif (is_object_in_term($post->ID, 'flyer_tag',array('spring','summer'))): ?> 37 38 <li class="spring summer"> 39 <span class="samune"> 40 </span> 41 <span><?php echo get_the_term_list($post->ID, 'flyer_cat'); ?></span> 42 <span><?php echo get_the_term_list($post->ID, 'flyer_tag'); ?></span> 43 44 45 46 <h4><a href="<?php the_permalink(); ?>"><?php the_title(); ?></a></h4> 47 48 </li> 49 <?php else : ?> 50 見つかりません。 51 52 <?php endif; ?> 53 54 <?php wp_reset_postdata(); wp_reset_query(); ?> 55 56 57 58 <?php 59 endforeach; 60 wp_reset_postdata(); 61?> 62 </ul> 63 64

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

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

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

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

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

退会済みユーザー

退会済みユーザー

2017/07/10 13:49

WordPress(PHP)の関数で出力しているHTML部分は想定している形に出力されていますか。PHPとjQueryのどちらの問題かを切り分けてみてはいかがですか。
cues

2017/07/11 02:16

コメントありがとうございます。jQueryは、正常に動作していますので、PHPの方が問題だと思います。
guest

回答1

0

ベストアンサー

全体的な構造がごちゃごちゃしているので自信がありませんが、

PHP

1<?php $term = esc_html(get_post_type_object(get_post_type())->name); ?>

で取得している$termに想定した値(summerとかspringとか)が入っていないのではないでしょうか。


追記
if文は上から順に処理されるので、「春かつ夏」の条件を先に書けばいいかと思います。

ex1)

$bSpring = is_object_in_term($post->ID, 'flyer_tag', 'spring'); $bSummer = is_object_in_term($post->ID, 'flyer_tag', 'summer'); if($bSpring && $bSummer) // 春かつ夏 else if($bSpring) // 春 else ...

ex2)

$taxonomies = 'flyer_tag'; $args = 'fields=slugs'; $terms = get_terms( $taxonomies, $args ); if(in_array('spring', $terms) && in_array('summer', $terms)) // 春かつ夏 else ...

投稿2017/07/11 02:34

編集2017/07/11 12:19
退会済みユーザー

退会済みユーザー

総合スコア0

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

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

cues

2017/07/11 03:25

早速のコメントありがとうございます^^ ご指摘いただきました部分見直してみました。 見直したところ問題が発生したのですが、 <?php if (is_object_in_term($post->ID, 'flyer_tag', 'spring')): ?> で取得したところ、 春、夏 複数選択している場合でも、 <?php if (is_object_in_term($post->ID, 'flyer_tag', 'spring')): ?> の条件式に当てはまってしまうようです。 春のみ選択されている場合のみ条件式に当てはめることは可能なのでしょうか... 宜しくお願いいたします。
退会済みユーザー

退会済みユーザー

2017/07/11 06:11

春を含み、かつ夏を含まない等の条件を指定するか、 季節を含むカウントを事前に行って、複数選択でないのを確認するとか ケースによっていろいろ変わると思います。 
cues

2017/07/11 11:13

コメントありがとうございます。 そういった条件もあるのですね、調べてみます^^
cues

2017/07/12 00:45

miz 様 ご丁寧に教えていただきありがとうございます! 思い通りの動作になりました^^
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.51%

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

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

質問する

関連した質問