2009年10月29日 01:39

WordPress ショートコード

| http://www.kantenna.com/cgi-bin/mt/mt-tb.cgi/490

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.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');

投稿


<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時間くらいハマりました。

原因はなんのことはないネストと解釈されてるからです。


<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) 出来てた気がしたんですが他のショートコード検証してて気がつきました。

で解決法は


<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 />

とするしかなさそうです。

実行結果


商品1
¥5250
■商品1 : ¥5250
Not Found::アイテムがみつかりません

商品2
¥10500
■商品2 : ¥10500
Not Found::アイテムがみつかりません

WordPress ショートコードタグ:

トラックバック

  • http://www.kantenna.com/cgi-bin/mt/mt-tb.cgi/490
[WEBプログラム覚書]2010年01月21日 12:43
WordPressのカテゴリ判定について
WordPressってループ外で何かしようと思うと面倒だなと思ってましたが $wp_queryとか使うとそれほど面倒じゃなくできそうな感じです。
[WEBプログラム覚書]2010年03月30日 11:23
Wordpress プラグイン作成前の基礎知識
Wordpress プラグイン作成前の基礎知識
[WEBプログラム覚書]2010年04月27日 23:21
Wordpressのエクスポートとインポート使ってデータ移転するとguidが変わらない
Wordpressのエクスポートとインポート使ってデータ移転するとguidが変わらない
コメント (0)
コメントを投稿

(いままで、ここでコメントしたことがないときは、コメントを表示する前にこのブログのオーナーの承認が必要になることがあります。承認されるまではコメントは表示されません。そのときはしばらく待ってください。)





この情報を登録しますか?


先月アクセスが多かったページ