Wordpressでハードコーディングしたくない文字とかどうするんだろうと思ってたらショートコードという便利な機能があった。 全然知らなかったです。こんな便利な機能、公式サイトでもっとアピールしといてもいいのに。
// [bartag foo="foo-value"]
function bartag_func($atts) {
extract(shortcode_atts(array(
'foo' => 'no foo',
'bar' => 'default bar',
), $atts));
return "foo = {$foo}";
}
add_shortcode('bartag', 'bartag_func');
ハードコーディングしたくないもので真っ先に思いつくのは金額。
function getItem($atts, $conts = null) {
$tax = 1.05;
$prefix = '¥';
// アイテムリスト
$db = array(
'error' => 'Not Found:アイテムがみつかりません',
'item1' => '商品1:5000',
'item2' => '商品2:10000',
'item3' => '商品3:15000'
);
// 表示用関数
$view_n = create_function('$name, $price, $tax, $prefix', 'return $name;');
$view_p = create_function('$name, $price, $tax, $prefix', 'return $prefix . $price * $tax;');
$view_np = create_function('$name, $price, $tax, $prefix', 'return sprintf("■%s : %s", $name, $prefix . $price * $tax);');
$view_error = create_function('$name, $price, $tax, $prefix', 'return $name . "::" . $price;');
extract(shortcode_atts(array(
'key' => 'error',
'type' => 'np'
), $atts));
if (array_key_exists($key, $db)) {
$item = explode(':', $db[$key]);
} else {
$item = explode(':', $db['error']);
$type = 'error';
}
// 変数名
$f = 'view_' . $type;
if (is_null($conts)) {
return ${$f}($item[0], $item[1], $tax, $prefix) . '<br />';
} else {
$html = sprintf('%s<br />%s<br />', ${$f}($item[0], $item[1], $tax, $prefix), $conts);
return $html;
}
}
// ショートコードハンドラを登録
add_shortcode('myItem', 'getItem');
<hr /> [myItem key="item1" type="n"] [myItem key="item1" type="p"] [myItem key="item1"] [myItem key="xx" type="n"] <hr /> [myItem key="item2" type="n"]商品2の説明[/myItem] [myItem key="item2" type="p"]商品2の説明[/myItem] [myItem key="item2"]商品2の説明[/myItem] [myItem key="xx" type="n"]商品2の説明[/myItem] <hr />
なぜだかちゃんと表示されません。なぜだかわかりますか? 自己完結型と囲み型は共存できないの?とか考え1時間くらいハマりました。
原因はなんのことはないネストと解釈されてるからです。
<hr /> [myItem key="item1" type="n"] <- 開始タグ [myItem key="item1" type="p"] [myItem key="item1"] [myItem key="xx" type="n"] <hr /> [myItem key="item2" type="n"]商品2の説明[/myItem] <-終了タグ [myItem key="item2" type="p"]商品2の説明[/myItem] [myItem key="item2"]商品2の説明[/myItem] [myItem key="xx" type="n"]商品2の説明[/myItem] <hr />
異なるタグなら大丈夫のようです。詳しくは下記ページの最後にある「制限事項」を 読むとわかるでしょう。
で解決法は
<hr /> [myItem key="item1" type="n" /] [myItem key="item1" type="p" /] [myItem key="item1" /] [myItem key="xx" type="n" /] <hr /> [myItem key="item2" type="n"]商品2の説明[/myItem] [myItem key="item2" type="p"]商品2の説明[/myItem] [myItem key="item2"]商品2の説明[/myItem] [myItem key="xx" type="n"]商品2の説明[/myItem] <hr />
でいけるかと思いましたがダメだったので、同じタグの自己完結型と囲み型が混在する場合は、
<hr /> [myItem key="item1" type="n"][/myItem] [myItem key="item1" type="p"][/myItem] [myItem key="item1"][/myItem] [myItem key="xx" type="n"][/myItem] <hr /> [myItem key="item2" type="n"]商品2の説明[/myItem] [myItem key="item2" type="p"]商品2の説明[/myItem] [myItem key="item2"]商品2の説明[/myItem] [myItem key="xx" type="n"]商品2の説明[/myItem] <hr />
とするしかなさそうです。
/ 金額 : ¥ 2,520
1-5
6-10
/ 金額 : ¥ 3,465
/ 金額 : ¥ 3,150
/ 金額 : ¥ 2,699
/ 金額 : ¥ 3,497
/ 金額 : ¥ 3,675