HOME>WEBプログラム覚書>WordPress ショートコード

WordPress ショートコード

Wordpressでハードコーディングしたくない文字とかどうするんだろうと思ってたらショートコードという便利な機能があった。 全然知らなかったです。こんな便利な機能、公式サイトでもっとアピールしといてもいいのに。

基本形

2017.10.26 extract()削除。理由は[WordPress] そろそろショートコードのサンプルでextract()を使うのを辞めようか。 | WEBプログラム覚書をご参照ください。

WordPressショートコード

  1. <?php
  2. function bartag_func($atts)
  3. {
  4.     $args = shortcode_atts(array(
  5.         'foo' => 'no foo',
  6.         'baz' => 'default baz',
  7.     ), $atts);
  8.  
  9.     return "foo = {$args['foo']}";
  10. }
  11. ?>

テストコード

ハードコーディングしたくないもので真っ先に思いつくのは金額。

function.php

PHP

  1. <?php
  2. function getItem($atts, $conts = null) {
  3.  
  4.     $tax = 1.05;
  5.     $prefix = '¥';
  6.  
  7.     // アイテムリスト
  8.     $db = array(
  9.     'error' => 'Not Found:アイテムがみつかりません',
  10.     'item1' => '商品1:5000',
  11.     'item2' => '商品2:10000',
  12.     'item3' => '商品3:15000'
  13.     );
  14.  
  15.     // 表示用関数
  16.     $view_n     = create_function('$name, $price, $tax, $prefix', 'return $name;');
  17.     $view_p     = create_function('$name, $price, $tax, $prefix', 'return $prefix . $price * $tax;');
  18.     $view_np    = create_function('$name, $price, $tax, $prefix', 'return sprintf("■%s : %s", $name, $prefix . $price * $tax);');
  19.     $view_error = create_function('$name, $price, $tax, $prefix', 'return $name . "::" . $price;');
  20.  
  21.     extract(shortcode_atts(array(
  22.         'key' => 'error',
  23.         'type' => 'np'
  24.     ), $atts));
  25.  
  26.     if (array_key_exists($key, $db)) {
  27.         $item = explode(':', $db[$key]);
  28.     } else {
  29.         $item = explode(':', $db['error']);
  30.         $type = 'error';
  31.     }
  32.  
  33.     // 変数名
  34.     $f = 'view_' . $type;
  35.  
  36.     if (is_null($conts)) {
  37.         return ${$f}($item[0], $item[1], $tax, $prefix) . '<br />';
  38.     } else {
  39.         $html = sprintf('%s<br />%s<br />', ${$f}($item[0], $item[1], $tax, $prefix), $conts);
  40.         return $html;
  41.     }
  42. }
  43.  
  44. // ショートコードハンドラを登録
  45. add_shortcode('myItem', 'getItem');
  46. ?>

投稿

PHP

  1. <?php
  2. <hr />
  3.  
  4. [myItem key="item1" type="n"]
  5. [myItem key="item1" type="p"]
  6. [myItem key="item1"]
  7. [myItem key="xx" type="n"]
  8.  
  9. <hr />
  10.  
  11. [myItem key="item2" type="n"]商品2の説明[/myItem]
  12. [myItem key="item2" type="p"]商品2の説明[/myItem]
  13. [myItem key="item2"]商品2の説明[/myItem]
  14. [myItem key="xx" type="n"]商品2の説明[/myItem]
  15.  
  16. <hr />
  17. ?>

実行結果


商品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

  1. <?php
  2. <hr />
  3. [myItem key="item1" type="n"] <- 開始タグ
  4. [myItem key="item1" type="p"]
  5. [myItem key="item1"]
  6. [myItem key="xx" type="n"]
  7.  
  8. <hr />
  9.  
  10. [myItem key="item2" type="n"]商品2の説明[/myItem] <-終了タグ
  11. [myItem key="item2" type="p"]商品2の説明[/myItem]
  12. [myItem key="item2"]商品2の説明[/myItem]
  13. [myItem key="xx" type="n"]商品2の説明[/myItem]
  14.  
  15. <hr />
  16. ?>

異なるタグなら大丈夫のようです。詳しくは下記ページの最後にある「制限事項」を 読むとわかるでしょう。

2009/11/10 追記
すみませんここから下の情報はおそらく間違ってます。(ver 2.7.1) 出来てた気がしたんですが他のショートコード検証してて気がつきました。

で解決法は

PHP

  1. <?php
  2. <hr />
  3. [myItem key="item1" type="n" /]
  4. [myItem key="item1" type="p" /]
  5. [myItem key="item1" /]
  6. [myItem key="xx" type="n" /]
  7.  
  8. <hr />
  9.  
  10. [myItem key="item2" type="n"]商品2の説明[/myItem]
  11. [myItem key="item2" type="p"]商品2の説明[/myItem]
  12. [myItem key="item2"]商品2の説明[/myItem]
  13. [myItem key="xx" type="n"]商品2の説明[/myItem]
  14.  
  15. <hr />
  16. ?>

でいけるかと思いましたがダメだったので、同じタグの自己完結型と囲み型が混在する場合は、

PHP

  1. <?php
  2. <hr />
  3. [myItem key="item1" type="n"][/myItem]
  4. [myItem key="item1" type="p"][/myItem]
  5. [myItem key="item1"][/myItem]
  6. [myItem key="xx" type="n"][/myItem]
  7.  
  8. <hr />
  9.  
  10. [myItem key="item2" type="n"]商品2の説明[/myItem]
  11. [myItem key="item2" type="p"]商品2の説明[/myItem]
  12. [myItem key="item2"]商品2の説明[/myItem]
  13. [myItem key="xx" type="n"]商品2の説明[/myItem]
  14.  
  15. <hr />
  16. ?>

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

実行結果


商品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

コメント

コメントする
Name
Email Address
URL