【生活】たまにやってくる技術的な話【日常】

梅雨はどこかへ行ってしまった?

麻雀一番街

サブの調子が悪く、今週は大きく負けた気分。

メインは合計13戦で着順がトップから順に2回・5回・5回・1回。
オール銀河卓。
平均順位が2.38。
先週より170ptsのプラス。

サブ、合計13戦で着順がトップから順に2回・2回・3回・6回。
平均順位が3.0。
オール銀河卓。
先週より1315ptsのマイナス。

観る雀

Mトーナメント

一応観てはいたけど「ともくんって勝ったんだっけ?」と思い、公式サイトを確認してしまった。
先ほどまでやっていた7月5日(金)の4試合は比較的内容を覚えています。

映画

観てません。

ドラマ

録画が貯まる一方。

アニメ

転生したらスライムだった件

公式サイト

RPGツクールが始まったw

ガンゲイル・オンライン

公式サイト

1期の第1話が先ほど再放送されたので観ました。

本家SAOでも2期前半のファントム・バレット編が大好きな俺。
GGOの世界観がホントに大好き。
なので、あっという間に引き込まれるように夢中になって観ていました。
来週のO.A.が楽しみ。

毎週金曜夜は転スラとGGOでめっちゃ楽しみに迎えることになります。

ジム活

お休み中。

巻き爪

左母趾の爪の外側(示趾側)の部分、まだまだ痛いです。

is_active_sidebarでハマった話

仕事でハマった話の備忘録です。
ほとんどの人は興味ないと思いますが、検索で訪れる方がいるかもしれないので、書いておきます。

WordPressのブランクテーマのblankslateで子テーマを作成して構築している案件での出来事。

  • お客さんが管理画面から編集可能なように(大前提)
  • フッタにWordPressの管理画面から登録したウィジェットを表示させる
  • ウィジェットfooter-01にはロゴを配置
  • ウィジェットfooter-02にはテキストアンカーと権利表記を表示
  • footer-01とfooter-02はそれぞれdivで囲んでそれぞれのclassを与えたい

これをやるだけなら、functions.phpに

<?php
register_sidebar(array('name' => 'footer-01'));
register_sidebar(array('name' => 'footer-02'));
?>

を書いて、さらにfooter.phpに

<div class="footer-01"><?php dynamic_sidebar('footer-01'); ?></div>
<div class="footer-02"><?php dynamic_sidebar('footer-02'); ?></div>

と書けばいいのだけど、もしもウィジェットの中身が空であればdivタグすら出力したくない。

そこで調べてみると、register_sidebarにはオプションが設定できるようです。
なのでfunctions.phpの内容を以下に変えてみました。

<?php
register_sidebar(array(
	'name' => 'footer-01',
	'before_widget' => '<div class="footer-01">',
	'after_widget' => '</div>',
));
register_sidebar(array(
	'name' => 'footer-02',
	'before_widget' => '<div class="footer-02">',
	'after_widget' => '</div>',
));
?>

そしてfooter.phpにはdivで囲まずに単純に出力の関数だけを書いてみました。

<?php
# case-1
dynamic_sidebar('footer-01');
dynamic_sidebar('footer-02');
?>

結果、ウィジェットがロゴ1個しかエントリしていないfooter-01はいいんだけど、ウィジェットを2個エントリしたfooter-02は以下のようなhtmlになってしまいました。

<div class="footer-02">テキストアンカー</div>
<div class="footer-02">権利表記</div>

この2つをまとめてdivで囲みたいので、これじゃダメ。

さらに調べてみると、is_active_sidebarという関数があるようで、そのウィジェットがイキかどうか調べて真偽を返してくれるようです。
いろんなサイトで調べて、is_active_sidebar(‘footer-01’)など、パラメータにdynamic_sidebarのID番号や名前を指定するように書いてあるので、そうしてみました。

functions.phpはそのままで、footer.phpに以下のように書きました。

<?php
# case-2
if(is_active_sidebar('footer-01')):
	echo '<div class="footer-01">';
	dynamic_sidebar('footer-01');
	echo '</div>' . "\n";
endif;
if(is_active_sidebar('footer-02')):
	echo '<div class="footer-02">';
	dynamic_sidebar('footer-02');
	echo '</div>' . "\n";
endif;
?>

# case-1 はちゃんと出力されるのに、この# case-2 は何も出力されませんでした。

なぜ?

register_sidebarで指定しているのは’name’。
繰り返しになりますが、is_active_sidebarは名前の指定でいけるといろんなサイトに書いてありました。
なのにダメ。

では、idを設定してidで呼び出したらいけるのか…と思い、やってみました。

functions.phpにこう書きました。

<?php
register_sidebar(array(
	'name' => 'footer-01',
	'id' => 'footer-widget-01',
	'before_widget' => '<div class="footer-item-01">',
	'after_widget' => '</div>',
));
register_sidebar(array(
	'name' => 'footer-02',
	'id' => 'footer-widget-02',
	'before_widget' => '<div class="footer-item-02">',
	'after_widget' => '</div>',
));
?>

意図的にnameとは違う値のidを与えてみました。
そしてfooter.phpに以下のように書きました。

<?php
# case-3
if(is_active_sidebar('footer-widget-01')):
	echo '<div class="footer-01">';
	dynamic_sidebar('footer-widget-01');
	echo '</div>' . "\n";
endif;
if(is_active_sidebar('footer-widget-02')):
	echo '<div class="footer-02">';
	dynamic_sidebar('footer-widget-02');
	echo '</div>' . "\n";
endif;
?>

念のため、dynamic_sidebarも新たに設定したidで呼び出すことにしました。

これでようやく意図通りの結果になりました。

結論

is_active_sidebarを使用する際は必ずregister_sidebarにてidを設定し、そのidで呼び出すこと。
dynamic_sidebarはnameで指定しても出力される。

今週はこれに3時間くらい費やしてもうた。
そしてこの記事を書くのに2時間以上費やしてもうた。