[WordPress] ショートコードに引数(属性)を渡す方法

WordPress

以前、ブログ名とURLをショートコードで表示するという記事を書きました。
ショートコードは引数も渡せるようなので、挑戦してみました。

公式ドキュメントによると、引数ではなく属性になっています。
なので、ここからはショートコードに渡す引数を属性と書いていきます。

概要

やること

ショートコードに属性を渡し、渡した値を記事内に表示する。
具体的には、ショートコードに名前と年齢を渡して、それを文章にして表示するというものです。

完成のイメージ

ショートコード

[sample02_name_and_age name=名前 age=10]

結果

私の名前はNプログラマです。年齢は60歳です

やってみる

ショートコードへ属性を渡す

渡し方

ショートコードへ属性を渡すには、ショートコード名のあとにスペース区切りで値を記載します。

[sample02_name_and_age name=名前 age=10]

ここではsample02_name_and_ageが登録したショートコード名、name=名前、age=10が属性値になります。

引数を渡すための書式

ドキュメントを見ると引数の渡し方は以下の5つの方法があります。
引数と言ってきましたが、ドキュメントでは属性となっています。

属性名 = ‘値’

属性名 = “値”

属性名 = 値

“値”

http://wpdocs.osdn.jp/ショートコード_API 属性より引用

この記事では、三番目の「属性名=値」の方法で渡すことにします。

これらについては、書きやすい方法で記述すればいいかと思います。
ただし、記述は統一しておくことをおすすめします。

自分がこのようにしている理由は以下の通りです。

  1. 属性名があると属性値の意味がわかりやすい(特に数値)
  2. シングルクォートやダブルクォーテーションの入力が不要
1. について

ショートコードを作ったばかりの時は、ショートコード名で引数の意味なんて分かるさ!、と思ってしまいますが、時間がたつとすぐに思い出せないものです。

自分のコードでも時間が経てば他人のコードになってしまいます。
なので、可能な限り属性名と属性値はセットで書いています。

2. について

これは単純に入力の手間を省きたいので、このように記述しています。

ショートコードからの引数の受け取り方

ショートコード登録メソッドに引数を追加する

add_shortcodeの第二引数の関数の引数に変数を宣言すると、ショートコードで渡した属性が配列で入ってきます。

今回はfunction.phpにショートコードを登録します。(バックアップを忘れずに!)sample02_name_and_ageのショートコードを登録しています。

add_shortcode('sample02_name_and_age', function($attr) {
$attrs = shortcode_atts([
'name' => 'NAME',
'age' => 'AGE',
], $attr);
$name = $attrs['name'];
$age = $attrs['age'];
return "私の名前は{$name}です。年齢は{$age}歳です";
});

デフォルト値の設定

ショートコード引数を省略すると、その引数は未定義になるのでデフォルトの値を設定しておいたほうがいいです。
WordPressのshortcode_atts関数があるので、これを使います。

$attrs = shortcode_atts([
'name' => 'NAME',
'age' => 'AGE',
], $attr);
$name = $attrs['name'];
$age = $attrs['age'];

こうすることにより省略された属性がある場合、その属性は指定した値(NAMEやAGE)で初期化されます。

例えばageを省略した場合は、$attrs[‘age’]の中身はAGEになります。

変数に入れて使っているのは、IDEでの変数の補完表示をしたいからです。
まぁ、この辺はお好みで。

ショートコードで表示してみる

準備が整ったので、ショートコードを使って表示してみます。

記述するショートコード

[sample02_name_and_age name=名前 age=60]

結果

見た目では分からないですが、これはショートコードを使って表示しています。

私の名前は名前です。年齢は60歳です

おわりに

今回はショートコードに属性を渡し、渡した値を記事内に表示するという内容でした。
属性を渡せるようになると、ショートコードの使い方の幅が広がると思います。

例えば、ショートコード内でDBからの値取得で、カラムや条件などの指定する、とかですね。
時間があれば、その辺も挑戦してみようと思います。

それでは、このへんで。

バイナリー!

タイトルとURLをコピーしました