こんにちは。エリカです。
WordPressでフィードを配信していると、ショートコードを無効にしたいときってありませんか?
まずショートコードを取り除く方法としては、下記の方法があります。
- Function: strip_shortcodes
文字列からショートコードタグを取り除く - Function: remove_shortcode
指定してショートコードを無効にする - Function: remove_all_shortcodes
全てのショートコードを無効にする
では、通常はショートコードを有効にしておいて、フィードのときだけショートコードを無効にしたい場合は、どこで上記の方法を利用すればよいのでしょうか。
今回は、ショートコードおよびフィードの処理について調べました。
ショートコードが展開されるタイミングはいつか?
require( ABSPATH . WPINC . '/shortcodes.php' );
add_filter('the_content', 'do_shortcode', 11); // AFTER wpautop()
このような記述がありますので、ショートコードを展開する do_shortcode は、かならず the_content フィルタにフックされています。
したがって、通常であれば the_content フィルタが実行された際にショートコードが展開されることになります。
フィード用のフックの実行タイミングはいつか?
フィードにアクセスがあった場合、デフォルトで利用されるテンプレートファイル wp-includes/feed-rss2.php では、いわゆる本文が get_the_content_rss という関数で生成されています。
そして、get_the_content_feed には、the_content_feed というフィルターフックが用意されています。ですから、このフック内で、ショートコードを取り除けばいいかと思いましたが、そうでもないようです。
the_content_feed 内の処理を見てみましょう。
/** This filter is documented in wp-includes/post-template.php */
$content = apply_filters( 'the_content', get_the_content() );
$content = str_replace(']]>', ']]>', $content);
/**
* Filter the post content for use in feeds.
*
* @since 2.9.0
*
* @param string $content The current post content.
* @param string $feed_type Type of feed. Possible values include 'rss2', 'atom'.
* Default 'rss2'.
*/
return apply_filters( 'the_content_feed', $content, $feed_type );
実際には、この順序で処理されています。
最後に the_content_feed のフックが実行されていますね。そして、その直前で the_content のフックが実行されています。
つまり、the_content_feed フックが動くときには、the_content のフックで既にショートコードは展開されてしまっているのです。
したがって、フィードの開発時に、the_content_feed のフィルタフックを利用して何かを行おうとしたときに、ものによっては間に合わないことがあり、そのひとつが、ショートコードへの働きかけ、というわけですね。
LIGはWebサイト制作を支援しています。ご興味のある方は事業ぺージをぜひご覧ください。