HOME>WEBプログラム覚書>WordPress ショートコード
WordPress ショートコード
Wordpressでハードコーディングしたくない文字とかどうするんだろうと思ってたらショートコードという便利な機能があった。
全然知らなかったです。こんな便利な機能、公式サイトでもっとアピールしといてもいいのに。
基本形
2017.10.26 extract()削除。理由は[WordPress] そろそろショートコードのサンプルでextract()を使うのを辞めようか。 | WEBプログラム覚書をご参照ください。
WordPressショートコード
<?php
function bartag_func($atts)
{
$args = shortcode_atts(array(
'foo' => 'no foo',
'baz' => 'default baz',
), $atts);
return "foo = {$args['foo']}";
}
?>
テストコード
ハードコーディングしたくないもので真っ先に思いつくのは金額。
function.php
PHP
<?php
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');
?>
投稿
PHP
<?php
<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
[myItem key="item1" type="p"]
[myItem key="item1"]
[myItem key="xx" type="n"]
[myItem key="item2" type="n"]商品2の説明
¥10500
商品2の説明
■商品2 : ¥10500
商品2の説明
Not Found::アイテムがみつかりません
商品2の説明
なぜだかちゃんと表示されません。なぜだかわかりますか?
自己完結型と囲み型は共存できないの?とか考え1時間くらいハマりました。
原因はなんのことはないネストと解釈されてるからです。
PHP
<?php
<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 />
?>
異なるタグなら大丈夫のようです。詳しくは下記ページの最後にある「制限事項」を
読むとわかるでしょう。
2009/11/10 追記
すみませんここから下の情報はおそらく間違ってます。(ver 2.7.1)
出来てた気がしたんですが他のショートコード検証してて気がつきました。
で解決法は
PHP
<?php
<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 />
?>
でいけるかと思いましたがダメだったので、同じタグの自己完結型と囲み型が混在する場合は、
PHP
<?php
<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 />
?>
とするしかなさそうです。
実行結果
商品1
¥5250
■商品1 : ¥5250
Not Found::アイテムがみつかりません
商品2
¥10500
■商品2 : ¥10500
Not Found::アイテムがみつかりません
投稿日 |
2009年10月29日 01:39 |
カテゴリ |
PHP |
タグ |
WordPress | テストコード |
トラックバック URL |
http://www.kantenna.com/cgi-bin/mt504/mt-tb.cgi/1175 |
コメント