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

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

ただいまの
回答率

90.51%

  • WordPress

    8927questions

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

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

解決済

回答 1

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 772

cues

score 17

前提・実現したいこと

お世話になります。
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">を表示する形にしたいです。

<!-- 絞込み要素選択ここから -->
<div id="select">

    <!-- 絞り込まない(全表示)ボタン -->
    <label class="selected"><input type="radio" id="all" checked="checked">絞り込まない</label>

    <!-- 絞込みに使うタグをidとして指定します -->
    <label><input type="checkbox" id="spring" class="sort"></label>
    <label><input type="checkbox" id="summer" class="sort"></label>

</div>
<!-- 絞込み要素選択ここまで -->


<!-- 絞込まれる要素ここから -->
<div id="result">

    <!-- 絞込みに使うタグをclassとして指定します -->

            <ul>
    <?php
$goodslist = get_posts( array(
       'post_type' => 'flyer', //特定のカスタム投稿タイプスラッグを指定
       'taxonomy' => 'flyer_cat', //特定のカスタムタクソノミースラッグを指定
       'term' => 'event', //特定のカスタムタクソノミー内のタームスラッグを指定
       'posts_per_page' =>10//取得記事件数
  ));
foreach( $goodslist as $post ):
setup_postdata( $post );
?>
                <?php if (have_posts()): ?>
                        <?php while(have_posts()):the_post(); ?>
                            <?php $term = esc_html(get_post_type_object(get_post_type())->name); ?>
        <?php if($term=='spring'): ?>        
                    <li class="spring">
                <span class="samune">
                                    </span>
                                <span><?php echo get_the_term_list($post->ID, 'flyer_cat'); ?></span>


                        <?php
    if ($terms = get_the_terms($post->ID, 'flyer_tag')) {
        foreach ( $terms as $term ) {
            $term_slug = $term -> slug;
            echo ('<span class="') ;
            echo esc_html($term_slug) ;
            echo ('">') ;
            echo esc_html($term->name)  ;
            echo ('</span>') ;
        }
    }
?>


                                <h4><a href="<?php the_permalink(); ?>"><?php the_title(); ?></a></h4>

                            </li>

    <?php elseif($term=='summer') : ?>
                    <li class="summer">
                                <span class="samune">
                                    </span>
                                <span><?php echo get_the_term_list($post->ID, 'flyer_cat'); ?></span>


                        <?php
    if ($terms = get_the_terms($post->ID, 'flyer_tag')) {
        foreach ( $terms as $term ) {
            $term_slug = $term -> slug;
            echo ('<span class="') ;
            echo esc_html($term_slug) ;
            echo ('">') ;
            echo esc_html($term->name)  ;
            echo ('</span>') ;
        }
    }
?>


                                <h4><a href="<?php the_permalink(); ?>"><?php the_title(); ?></a></h4>

                            </li>




        <?php else : ?>
                                    <li class="spring summer">
                                <span class="samune">
                                    </span>
                                <span><?php echo get_the_term_list($post->ID, 'flyer_cat'); ?></span>


                        <?php
    if ($terms = get_the_terms($post->ID, 'flyer_tag')) {
        foreach ( $terms as $term ) {
            $term_slug = $term -> slug;
            echo ('<span class="') ;
            echo esc_html($term_slug) ;
            echo ('">') ;
            echo esc_html($term->name)  ;
            echo ('</span>') ;
        }
    }
?>


                                <h4><a href="<?php the_permalink(); ?>"><?php the_title(); ?></a></h4>

                            </li>
                            <?php endif; ?>
                        <?php endwhile; ?>


                    <?php else : ?>
                        <p>ただいま準備中です。しばらくお待ちください。</p>
                    <?php endif; ?>

                    <?php wp_reset_postdata(); wp_reset_query(); ?>



                                <?php
  endforeach;
  wp_reset_postdata();
?>
                </ul>




</div>
<!-- 絞込まれる要素ここまで -->

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

試したこと追記

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

            <ul>
                            <?php
$goodslist = get_posts( array(
       'post_type' => 'flyer', //特定のカスタム投稿タイプスラッグを指定
       'taxonomy' => 'flyer_cat', //特定のカスタムタクソノミースラッグを指定
       'term' => 'notice', //特定のカスタムタクソノミー内のタームスラッグを指定
       'posts_per_page' =>10//取得記事件数
  ));
foreach( $goodslist as $post ):
setup_postdata( $post );
?>
                <?php if (is_object_in_term($post->ID, 'flyer_tag', 'spring')): ?>

                    <li class="spring">
                                <span class="samune">
                                    </span>
                                <span><?php echo get_the_term_list($post->ID, 'flyer_cat'); ?></span>
    <span><?php echo get_the_term_list($post->ID, 'flyer_tag'); ?></span>
                                <h4><a href="<?php the_permalink(); ?>"><?php the_title(); ?></a></h4>

                            </li>

    <?php elseif  (is_object_in_term($post->ID, 'flyer_tag', 'summer')): ?>
                    <li class="summer">
                                <span class="samune">
                                    </span>
                                <span><?php echo get_the_term_list($post->ID, 'flyer_cat'); ?></span>
    <span><?php echo get_the_term_list($post->ID, 'flyer_tag'); ?></span>

                                <h4><a href="<?php the_permalink(); ?>"><?php the_title(); ?></a></h4>

                            </li>


    <?php elseif  (is_object_in_term($post->ID, 'flyer_tag',array('spring','summer'))): ?>

                            <li class="spring summer">
                                <span class="samune">
                                    </span>
                                <span><?php echo get_the_term_list($post->ID, 'flyer_cat'); ?></span>
                        <span><?php echo get_the_term_list($post->ID, 'flyer_tag'); ?></span>



                                <h4><a href="<?php the_permalink(); ?>"><?php the_title(); ?></a></h4>

                            </li>
        <?php else : ?>
                        見つかりません。

                    <?php endif; ?>

                    <?php wp_reset_postdata(); wp_reset_query(); ?>



                                <?php
  endforeach;
  wp_reset_postdata();
?>
                </ul>
  • 気になる質問をクリップする

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • miz

    2017/07/10 22:49

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

    キャンセル

  • cues

    2017/07/11 11:16

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

    キャンセル

回答 1

checkベストアンサー

+2

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

<?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 12: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 15:11

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

    キャンセル

  • 2017/07/11 20:13

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

    キャンセル

  • 2017/07/12 09:45

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

    キャンセル

同じタグがついた質問を見る

  • WordPress

    8927questions

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