この記事は最後に更新してから1年以上経過しています。

4.2.3でちょっと変わったショートコード

説明

4.3のリリースまであと少しなわけですが、4.2.3が緊急リリースされました。4.2.2とソースコードを比較すると、ざっくりTinyMCE絡みが多い印象を受けたのですが、ショートコード関連も少し変わっていたので簡単にまとめてみました。

確認用のショートコードを準備

まずは違いを確認するために、次のショートコードを準備しました。

add_shortcode( 'abc', 'shortcode_abc' );
function shortcode_abc( $atts, $content='' ) {
	static $abc_times = 0;
	$abc_times++;
	return esc_attr( 'abc@'.$abc_times );
}

確認用の投稿内容は次の通りです。

<!-- [abc /] -->
<div class="[abc /]">ここはどうかな[abc /]</div>
[abc /]
括弧をHTMLエンティティの[と]で表現。

4.2.2と4.2.3でどのように変わったかを次の表で示します。

バージョンdo_shortcodestrip_shortcodes
4.2.2
<p><!-- abc@1 --></p>
<div class="abc@2">ここはどうかなabc@3</div>
abc@4
括弧をHTMLエンティティの[と]で表現。
<!--  -->
<div class="">ここはどうかな</div>

括弧をHTMLエンティティの[と]で表現。
4.2.3
<p><!-- [abc /] --></p>
<div class="abc@1">ここはどうかなabc@2</div>
<p>abc@3<br />
括弧をHTMLエンティティの[と]で表現。</p>
<!-- [abc /] -->
<div class="[abc /]">ここはどうかな</div>

括弧をHTMLエンティティの[と]で表現。

ショートコードを実行するdo_shortcode関数の違い

4.2.2以前のショートコード処理は投稿内容内のショートコードをすべて処理しているのに対し、4.2.3のショートコード処理ではHTMLコメント内のショートコードは処理されていないことがわかります。またショートコードを使用できる要素内の属性値も制限があるようです。標準の4.2.3おいてショートコードが使用できる要素は次の81種類。input要素やselect要素は含まれていないようです。

address a abbr acronym area article aside audio b big blockquote br button caption cite code col colgroup del dd dfn details div dl dt em fieldset figure figcaption font footer form h1 h2 h3 h4 h5 h6 header hgroup hr i img ins kbd label legend li map mark menu nav p pre q s samp span section small strike strong sub summary sup table tbody td textarea tfoot th thead title tr track tt u ul ol var video

4.2.3にアップデートして要素の属性値でショートコードが使用できなくなった場合は、wp_kses_allowed_htmlフィルターを利用し、テーマ内のfunctions.phpに以下に示すコードを追加することで問題を回避できます(この例はinput要素のvalue属性値を有効にしています)。

add_filter( 'wp_kses_allowed_html', 'my_wp_kses_allowed_html', 10, 2 );
function my_wp_kses_allowed_html( $tags, $context ) {
	$tags['input']['value'] = true;
	return $tags;
}

現在のサイトにおいてコメント内、要素内の属性値でショートコードを利用している場合は4.2.3へのアップデートで挙動が変わるので注意が必要です。

あと地味なところでは、4.2.3では行頭のショートコードと次行がp要素内になっているのも気になります。

[追記] 4.2.4が緊急リリースされ、その中でショートコード関連もいくつか変更になっています。
(1) <![CDATA[ ... ]]>内もコメントと同じようにショートコードが無効化されました。
(2) 4.2.3で<[shortcode]>(shortcodeは任意のショートコード名)が無効化されましたが、4.2.4で有効になりました。

ショートコードを取り除くstrip_shortcodes関数の違い

4.2.2以前の場合は所構わずショートコード部分を取り除いていましたが、4.2.3ではHTMLコメント内およびdiv要素のclass属性値は取り除かれていません。div要素のclass属性値の扱いがショートコード実行時と除外時では異なることは注意が必要でしょう。

また[と]が、それぞれ[と]と'0'が追加されています。ショートコードの除外時に行われているので、「あれっ」と思われる方がいるかもしれませんね。

足早に整理するとこんな感じ。サイトでショートコードを利用している方は、アップデート後に確認しておいたほうがいいでしょう。


最終更新 : 2018年05月27日 10:45


お勧め

is_favicon(2020年4月2日 更新)

bool is_favicon()
リクエストがfavicon.icoか調べる。

wp_kses_post_deep(2018年5月27日 更新)

mixed wp_kses_post_deep( mixed $data )
複数の投稿内容をサニタイズする。

wp_generator(2018年5月27日 更新)

void wp_generator( )
XHTMLのgeneratorタグを表示する。

get_post_class(2022年11月6日 更新)

array get_post_class( [ mixed $class = '' [ , int $post_id = null ] ] )
投稿記事のクラス名を取得する。

get_template_directory(2018年5月27日 更新)

string get_template_directory( )
現在使用しているテーマのパス名を取得する。