KANTENNA.COM

Solarized

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

WordPress ショートコード

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

基本形

PHP
  1.  <?php
  2.  // [bartag foo="foo-value"]
  3.  function bartag_func($atts) {
  4.   extract(shortcode_atts(array(
  5.   'foo' => 'no foo',
  6.   'bar' => 'default bar',
  7.   ), $atts));
  8.  
  9.   return "foo = {$foo}";
  10.  }
  11.  add_shortcode('bartag', 'bartag_func');
  12.  ?>

テストコード

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

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::アイテムがみつかりません

トラックバック(4)

2010年1月21日 12:43

WordPressのカテゴリ判定についてWEBプログラム覚書

WordPressってループ外で何かしようと思うと面倒だなと思ってましたが $wp_queryとか使うとそれほど面倒じゃなくできそうな感じです。続きを読む

2010年3月30日 11:23

Wordpress プラグイン作成前の基礎知識WEBプログラム覚書

Wordpress プラグイン作成前の基礎知識続きを読む

2010年4月27日 23:21

Wordpressのエクスポートとインポート使ってデータ移転するとguidが変わらないWEBプログラム覚書

Wordpressのエクスポートとインポート使ってデータ移転するとguidが変わらない続きを読む

2011年6月28日 12:13

[WordPress]投稿タイプ、タクソノミー、タームについてWEBプログラム覚書

投稿タイプ、タクソノミー、タームとか意味わかんね続きを読む

コメント

コメントする
Name
Email Address
URL
TIME LINE
2012
02.03

[jQuery]closest()とparents()

今から16年前Netscapeブラウザのソースコードの公開方法の会議の中で、初めてオープンソースという言葉が使われた今日、 みなさんいかがお過ごしでしょうか。

今回の投稿はそれとは関係のないjQueryのparents()とclosest()が 似てたので何が違うのか試した時のメモです。

2012
02.01

[jQuery Mobile]初期化イベントメモ

jQuery Mobileは読み込まれてから

mobileinit -> pagebeforecreate -> pagecreate -> pageinit

の順番でイベントが発生する。

2012
02.01

[WordPress]管理画面のフッタのフィルタとアクション。

時間も時間なので、あまり使用頻度の高くない微妙なネタを。

会員制サイトなどで不特定多数の人にログインさせる場合、フッタのバージョン情報は隠しておきたかったり、 こじゃれたメッセージを表示したいときとか使うアクションとフィルタ。

2012
01.28

[WordPress] ブログの情報を取得する方法とノーキャッシュ疑惑

ブログのget_bloginfo()で取れないデータが必要な場合に使うもの。

2012
01.26

[jQuery Mobile]ダイアログ

jQuery Mobileにおけるダイアログの扱いはウインドウではなくページ。 なので通常のページと同様に扱える。ダイアログウインドウを出す。じゃなくダイアログページに遷移する。的な。

2012
01.25

[Ubuntu11.10]Ubuntuのインストール後の設定

インストール完了後の環境構築。PC起動時いちいちBIOSからブートドライブ選んで ブートするのかと思ってたら起動時にOS選択画面が出てくる。

すばらしいですね。

2012
01.24
2012
01.23

MinGW+Mintty+Git

MinGW+Mintty+Gitをやろうとして失敗に終わった。このエントリーには収穫できるものはありません。

2012
01.21

[PHP]共有サーバーユーザーのためのPEARインストール方法

共有サーバーでは自由にPEARのパッケージがインストールできないので、 プロジェクトローカルに設置することになりますが、以前httpベースのものを使ってみたんですけど、 やたら重くて使い物にならなかったので、僕は普通にFTPでアップするようにしてます。

ってことでプロジェクトローカルへのPEARのインストール方法。