Solarized
HOME > WEBプログラム覚書 > WordPress ショートコード
WordPress ショートコード
Wordpressでハードコーディングしたくない文字とかどうするんだろうと思ってたらショートコードという便利な機能があった。
全然知らなかったです。こんな便利な機能、公式サイトでもっとアピールしといてもいいのに。
基本形
PHP
- <?php
-
- function bartag_func($atts) {
- extract(shortcode_atts(array(
- 'foo' => 'no foo',
- 'bar' => 'default bar',
- ), $atts));
-
- return "foo = {$foo}";
- }
- add_shortcode('bartag', 'bartag_func');
- ?>
テストコード
ハードコーディングしたくないもので真っ先に思いつくのは金額。
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 |
2010年1月21日 12:43
WordPressってループ外で何かしようと思うと面倒だなと思ってましたが
$wp_queryとか使うとそれほど面倒じゃなくできそうな感じです。続きを読む
2010年3月30日 11:23
Wordpress プラグイン作成前の基礎知識続きを読む
2010年4月27日 23:21
Wordpressのエクスポートとインポート使ってデータ移転するとguidが変わらない続きを読む
2011年6月28日 12:13
投稿タイプ、タクソノミー、タームとか意味わかんね続きを読む