WordPressオリジナルテーマを作っていると、自分ではなく、「第三者がどう動かすか」ということを考えるため、トライ・アンド・エラーの回数が多くて勉強になります。
昨日は、「テーマカスタマイザーにテキストボックスを用意して、その値に合わせて条件分岐をする」やりかたを学びました。
PHPで複数の値で条件分岐ができない問題
条件を自分で決めてコードを直接書くならarrayを使えば一発ですし、テキストボックスに入力される値が1つならまったく問題ありません。
ただ、テキストボックスにカンマ区切りで複数の値を入力された場合、echoで出力するのは簡単ですが、その値をそのまま条件分岐に使うことはできないんです。
例を挙げた方がわかりやすいかもしれません。こちらは「このカテゴリーに属する記事にだけ処理を適用する」というコード。
<?php if( in_category(textbox()) ) { ?>
// 処理
<?php } ?>
テキストボックスに入力された値をreturnで戻す関数textboxを定義し、条件分岐でそれを実行。返り値をカテゴリIDとして使います。
ただ、先述の通り、値が1つであればこの形でも問題ありませんが、複数系になってしまうと条件分岐ができません。
そして最も厄介なのが、arrayが使えないこと。下記の形でも条件分岐ができません。
<?php if( in_category(array(textbox())) ) { ?>
// 処理
<?php } ?>
explode関数を使えばいい
そこで、情報収集をしたところ、どうやら「explode」という関数を使えばいいことがわかりました。
explode — 文字列を文字列により分割する
array explode ( string $delimiter , string $string [, int $limit = PHP_INT_MAX ] )
文字列の配列を返します。この配列の各要素は、 string を文字列 delimiter で区切った部分文字列となります。
引用:explode
「文字列を文字列で分割」という説明の上、ググったら「爆発」という翻訳結果が表示されたので不安でしたが、この関数のおかげで助かりました。
解説
上記の引用元の例2のコードがわかりやすいのですが、文字列が配列として返されます。
<?php
$input2 = "hello,there";
var_dump( explode( ',', $input2 ) );
//実行結果
array(2)
(
[0] => string(5) "hello"
[1] => string(5) "there"
)
?>
このコードの区切り文字(delimiter)は半角カンマ、文字列の配列(string)はhelloとthereで、条件分岐の値としては下記のように扱われます。
("hello","there")
まさに、僕がやりたかったことです。
テキストボックスの入力値(複数)で条件分岐する場合
explode関数の使い方に関しては問題ないと思うので、サンプルとして「テーマカスタマイザーで用意したテキストボックスに入力された複数の値で条件分岐する」コードをご紹介します。
テーマカスタマイザーの拡張方法を知っていれば特に問題なく理解できるはずです。
サンプルコード
//テーマカスタマイザーにテキストボックス追加
$wp_customize->add_section( 'sample', array (
'title' => 'サンプル',
));
//読み込み方選択
$wp_customize->add_setting( 'is_sample', array (
'default' => null,
));
$wp_customize->add_control( 'is_sample', array(
'section' => 'sample',
'settings' => 'is_sample',
'label' => 'サンプル',
'type' => 'text',
));
//関数化
function is_test() {
return explode(',', get_theme_mod( 'is_test', null ));
}
//条件分岐
<?php if ( in_category(is_test()) ) { ?>
// 処理
<?php } ?>
補足
文章で説明すると、上記のサンプルコードはこのような内容になります。
- テーマカスタマイザーにテキストボックスを用意する
- テキストボックスに入力した文字列を、explode関数を使って半角カンマに区切る
- それを条件分岐として使う
まとめ
今のところ、こういった条件分岐以外での使い道がよくわかりませんが、ひとまず「arrayで対応できない場合はexplode関数を使う」と覚えておくことにします。
以上、ご参考までに!(`・ω・´)ゞ