NTTドコモ様_dカーシェア
NTTドコモ様_dカーシェア
2015.06.09

WordPressでフィード配信するときにショートコードを無効にする方法

エリカ

こんにちは。エリカです。
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 のフィルタフックを利用して何かを行おうとしたときに、ものによっては間に合わないことがあり、そのひとつが、ショートコードへの働きかけ、というわけですね。

  • 1
  • 2