ショートコードの憂鬱

ショートコードは、お手軽にコンテンツの見せ方などを変更したり、ワードプレス関数の返り値などを、コンテンツに表示できるので、とても便利です。

そんなショートコードプラグインを、便利だー便利だーと言って、長い間使いづづけて、使い続けている分にはいいのですが、プラグインの更新が停滞したりして、使い続けられなくなったり、

あるいは、テーマのテキストウィジェットで、

add_filter( 'widget_text', 'do_shortcode' );

等のショートコード用のフィルタがかませてある テーマファイルから、別のテーマに切り替えるた場合、( 特に最近新しく、WordPressにホスティングされたテーマでは、このフィルタが禁止されているため )

ショードコードがそのまま表示されてしまうという、利用者にとっては「キャー」と叫びたくなるような問題が発生します。

[su_accordion]
 [su_spoiler title="Spoiler title"] Spoiler content [/su_spoiler]
 [su_spoiler title="Spoiler title"] Spoiler content [/su_spoiler]
 [su_spoiler title="Spoiler title"] Spoiler content [/su_spoiler]
[/su_accordion]

ウィジェットでこのような問題が発生した場合は、

		add_filter( 'widget_text', 'do_shortcode' );

functions.phpに上記のコードを追加する事で、無事事なきを得られるでしょう。

では、何度も何度も投稿本文などで使い続けてきたショートコードが使えなくなったら、ショートコードで記述したものが、そのまま表示されることになります。

非アクティブなショートコードを、無効にするようなプラグインもいくつかあるようですが、その中のあるプラグインを見てみると、

global $shortcode_tags;

を見て、その中に含まれないものは、タグを削除するという処理を行っていました。

しばらくコードを見ていて、そういう処理をしたとしても bbcode プラグイン等を使っていれば、それも強制的に削除されるだろうなー、

で、もっと簡単で楽な方法ないのかなと考えてみたので、メモに残しておきます。

ウィジェットショートコードの場合、(本文でも一緒と思いますが)

<?php
add_filter( 'the_content', 'my_fallback_shortcodes', PHP_INT_MAX );

function my_fallback_shortcodes( $content ) {
	//除外
	$excludes= 'raindrops |hoge'; // | で区切ってください

	$content= preg_replace( '!\[/?[^(\] |' . $excludes . ')]+\]!', '', $content );

	return $content;
}
?>

widget_textも、the_content フィルタも、ワードプレスが置換処理をぜーんぶ終了してから、最後に変換処理されていないものを削除すればいい。

そうすれば、ショードコードだろうが、bbcodeだろうが、変換可能なものの処理は、すでに終わっているのだから、大手を振って削除できるだろう。

プライオリティに、PHP_INT_MAX を使う事を思いついたわけでした。

[emulsion_relate_posts]