WordPress: headタグのrssフィードへのリンク出力を制御する

rssフィードはブログの更新情報などを購読者に伝えること目的としたもので、WordPressもこの機能を持っています。
しかし規定値では出力されないようです。
そこで今回は、WordPressのrssフィードを生成する方法をお伝えします。

フィードの種類

WordPressは3種類のフィードリンクをheadタグに埋め込むことができます。

  1. サイトの全記事を対象としたフィード
    <link rel="alternate" type="application/rss+xml" title="testwordpress &raquo; フィード" href="http://xxxx.com/feed/" />
  2. サイトの全コメントを対象としたフィード
    <link rel="alternate" type="application/rss+xml" title="testwordpress &raquo; コメントフィード" href="http://xxxx.com/comments/feed/" />
  3. 記事やカテゴリなどを対象としたフィード
    <link rel="alternate" type="application/rss+xml" title="testwordpress &raquo; Hello world! のコメントのフィード" href="http://xxxx.com/2019/07/19/hello-world/feed/" />

3つ目は、TOPページなどでは出力されません。

WordPressはそれぞれのフィードを出力するかどうかを制御できるようになっています。

フィードを出力するアクションフック

フィードは、wp_head()関数を呼び出すことで出力されます。

実際にはwp_head()関数は複数のアクションフックを呼び出していて、フィードは次の二つのアクションフックで生成しています。

  • feed_links()関数
  • feed_links_extra()関数
アクションフックを確認する方法

確認は、次の記事で紹介している方法で行います。

WordPress:アクションまたはフィルターに登録されている関数をリストアップする

次のように、上の記事で紹介しているlist_filter()関数を呼び出します。

  • list_filter('wp_head');
AFFS Simple Code Viewer
Copy

すると、次の情報が出力しました。

  • *************wp_head
  • ・・・省略
  • 2 , wp_resource_hints [/wp-includes/general-template.php(3302)]
  • 2 , feed_links [/wp-includes/general-template.php(3084)]
  • 3 , feed_links_extra [/wp-includes/general-template.php(3130)]
  • 7 , print_emoji_detection_script [/wp-includes/formatting.php(5716)]
  • ・・・省略
AFFS Simple Code Viewer
Copy

実際はもっと長いですが、今回の目的と関係ないので省略してあります。

名前からfeedに関連していそうなものを推測すると、feed_links()関数とfeed_links_extra()関数です。
実際にコードを確認してみると、その通りでした。

feed_links()関数は、次のように定義されています。

  • function feed_links( $args = array() ) {
  • if ( ! current_theme_supports( 'automatic-feed-links' ) ) {
  • return;
  • }
  • $defaults = array(
  • /* translators: Separator between blog name and feed type in feed links. */
  • 'separator' => _x( '&raquo;', 'feed link' ),
  • /* translators: 1: Blog title, 2: Separator (raquo). */
  • 'feedtitle' => __( '%1$s %2$s Feed' ),
  • /* translators: 1: Blog title, 2: Separator (raquo). */
  • 'comstitle' => __( '%1$s %2$s Comments Feed' ),
  • );
  • $args = wp_parse_args( $args, $defaults );
  • if ( apply_filters( 'feed_links_show_posts_feed', true ) ) {
  • echo '<link rel="alternate" type="' . feed_content_type() . '" title="' . esc_attr( sprintf( $args['feedtitle'], get_bloginfo( 'name' ), $args['separator'] ) ) . '" href="' . esc_url( get_feed_link() ) . "\" />\n";
  • }
  • if ( apply_filters( 'feed_links_show_comments_feed', true ) ) {
  • echo '<link rel="alternate" type="' . feed_content_type() . '" title="' . esc_attr( sprintf( $args['comstitle'], get_bloginfo( 'name' ), $args['separator'] ) ) . '" href="' . esc_url( get_feed_link( 'comments_' . get_default_feed() ) ) . "\" />\n";
  • }
  • }
AFFS Simple Code Viewer
Copy

この関数は、コメントに「Display the links to the general feeds.」と記述されています。
翻訳すると「一般的なフィードへのリンクを表示します。 」となります。
ここでの「一般的な」は、サイト全体のフィードとコメントを指すようです。
最初に挙げた3つのフィードのうち、1と2です。

コードは、まずはcurrent_theme_supports()で'automatic-feed-links'が有効かどうか確認しています。
これにより、add_theme_support()で、'automatic-feed-links'を有効化する必要があることがわかります。

さらにfeed_links_show_posts_feedフィルターで、サイト全体のフィードを出力するかどうかを制御しています。
次に、feed_links_show_comments_feedフィルターで、サイト全体のコメントフィードを出力するかどうかを制御しています。

feed_links_extra()関数は、ページの種類ごとに個別にフィードを生成しています。
この関数はテーマサポートやフィルターを参照していないので、カスタマイズする余地はありません。

フィードを制御する

フィードについての情報が集まったので、実際にフィードを制御してみます。

今後の解説では、3種類のフィードを次のように省略して呼びます。

  1. 全記事フィード:サイトの全記事を対象としたフィード
  2. コメントフィード:サイトの全コメントを対象としたフィード
  3. 記事別フィード:記事やカテゴリなどを対象としたフィード

なお、テーマやプラグインでフィードの制御をしていない状態でのコードを考えています。

全記事とコメントのフィードを表示する

全記事とコメントのフィードは、デフォルトでは出力されません。
add_theme_supportで、'automatic-feed-links'を有効にすると出力されます。

  • add_theme_support( 'automatic-feed-links' );
AFFS Simple Code Viewer
Copy

全記事フィードを出力してコメントフィードは出力しない

全記事を出力してコメントを出力しない場合は、'automatic-feed-links'を有効後に、feed_links_show_comments_feedフィルターでfalseを返します。

  • add_theme_support( 'automatic-feed-links' );
  • add_filter( 'feed_links_show_comments_feed' , '__return_false' );
AFFS Simple Code Viewer
Copy

__return_false()関数は、WordPressに組み込まれている関数です。
次の記事で紹介しています。

WordPress: 0やnull、真偽値など特定の値を返す組み込み関数

コメントフィードを出力して全記事フィードは出力しない

コメントを出力して全記事を出力しない場合は、'automatic-feed-links'を有効後に、feed_links_show_posts_feedフィルターでfalseを返します。

  • add_theme_support( 'automatic-feed-links' );
  • add_filter( 'feed_links_show_posts_feed' , '__return_false' );
AFFS Simple Code Viewer
Copy

全記事とコメントフィードを出力しない

全記事とコメントはデフォルトでは出力されませんが、テーマやプラグインで有効になっているケースがあります。
このケースで全記事とコメントを出力したくないときは、wp_headアクションからfeed_links()関数を除去します。

  • remove_action('wp_head','feed_links' , 2);
AFFS Simple Code Viewer
Copy

記事別フィードを出力しない

記事別フィードを出力したくないときは、wp_headアクションからfeed_links_extra()関数を除去します。

  • remove_action('wp_head','feed_links_extra' , 3);
AFFS Simple Code Viewer
Copy