ショートコードAPI
ショートコードAPIは、投稿やページで使用するためのWordPressショートコードを作成するための簡単な関数のセットです。たとえば、次のショートコード(投稿またはページの本文内)は、その投稿またはページに添付された画像のフォトギャラリーを追加します: [ gallery ]
このAPIは、プラグイン開発者が特定のページにユーザーが対応するショートコードをページテキストに追加することで添付できる特別な種類のコンテンツ(例:フォーム、コンテンツジェネレーター)を作成することを可能にします。
ショートコードAPIは、次のような属性をサポートするショートコードを簡単に作成できます:
[ gallery id="123" size="medium" ]
APIはすべての難しい解析を処理し、各ショートコードのためにカスタム正規表現を書く必要を排除します。デフォルト属性を設定および取得するためのヘルパー関数が含まれています。APIは自己閉じ型および囲み型のショートコードの両方をサポートしています。
急いでいる人のためのクイックスタートとして、ショートコードを作成するために必要なPHPコードの最小限の例を以下に示します:
// [foobar]
function wporg_foobar_func( $atts ) {
return "foo and bar";
}
add_shortcode( 'foobar', 'wporg_foobar_func' );
これにより、[foobar]
ショートコードが作成され、fooとbarとして返されます。
属性付き:
// [bartag foo="foo-value"]
function bartag_func( $atts ) {
$a = shortcode_atts( array(
'foo' => 'something',
'bar' => 'something else',
), $atts );
return "foo = {$a['foo']}";
}
add_shortcode( 'bartag', 'bartag_func' );
これにより、2つの属性「foo」と「bar」をサポートする[bartag]
ショートコードが作成されます。両方の属性はオプションであり、提供されない場合はデフォルトオプション[foo="something" bar="something else"]
を取ります。ショートコードはfoo = {the value of the foo attribute}
として返されます。
履歴
ショートコードAPIはWordPress 2.5で導入されました。
概要
ショートコードはハンドラ関数を提供することで記述されます。ショートコードハンドラは、WordPressフィルタに広く似ています:パラメータ(属性)を受け取り、結果(ショートコード出力)を返します。
ショートコード名はすべて小文字で、すべての文字を使用する必要がありますが、数字とアンダースコアも問題ありません。ハイフン(ダッシュ)を使用することには注意が必要です。使用しない方が良いでしょう。
ショートコードコールバック関数には3つのパラメータが渡されます。これらのうちのいくつかを使用することを選択できますが、使用しないことも可能です。
- `````$atts`````: 属性の連想配列、または属性が指定されていない場合は空の文字列
- `````$content`````: 含まれるコンテンツ(ショートコードが囲み形式で使用されている場合)
- `````$tag`````: ショートコードタグ、共有コールバック関数に便利です
ショートコードハンドラを登録するためのAPI呼び出しは次のようになります:
``````bash
add_shortcode( 'wporgshortcode', 'wporg_shortcode_handler' );
`
the_contentが表示されると、ショートコードAPIは[myshortcode]
のような登録されたショートコードを解析し、属性とコンテンツを分離して解析し、対応するショートコードハンドラ関数に渡します。ショートコードハンドラによって返された(エコーされていない)任意の文字列は、ショートコード自体の代わりに投稿本文に挿入されます。
ショートコード属性は次のように入力されます:
[wporgshortcode foo="bar" bar="bing"]
これらの属性は、次のような連想配列に変換され、ハンドラ関数の$atts
パラメータとして渡されます:
array( 'foo' => 'bar', 'bar' => 'bing' )
配列のキーは属性名であり、配列の値は対応する属性値です。さらに、ゼロ番目のエントリ($atts[0]
)は、ショートコード正規表現に一致した文字列を保持しますが、コールバック名と異なる場合のみです。
属性の処理
生の$atts
配列には、ユーザーによって指定された任意の属性が含まれる場合があります。(さらに、配列のゼロ番目のエントリには、正規表現によって認識された文字列が含まれる場合があります。詳細は以下の注釈を参照してください。)
欠落している属性のデフォルト値を設定し、ショートコードによって認識されない属性を排除するために、APIはshortcode_atts()関数を提供します。
``````bash
shortcode_atts( $defaults_array, $atts );
`
両方のパラメータは必須です。$defaults_array
は認識された属性名とそのデフォルト値を指定する連想配列です。$atts
は、ショートコードハンドラに渡された生の属性配列です。shortcode_atts()
は、$defaults_array
からのすべてのキーを含む正規化された配列を返し、$atts
配列から値が存在する場合はそれで埋められます。たとえば:
$a = shortcode_atts( array(
'title' => 'My Title',
'foo' => 123,
), $atts );
$atts
がarray( 'foo' => 456, 'bar' => 'something' )
を含む場合、結果の$a
はarray( 'title' => 'My Title', 'foo' => 456 )
になります。$atts['foo']
の値はデフォルトの123を上書きします。$atts['title']
は設定されていないため、デフォルトの「My Title」が使用されます。デフォルト配列には「bar」項目がないため、結果には含まれません。
属性名は、ハンドラ関数に渡される前に常に小文字に変換されます。値はそのままです。[myshortcode FOO="BAR"]
は$atts = array( 'foo' => 'BAR' )
を生成します。
ショートコードハンドラでデフォルトを宣言し、属性を解析するための推奨コードイディオムは次のとおりです:
function wporg_shortcode_handler( $atts, $content = null ) {
$a = shortcode_atts( array(
'attr_1' => 'attribute 1 default',
'attr_2' => 'attribute 2 default',
// ...etc
), $atts );
}
これにより、属性が解析され、デフォルト値が設定され、サポートされていない属性が排除され、$a
という名前のローカル配列変数に結果が格納されます。属性はキーとして使用されます – $a['attr_1']
、$a['attr_2']
など。言い換えれば、デフォルトの配列はローカル変数宣言のリストに近似します。
重要 – $atts
属性名にキャメルケースや大文字を使用しないでください:
$atts
値はshortcode_atts( array( 'attr_1' => 'attr_1 default', // ...etc ), $atts )
処理中に小文字に変換されるため、小文字のみを使用することをお勧めします。
正規表現/コールバック名の参照に関する注記:
属性配列のゼロ番目のエントリ($atts[0]
)には、ショートコード正規表現に一致した文字列が含まれますが、これはコールバック名と異なる場合のみです。そうでない場合、コールバック関数の第3引数として表示されます。
add_shortcode('foo','foo'); // two shortcodes referencing the same callback
add_shortcode('bar','foo');
produces this behavior:
[foo a='b'] ==> callback to: foo(array('a'=>'b'),NULL,"foo");
[bar a='c'] ==> callback to: foo(array(0 => 'bar', 'a'=>'c'),NULL,"");
これは混乱を招く可能性があり、根本的なバグを反映しているかもしれませんが、オーバーロードされたコールバックルーチンは、コールバックの第3引数とゼロ番目の属性の両方をチェックすることで、どのショートコードが呼び出されたかを正しく判断できます。(同じコールバックルーチンを参照する2つのショートコードがあることはエラーではなく、共通のコードを許可します。)
出力
ショートコードハンドラ関数の戻り値は、ショートコードマクロの代わりに投稿コンテンツ出力に挿入されます。返すことを忘れないでください、エコーではなく – エコーされたものはブラウザに出力されますが、ページの正しい場所には表示されません。
ショートコードは、wpautopおよびwptexturize投稿フォーマットが適用された後に解析されます。これは、ショートコード出力HTMLが自動的にカールクォートが適用されず、pおよびbrタグが追加されないことを意味します。ショートコード出力をフォーマットしたい場合は、ショートコードハンドラから出力を返すときにwpautop()
またはwptexturize()
を直接呼び出す必要があります。
wpautopはショートコード構文を認識し、行の独立したショートコードの周りにpまたはbrタグをラップしないように試みます。このように使用することを意図したショートコードは、出力が<p>
または<div>
のような適切なブロックタグでラップされることを確認する必要があります。
ショートコードが大量のHTMLを生成する場合、ob_start
を使用して出力をキャプチャし、次のように文字列に変換できます:
function wporg_shortcode() {
ob_start();
?> <HTML> <here> ... <?php
return ob_get_clean();
}
自己閉じ型と囲み型ショートコード
上記の例は、[myshortcode]
のような自己閉じ型ショートコードマクロを示しています。APIは[myshortcode]content[/myshortcode]
のような囲み型ショートコードもサポートしています。
ショートコードマクロがコンテンツを囲むために使用される場合、そのハンドラ関数はそのコンテンツを含む2番目のパラメータを受け取ります。ユーザーはどちらの形式でもショートコードを書くことができるため、ハンドラ関数の2番目のパラメータにデフォルト値を提供することで、どちらのケースにも対応する必要があります:
function wporg_shortcode_handler( $atts, $content = null )
empty( $content )
は自己閉じ型と囲み型のケースを区別するために使用できます。
コンテンツが囲まれると、コンテンツを含む完全なショートコードマクロは関数の出力で置き換えられます。生のコンテンツ文字列の必要なエスケープまたはエンコーディングを提供し、それを出力に含めるのはハンドラ関数の責任です。
以下は囲み型ショートコードの簡単な例です:
function wporg_caption_shortcode( $atts, $content = null ) {
return '<span class="caption">' . $content . '</span>';
}
add_shortcode( 'caption', 'wporg_caption_shortcode' );
このように使用すると:
My Caption
出力は次のようになります:
<span class="caption">My Caption</span>
``````bash
<a href="http://example.com/">My Caption</a>
`
これにより、次のようになります:
<span class="caption"><a href="http://example.com/">My Caption</a></span>
これは意図された動作であるかもしれませんし、そうでないかもしれません – ショートコードが出力に生のHTMLを許可しない場合は、結果を返す前にそれを処理するためにエスケープまたはフィルタリング関数を使用する必要があります。
ショートコードパーサーは投稿コンテンツに対して単一のパスを使用します。これは、ショートコードハンドラの$content
パラメータに別のショートコードが含まれている場合、それは解析されないことを意味します:
Caption: [myshortcode]
これにより、次のようになります:
<span class="caption">Caption: [myshortcode]</span>
囲み型ショートコードが出力内で他のショートコードを許可することを意図している場合、ハンドラ関数はdo_shortcode()を再帰的に呼び出すことができます:
function wporg_caption_shortcode( $atts, $content = null ) {
return '<span class="caption">' . do_shortcode($content) . '</span>';
}
前の例では、囲まれたコンテンツ内の[myshortcode]
マクロが解析され、その出力がキャプションスパンで囲まれることが保証されます:
<span class="caption">Caption: The result of myshortcode's handler function</span>
パーサーは、同じショートコードの囲み型と非囲み型の形式を混在させることを処理しません。たとえば、次のようにすると:
[myshortcode example='non-enclosing' /] non-enclosed content [myshortcode] enclosed content [/myshortcode]
「非囲まれたコンテンツ」というテキストで区切られた2つのショートコードとして扱われるのではなく、パーサーはこれを「非囲まれたコンテンツ[myshortcode]
囲まれたコンテンツ」を囲む単一のショートコードとして扱います。
囲み型ショートコードは、自己閉じ型ショートコードと同様に属性をサポートします。以下は、‘class’属性をサポートするように改善されたcaption_shortcode()
の例です:
function wporg_caption_shortcode( $atts, $content = null ) {
$a = shortcode_atts( array(
'class' => 'caption',
), $atts );
return '<span class="' . esc_attr($a['class']) . '">' . $content . '</span>';
}
My Caption
<span class="headline">My Caption</span>
その他の機能の概要
- パーサーは
[myshortcode /]
のようなxhtmlスタイルの閉じショートコードをサポートしますが、これはオプションです。 - ショートコードマクロは、属性値のために単一または二重引用符を使用するか、属性値にスペースが含まれていない場合は完全に省略できます。
[myshortcode foo='123' bar=456]
は[myshortcode foo="123" bar="456"]
と同等です。最後の位置の属性値は、上記の段落の機能によってスラッシュが消費されるため、スラッシュで終わることはできません。 - 古いアドホックショートコードとの後方互換性のために、属性名は省略可能です。属性に名前がない場合、
$atts
配列内で位置的な数値キーが与えられます。たとえば、[myshortcode 123]
は$atts = array( 0 => 123 )
を生成します。位置的属性は名前付き属性と混在させることができ、値にスペースや他の重要な文字が含まれている場合は引用符を使用できます。 - ショートコードAPIにはテストケースがあります。テストには、エラーケースや異常な構文の例がいくつか含まれています。これらはhttp://svn.automattic.com/wordpress-tests/trunk/tests/shortcode.phpで見つけることができます。
関数リファレンス
次のショートコードAPI関数が利用可能です:
function add_shortcode( $tag, $func )
新しいショートコードハンドラ関数を登録します。$tag
はユーザーによって書かれたショートコード文字列(ブレースなし)で、「myshortcode」のようなものです。$funcはハンドラ関数名です。
特定のショートコードに対しては、1つのハンドラ関数のみが存在できます。同じ$tag名でadd_shortcode()
を再度呼び出すと、以前のハンドラが上書きされます。
function remove_shortcode( $tag )
既存のショートコードを登録解除します。$tag
はadd_shortcode()
で使用されるショートコード名です。
function remove_all_shortcodes()
すべてのショートコードを登録解除します。
function shortcode_atts( $pairs, $atts )
生の属性配列$atts
を$pairs
で指定されたデフォルトのセットに対して処理します。配列を返します。結果には$pairs
のすべてのキーが含まれ、$atts
からの値とマージされます。$atts
に存在しないキーは無視されます。
function do_shortcode( $content )
[do_shortcode()](https://developer.wordpress.org/reference/functions/do_shortcode/)は、優先度11で「the_content」のデフォルトフィルタとして登録されています。
<a name="limitations"></a>
### 制限
#### ネストされたショートコード
ショートコードパーサーは、ハンドラ関数が[do_shortcode()](https://developer.wordpress.org/reference/functions/do_shortcode/)を再帰的に呼び出すことをサポートしている限り、ネストされたショートコードマクロを正しく処理します:
``````bash
[tag-a]
[tag-b]
[tag-c]
[/tag-b]
[/tag-a]
`
ただし、ショートコードマクロが同じ名前の別のマクロを囲むために使用されると、パーサーは失敗します:
[tag-a]
[tag-a]
[/tag-a]
[/tag-a]
これはdo_shortcode()
によって使用される文脈自由の正規表現パーサーの制限です – 非常に高速ですが、ネストのレベルをカウントしないため、これらのケースで各開くタグを正しい閉じタグに一致させることができません。
将来のWordPressバージョンでは、ネストされたショートコード構文を持つプラグインがwptexturize()
プロセッサーが内部コードに干渉しないことを確認する必要があるかもしれません。このような複雑な構文の場合、外部タグにno_texturize_shortcodesフィルタを使用することをお勧めします。ここで使用されている例では、tag-aはテキスト化しないショートコードのリストに追加する必要があります。tag-aまたはtag-bの内容がまだテキスト化される必要がある場合は、wptexturize()
を呼び出してからdo_shortcode()
を呼び出すことができます。
未登録の名前
一部のプラグイン作成者は、親ショートコードのハンドラ関数が呼び出されるまでネストされたショートコードを無効にするために、ショートコード名を登録しない戦略を選択しています。これには、ショートコード属性値の解析に失敗するなど、意図しない結果が生じる可能性があります。たとえば:
[tag-a unit="north"]
[tag-b size="24"]
[tag-c color="red"]
[/tag-b]
[/tag-a]
バージョン4.0.1以降、プラグインがtag-bおよびtag-cを有効なショートコードとして登録しない場合、wptexturize()
プロセッサーは、ショートコードが解析される前に次のテキストを出力します:
[tag-a unit="north"]
[tag-b size=”24”]
[tag-c color=”red”]
[/tag-b]
[/tag-a]
未登録のショートコードは、特別な意味を持たない通常のプレーンテキストと見なされるべきであり、未登録のショートコードを使用する慣行は推奨されません。生のコードをショートコードタグで囲む必要がある場合は、少なくともno_texturize_shortcodesフィルタを使用してtag-aの内容のテキスト化を防ぐことを検討してください:
add_shortcode( 'tag-a', 'wporg_tag_a_handler' );
add_filter( 'no_texturize_shortcodes', 'wporg_ignore_tag_a' );
function wporg_ignore_tag_a( $list ) {
$list[] = 'tag-a';
return $list;
}
未閉じショートコード
特定のケースでは、ショートコードパーサーは閉じたショートコードと未閉じショートコードの両方の使用を正しく処理できません。この場合、パーサーはショートコードの2番目のインスタンスのみを正しく識別します:
[tag]
[tag]
CONTENT
[/tag]
ただし、この場合、パーサーは両方を識別します:
[tag]
CONTENT
[/tag]
[tag]
ハイフン
ショートコードの名前にハイフンを使用する際には注意が必要です。次の例では、WordPressは2番目の開くショートコードを最初のものと同等と見なす場合があります(基本的にWordPressはハイフンの前の最初の部分を見ます):
[tag]
[tag-a]
すべては、どのショートコードが最初に定義されるかに依存します。ハイフンを使用する場合は、最も短いショートコードを最初に定義してください。
これを避けるために、アンダースコアを使用するか、単に区切りを使用しないでください:
[tag]
[tag_a]
[tag]
[taga]
ショートコードの最初の部分が異なる場合は、ハイフンを使用しても問題ありません:
[tag]
[tagfoo-a]
重要:ハイフンを使用すると、他のインストールされたショートコードもハイフンを使用している場合、衝突を引き起こす可能性があることに注意してください(ショートコードが同じリクエスト内で一緒に使用される場合):
// plugin-A
[is-logged-in]
// plugin-B
[is-admin]
角括弧
ショートコードパーサーは属性内の角括弧を受け入れません。したがって、次のようなものは失敗します:
[tag attribute="[Some value]"]
装飾的な括弧で囲まれたタグは、まだwptexturize()またはそのフィルタによって完全にはサポートされていません。これらのコードは予期しない結果をもたらす可能性があります:
[I put random text near my captions. ]
注:これらの制限は将来のWordPressバージョンで変更される可能性があるため、絶対に確かであることを確認するためにテストする必要があります。
HTML
バージョン3.9.3以降、ショートコード属性内でのHTMLの使用は制限されています。たとえば、このショートコードは>
文字を含むため、正しく機能しません:
[tag value1="35" value2="25" compare=">"]
バージョン4.0は検証されたHTMLを許可するように設計されているため、これは機能します:
[tag description="<b>Greetings</b>"]
HTMLの制限に対する推奨回避策は、すべてのユーザー入力にHTMLエンコーディングを使用し、その後カスタムショートコードハンドラでHTMLデコーディングを追加することです。追加のAPI関数が計画されています。
ショートコード属性内でのHTMLの完全な使用は、公式にはサポートされておらず、将来のバージョンで拡張されることはありません。
バージョン4.2.3以降、HTML内でのショートコードの使用にも同様の制限が設けられました。たとえば、このショートコードはスクリプト属性内にネストされているため、正しく機能しません:
<a onclick="[tag]">
動的属性に対する推奨回避策は、単一の値ではなく、必要なすべてのHTMLを出力するショートコードを設計することです。これにより、次のように機能します:
[link onclick="tag"]
また、次のショートコードは不正な属性引用のためにもはや許可されません:
<a title="[tag attr="id"]">
これを有効なHTMLとして解析する唯一の方法は、単一引用符と二重引用符をネストして使用することです:
<a title="[tag attr='id']">
登録数
APIは、数百のショートコードを登録すると不安定になることが知られています。プラグイン作成者は、少数のショートコード名に依存するソリューションを作成するべきです。この制限は将来のバージョンで変更される可能性があります。
正式な構文
WordPressショートコードは、HTMLと同じ方法で特殊文字を使用しません。角括弧は一見魔法のように見えるかもしれませんが、実際にはどの言語の一部でもありません。たとえば:
[gallery]
ギャラリーショートコードは、登録されたショートコードであるため、APIによって特別なシンボルとして解析されます。一方、ショートコードが登録されていない場合、角括弧は単に無視されます:
[randomthing]
randomthingシンボルとその角括弧は、登録されたショートコードの一部ではないため無視されます。
完璧な世界では、任意の[*]
シンボルはAPIによって処理される可能性がありますが、次の課題を考慮する必要があります:角括弧はHTMLで許可されており、常にショートコードではなく、角括弧は限られた状況でのみショートコード内で許可され、すべてのコードは出力の前に複数のカスタマイズ可能なフィルタとパーサーを通過する必要があります。これらの言語互換性の問題のため、角括弧は魔法のようにはなりません。
ショートコード構文は、次の一般的な部分を使用します:
[name attributes close]
[name attributes]Any HTML or shortcode may go here.[/name]
エスケープされたショートコードは同一ですが、正確に2つの追加のブレースがあります:
[[name attributes close]]
[[name attributes]Any HTML or shortcode may go here.[/name]]
再度、ショートコード名は登録されている必要があります。そうでない場合、すべての4つの例は無視されます。
名前
ショートコード名には、次の文字を含めることはできません:
- 角括弧:
[ ]
- 山括弧:
< >
- アンパサンド:
&
- スラッシュ:
/
- 空白: スペース、改行、タブ
- 非表示文字:
x00
–x20
ショートコードの名前には、引用符を避けることをお勧めします。
属性
属性はオプションです。ショートコード名とショートコード属性の間にはスペースが必要です。複数の属性が使用される場合、各属性は少なくとも1つのスペースで区切る必要があります。
各属性は次のいずれかの形式に準拠する必要があります:
attribute_name = 'value'
attribute_name = "value"
attribute_name = value
"value"
value
属性名はオプションであり、すべてのプラットフォームでの互換性のために次の文字のみを含むべきです:
- 大文字と小文字の文字:
A-Z
a-z
- 数字:
0-9
- アンダースコア:
_
- ハイフン:
-
属性名にはスペースを含めることはできません。名前と=
記号の間にオプションのスペースを使用できます。=
記号と値の間にもオプションのスペースを使用できます。
属性はエディタ内で混合ケースで使用できますが、解析後は常に小文字になります。
属性値には、次の文字を含めることはできません:
- 角括弧:
[ ]
- 引用符:
"
、'
引用されていない値にもスペースを含めることはできません。
HTML文字<
および>
は、属性内でのサポートが限られています。
ショートコード属性内の特殊文字をエスケープするための推奨方法はHTMLエンコーディングです。最も重要なのは、ショートコード属性に表示されるユーザー入力は、特殊文字をエスケープまたは削除する必要があります。
二重引用符は単一引用符の値内で許可され、逆もまた然りですが、ユーザー入力を扱う際には推奨されません。
属性値内でエスケープされていない場合、次の文字は自動的に削除され、スペースに変換されます:
- ノーブレークスペース:
xC2xA0
- ゼロ幅スペース:
xE2x80x8B
自己閉じ型
自己閉じマーカー、単一のスラッシュはオプションです。マーカーの前のスペースはオプションです。マーカーの後にスペースは許可されていません。
[example /]
自己閉じマーカーは純粋に装飾的であり、それ以外の効果はなく、ショートコードパーサーに続く任意の閉じタグを無視させることになります。
囲み型ショートコードは自己閉じマーカーを使用することはできません。
エスケープ
WordPressは[name]
と[/name]
タグの間にカールクォートを挿入しようとします。それは他のコンテンツと同様に処理されます。4.0.1以降、未登録のショートコードも「テキスト化」され、これにより予期しないカールクォートが発生する可能性があります:
[randomthing param="test"]
より良い例は次のとおりです:
<code>[randomthing param="test"]</code>
登録されたショートコードは、`````<code>`````要素内でも処理されます。ウェブサイトに表示するために登録されたショートコードをエスケープするには、構文は次のようになります:
``````bash
[[caption param="test"]]
`
これにより、次のように出力されます:
[caption param="test"]
この状況では<code>
要素はオプションです。
囲み型ショートコードの場合は、次の構文を使用します:
[[caption]My Caption]
外部リソース
- WordPressショートコードジェネレーター
- ショートコードの追加 – WordPressコードスニペットジェネレーター– コードをWordPressウェブサイトに追加する方法に関するスニペットジェネレーターと完全なドキュメント。
- アーロン・D・キャンベルによるショートコードの概要– ショートコードを説明し、ショートコードをエディタに送信するためのメタボックスに組み込む方法を含む例を示します。
- 革新的なWordPressショートコードの実践– 投稿コンテンツデザインを変更するためにショートコードを効果的に使用する方法を示すWordPressプラグイン。
- WordPressショートコードAPIの概要– 使用法の説明とショートコードを使用するプラグインの例。
- シンプルなショートコード駆動のBBCodeプラグイン– ショートコードを介してBBCodeをサポートするシンプルなプラグイン。ショートコードの実行を確認する良い方法です。