カスタムフィールドの繰り返しをマスターしよう

ワードプレスのカスタムフィールドを利用して、使いやすい設定画面のインターフェースを提供できるプラグインCustom Field Suite(カスタムフィールド・スイート)を使ったレッスンを行いました。

Custom Field Suitedでは、カスタムフィールドで繰り返しのデータを登録できるようにしたいとき、ループ(loop)を使いますが、ループは様々なプログラミング言語に共通する制御なので、言語によって文法が違っても、考え方はとても良く似ています。

たとえば、loop_fruits という名前をつけたループの中にある、fruit_name というフィールドの値を取り出してHTMLに出力するには次のように記述します。

<?php
$values = CFS()->get('loop_fruits');
foreach ($values as $value) {
    $name = $value['fruit_name'];
    echo '$name';
}
?>

もし、ループの中に、「りんご」と「メロン」という2つのフルーツ名が登録されていれば、HTMLへの出力は次のようになります。

りんごメロン

このままでは改行もタグも何もついていないので、実用的ではありませんね。

<ul>
    <li>りんご</li>
    <li>メロン</li>
</ul>

このようなHTMLが出力されるようにするには、PHPにHTMLタグの出力を追加します。

<?php
$values = CFS()->get('loop_fruits');
if (!empty($values)) {
echo '<ul>\n';
foreach ($values as $value) {
    $name = $value['fruit_name'];
    echo '\t<li>' . $name . '</li>\n';
}
echo '</ul>\n';
?>

【3行目】
emptyは、文字列や配列の中身が空かどうかを判定するPHP関数で、空ならばtrue(真:Yesの意味)を返します。ここでは、「空でなければHTMLに出力する」という条件を付けたかったので、真偽を逆転させる演算子「!」を前に付けて、「もしも(if)、$valuesの中身が空っぽ(empty)ではない(!)場合は~」という条件にしました。

【4行目、7行目、9行目】
\nは、テキストの改行を表す特殊文字です。PHPに限らず、テキストエディタの中でEnterキーを押したとき改行されるのも、この特殊文字が挿入されています。改行コードは目に見えませんが、プログラムコードで表すと\nになります。

\tは、タブを表す特殊文字です。

もし\nや\tを付けなかったら、HTMLには次のように出力されてしまいます。

<ul><li>りんご</li><li>メロン</li></ul>

1行に繋がってしまうので、可読性がよくないですね。きちんと改行やタブで整形された出力結果を得るためには、\nや\tを出力に含めてあげる必要があります。

プログラムに登場する特殊文字(エスケープシーケンス)

\nと\t以外にも、特殊文字がいくつかあります。
こちらをご覧ください。

これらの特殊文字のことを、プログラミング用語で「エスケープシーケンス」と呼びます。シーケンスとは、「連続」「つながった」「一連の」という意味ですが、例えば¥マークは、プログラムでは特別な意味を持つ文字なので、そのまま¥と記述すると、純粋な文字としての¥ではなく、プログラム的な意味を持った記号として解釈されてしまいます。

そのため、プログラムの文法上、特別な意味を持つ記号を、そのままの文字としての意味を持たせたい場合は、先頭に¥マークを重ねて記述すればよいということになっています。

ですから、¥マークをそのまま出力したい場合は、¥¥ のように重ねて記述します。

プログラミングは、小さなルールの集合体なので、どうしても何らかの文字に特別な意味を持たせなければ文法が作れないんですね。だから、普通の文字として扱うことができるために、エスケープシーケンスというものが用意されているのです。