こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

Wordpressで記事がない場合にメッセージ表示

現在Wordpressで特定のカテゴリを一覧表示させる設定を行っています。

ただ、記事が一件もない場合に、その旨を伝えるメッセージを表示させたいのと全てを非表示にさせたいと思っているのですが上手くいきません。(メッセージを表示とコンテンツ全体非表示の2つの方法をお伺いしたいです)

以下、実際のソースになるのですが、該当するカテゴリに記事が0件の場合

「○○に関する記事は現在ありません。」

と表示させるにはどうしたらよいでしょうか?

<h2 class="entry-title">カテゴリ1の投稿一覧</h2>
<div class="container">
<?php
$postslist = get_posts('numberposts=-1&orderby=post_date&order=DESC&cat=1');
foreach ($postslist as $post) : setup_postdata($post);
?>
<ul class="hogehoge">
<a href="<?php the_permalink(); ?>" ><img src="<?php echo catch_that_image(); ?>" /></a>
<li><a href="<?php the_permalink();?>"><b><?php the_title(); ?></b></a><br />
<a href="<?php the_permalink();?>"><?php echo mb_substr(get_the_excerpt(),0, 80);?>…</a>
</li>
</ul>
<?php endforeach; ?>
</div><!-- /container -->


2つ目の質問となりますが、投稿が0の場合にメッセージの表示ではなく、

<h2 class="entry-title">カテゴリ1の投稿一覧</h2>

から、

</div><!-- /container -->

まで、全てのレイアウトを含めた表示を非表示にするにはどのような定義を行えばよいでしょうか?

試行錯誤試してみたのですが、本件2つの方法が解決できませんでした。
お詳しい方いらっしゃいましたらアドバイスのほどお願いいたします。

よろしくお願いします。

投稿日時 - 2014-09-30 11:03:14

QNo.8773749

すぐに回答ほしいです

質問者が選んだベストアンサー

そのテンプレート全体がどうなっているか分からないのでget_postsでもいいかも知れないが、代わりにWP_Queryを使うと使い勝手が良くなろう。
<?php $q = new WP_Query(array('cat' => 1, 'posts_per_page' => 1)); ?>
WP_Queryの引数はposts_per_archive_pageあたりを調べても参考になろう。
で、これで$qにはカテゴリIDが1の全投稿が入るわけだが、後は普通に$q->have_posts()で投稿があるかどうかが判定できる。
以上のことから質問のソースを書き換えると

~~~~snippetここから~~~~
<?php $q = new WP_Query(array('cat' => 1, 'posts_per_page' => 1)); ?>
<?php if($q->have_posts()): ?>
<h2 class="entry-title">カテゴリ1の投稿一覧</h2>
<div class="container">
<?php while($q->have_posts()): $q->the_post(); ?>
<ul class="hogehoge">
<li>
<a href="<?php the_permalink(); ?>" ><img src="<?php echo catch_that_image(); ?>" /></a>
</li>
<li>
<a href="<?php the_permalink();?>"><b><?php the_title(); ?></b></a><br />
<a href="<?php the_permalink();?>"><?php echo mb_substr(get_the_excerpt(), 0, 80); ?>…</a>
</li>
</ul>
<?php endwhile; ?>
</div><!-- /container -->
<?php else; ?>
○○に関する記事は現在ありまへん。
<?php endif; ?>
~~~~snippetここまで~~~~

上のコードは想像で書いたので実際に動かしてはないのでその辺はあれこれ試してみて欲しい。
まず、WP_Queryで$qの中に投稿を詰め込む。前述の通り$q->have_posts()が投稿有無の判断基準になるので
if($q->have_posts()):
// ある
else:
// ない
endif:
が一番大きなくくりになる。で、「ある」の方は今度はwhileで$q->have_posts()がfalseになるまでくるくるまわす。while開始直後に$q->the_post()を呼ぶ事でそこからendwhileの中までは通常のthe_title()などで$q内の現在の投稿にアクセスする事ができる。「ない」は普通に「ねーよ」というのを書けばいい。

直接は関係ないがHTMLの話。一応1投稿に対して1ulタグにしたかったのかなと思ってサンプルコードはこうしたが、明らかに意図が違う2つのliタグが入っているulタグよりかはdlタグを用いた方が良いのではないかな。それか<div>とかで1投稿に対する見せ方をレイアウトするか。

後、get_the_excerpt()の後ろのてんてんてんって要るかね?
80文字で切るも含めてこのあたりの制御はWP Multibyte Patchに任せたほうがいいような気もする。

投稿日時 - 2014-09-30 12:24:59

補足

有難う御座います。

その後、頂いたアドバイスとリファレンス的なサイトを渡り歩き、何とか思ったとおりの表示が出来ました。
投稿がない場合は、枠自体も表示されません。希望とおりです。

本当に有難う御座いました。
これから例のHTML部分を綺麗に修正したいと思います。

感謝、感謝です!m(_ _)m

投稿日時 - 2014-09-30 19:07:54

お礼

有難う御座います。
お教えいただいた方法で試しておりますが、現状、解決できておりません。
エラーとなり何も表示されません。

色々と試行錯誤して試してみたいと思います。

また、HTML部分でのご指摘も有難う御座います。
問題解決しましたら、もう少し綺麗にソースを整えてみたいと思います。


>>WP Multibyte Patch 
有難う御座います、今回このページのこの部分のみが80文字にしたいと考えていましたので、プログラム側で設定してみました。アドバイス有難う御座います。

ちなみに、上記ソースはWPのindex.phpテンプレートで試しているのですが、本来はカテゴリ1が表示されるのでしょうか?真っ白なので悩んでおります…。

投稿日時 - 2014-09-30 17:21:00

ANo.1

このQ&Aは役に立ちましたか?

8人が「このQ&Aが役に立った」と投票しています

回答(1)

あなたにオススメの質問