なんか内容が若干おかしかったので少し書き直しました
あけましておめでとうございます。
バレンタインということでチョコを貰ったんですが、なんかすごくリアルなモンキーレンチの形をしてまして、これは頭のネジを閉めなおせということなのだろうか…と思いつつどうやって食べようか悩んでいるところでございます。
実は年が明けてから一気に仕事が忙しくなってきて、プライベートでやりたいことがなかなか消化できずに居ます…。
まぁ、時間がないというのは言い訳で、時間は作るもんだとか言ったりもしますけど、正直1日が50時間くらいないと足りない気分です。
さて、本日のお話ですが、仕事で使うテーマとかで、テーマインストール直後(記事が全然ない状態)から、お客さんとかインストールした人向けに初期設定のガイドを組み込みたいなと思いまして、
たとえば、トップページのお知らせ欄なんかは、WordPress のループの else の方(つまり記事がみつからんかったとき表示される方)にそれを書けばいいんですが、ウィジェットの場合はどうしたもんかな?
というのを調べてみましたのでそのメモです。あと、ちょっとだけハマったのでそこについても軽く触れておきます。
お知らせが未登録の時は「このカテゴリにいれておくと出るよ」的なメッセージを出す
まずは本題に入る前に、おさらいじゃないですが、お知らせが未登録の時にお知らせ欄に「このカテゴリにいれてね」的なメッセージを出す方法です。
これは簡単ですね。WordPress のループと呼ばれる部分には、 if (have_posts()) という条件分岐があります。
これは「投稿があるかどうか」の分岐です。これで、投稿データがある場合は、さらに続けて while(have_posts()) として、「ループ」の「ループ部分」…ってややこしいな。要は実際に繰り返す処理の部分ですね。これが続いてくるわけです。
で、 endwhile でループが終了したあとにくる else これが最初の if に対する else ですので、要は「記事がなかった時」の処理になり、 endif で終わる、という感じです。
場合によっては else は書かないこともあるっぽいですけど、何も表示されない時にエラーなのか記事がないのかの切り分けにもなるんで入れとくといいと思いますよ。
まとめると、
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
<?php $args = array( 'category_name' => 'site_news', 'posts_per_page' => 5, ); $query = new WP_Query( $args ); ?> <dl> <?php if ($query->have_posts()): while($query->have_posts()): $query-> the_post(); ?> <dt><?php the_time('Y.m.d'); ?></dt> <dd><a href="<?php the_permalink(); ?>"><?php the_title(); ?></a></dd> <?php endwhile; wp_reset_postdata(); else: ?> <dt><?php echo date('Y.m.d'); ?></dt> <dd><a href="javascript:void(0);">お知らせはありません。「お知らせ」カテゴリに投稿を作成してみましょう</a></dd> <?php endif; ?> </dl> |
こんなかんじ?
まぁとにかく、何が言いたいのかというと、投稿の場合は「中身があるかどうかを判定する手段がある」ので、見つからなかった場合はこっちみたいな分岐が可能です。
では、ウィジェット(dynamic_sidebar)の場合はどうすればいいのでしょうか?
実はウィジェットでも簡単にできる
さて、ようやく表題の話になるんですが、ウィジェット(ダイナミックサイドバー)が空な場合の判定とかで調べてみたところ、dynamic_sidebar にも返り値が設定されていて、Codex にも
サイドバーの中にウィジェットが登録されているときは True を、ウィジェットが登録されていない、サイドバーが見つからない時は False を返します。
とあります。
関数リファレンス/dynamic sidebar – WordPress Codex 日本語版
つまり、これそのもので中身の有無やサイドバーの有無を判定できるわけですね。
ということで、作ってみました
1 2 3 4 5 6 7 8 9 10 11 12 |
<div id="sidebar"> <?php if (dynamic_sidebar('my_sidebar')): dynamic_sidebar('my_sidebar'); else: ?> <div class="widget no-widget"> <h3>ないよー</h3> <p>ウィジェットが登録されてないようですぞ</p> </div> </div> <?php endif; ?> |
で、とりあえずウィジェット登録なしで表示してみると、問題なく「ないよー」が表示されました。
続いてウィジェットを登録してみると……なぜかウィジェットが2個になりました。
dynamic_sidebar 関数は、 echo とかつけないでもサイドバーがでるので、上の関数が TRUE を返すと、 dynamic_sidebar 関数を2回呼び出したのと同じ結果になっているんだと思います。まぁ実際2回かかれてますが。判定用に入れた方まで中身を吐き出してるんですかね。
確かにウィジェットがある場合は true を返すとありますが、それと同時に中身も吐き出しちゃいます。
じゃあ、TRUE になるときってのはどうやって IF 文を書けば良いのかって話になってきますが、今までは返り値が TRUE の場合って考え方で組んでいましたが、FALSEの場合は「返り値がFALSEでついでに出力も行われない」わけなので確実にFALSEという bool 値だけをゲットできます。
なので、「ウィジェットがある場合はダイナミックサイドバーを表示する」のではなく、「ウィジェットがない場合は代替メッセージを出す」ような組み方をすればOKということです。
というわけで以下のように書き換えます。
1 2 3 4 5 6 7 8 |
<div id="sidebar"> <?php if (!dynamic_sidebar('my_sidebar')): ?> <div class="widget no-widget"> <h3>ないよー</h3> <p>ウィジェットが登録されてないようですぞ</p> </div> <?php endif; ?> </div> |
このような方法にすれば、このIF文がTRUEの場合は、そのまま判定に使用した dynamic_sidebar() が動作して中身を出力してくれます。
そしてFALSEの場合は代替メッセージが表示されます。この際もやっぱり関数が動作して中身が出てきそうに見えますが、そもそも中身が入ってないので出力されたとしても何も表示されませんから大丈夫です。
というかそもそも出てきちゃったらこの関数がうまく機能していないということになるような気もしますが…w
[…] )) として、「ループ」の「ループ部分」…ってややこしいな。 [紹介元] ダイナミックサイドバーにウィジェットがないときはデフォルトメッセージを出す方法と、意外な罠 | NeGiMeMo.net […]