ショートコードは、お手軽にコンテンツの見せ方などを変更したり、ワードプレス関数の返り値などを、コンテンツに表示できるので、とても便利です。
そんなショートコードプラグインを、便利だー便利だーと言って、長い間使いづづけて、使い続けている分にはいいのですが、プラグインの更新が停滞したりして、使い続けられなくなったり、
あるいは、テーマのテキストウィジェットで、
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 を使う事を思いついたわけでした。