2018.09.03
WordPress
wordpressの一覧表示中にループ表示する要素を制御するif文の書き方

wordpressのブログや記事をアーカイブページやサイトトップで一覧表示するとき、記事に属するタグの一覧を表示することがあります。
特殊なケースですがこのとき、特定のタグだけ表示したくないときや、表示の種類を制御したいときがあります。
wordpressタグでこれを制御する場合、専用の記述やタグのパラメータを知っている必要があるのですが、実は一般的なif文で実現できるときがあります。
今回はそんなちょっと特殊なケースの制御法をお伝えします。
記事の一覧の中でタグの表示を選別
一覧表示の中でタグをリスト表示したい場合、foreachの中でwp_get_object_termsやget_the_tagsを利用します。
このとき、配列から展開された変数の値を指定してif文を書くことができます。
例えばnewというスラッグのタグだけ除外したい場合は以下のようにできます。
<?php
foreach($custom_post_tag_terms as $term){
if($term->slug != "new"){
$tag_term_link = get_term_link($term->slug, $custom_post_tag);
$tag_term_name = $term->name;
?>
<li><?php echo $tag_term_name; ?></li>
<?php }} ?>
これを記事の一覧表示を行うループに組み込むことで、タグのリスト表示を制御することができます。
以下はposttagというカスタム投稿の記事をループで呼び出しながら、その記事に属するタグの一覧をリスト表示しつつ、newというタグの表示だけは除外している例です。
<div class="archive__content">
<?php $args = array(
'numberposts' => '3',
'post_type' => 'post',
'tax_query' => array(
)
);
$customPosts = get_posts($args);
if($customPosts) : foreach($customPosts as $post) : setup_postdata( $post ); ?>
<?php
$custom_post_tag = 'posttag'; // 記事のタクソノミーのスラッグを指定
$custom_post_tag_terms = wp_get_object_terms($post->ID, $custom_post_tag);
?>
<div class="archive__tab">
<ul class="archive__list">
<?php // 記事に紐付いてるタームの一覧を表示、ただしnewを除外
foreach($custom_post_tag_terms as $term){
if($term->slug != "new"){
$tag_term_link = get_term_link($term->slug, $custom_post_tag);
$tag_term_name = $term->name;
?>
<li><?php echo $tag_term_name; ?></li>
<?php }} ?>
</ul>
</div>
<?php endforeach; endif; wp_reset_postdata(); //クエリのリセット ?>
</div>
まとめ
wordpressタグにはもちろん便利なものが揃っているのですが、一般的なif文やphp文法を併用することで狙った機能をより平易に実現する方法があることを紹介しました。
実現が難解な機能の実装を求められたとき、ちょっとした発送の転換で別の切り口が見えることもあるという参考になればと思います。
