Wordpress の RSS フィードのカスタマイズ

WordPress の RSS フィードのカスタマイズ


もう何万回もブログで使われたネタなのでしょうけど、私の環境でも少々特殊なことをする必要があったため、Wordpress での RSS フィード出力のカスタマイズを備忘録を兼ねて掲載いたします。

このカスタマイズで実現している事:
この AVALON STUDIO ウェブサイトは CDN 側に DNS を設定しており、Wordpress の編集環境と公開環境で URL が異なっております。なので、何の工夫もせずにおくと、公開環境で編集環境の URL が出力されるという残念なことになってしまいます。そこで、編集環境ではなく公開環境の URL をベタ打ちで記述した RSS フィードを出力する、というのが今回のゴールとなります。

RSS 機能のチャイルドテーマ化

なんにせよシステムのコードに手を加えるわけですので、チャイルドテーマ(子テーマ)で編集する必要があります。

まず、wp-include フォルダにある feed-rss2.php を チャイルドテーマフォルダにコピーします。ここでは仮にチャイルドテーマのフォルダを themename-child と仮定します。
したがって、 themename-child\feed-rss2.php というファイルが作成されたことになります。

チャイルドテーマの function.php を編集

コピーした feed-rss2.php は一度横に置いておき、次にチャイルドテーマの function.php を編集します。すでに themename-child\function.php が存在しているようであればそれを開く、まだ存在していないようであれば themename-child\function.php となるようにファイルを新規作成します。

そしてその themename-child\function.php に以下の構文を追加します。

remove_filter('do_feed_rdf', 'do_feed_rdf', 10);
remove_filter('do_feed_rss', 'do_feed_rss', 10);
remove_filter('do_feed_rss2', 'do_feed_rss2', 10);
remove_filter('do_feed_atom', 'do_feed_atom', 10);

remove_action( 'wp_head', 'wp_generator' );
remove_action( 'wp_head', 'wlwmanifest_link' );
remove_action( 'wp_head', 'adjacent_posts_rel_link_wp_head' );
remove_action( 'wp_head', 'rsd_link' );
remove_action( 'wp_head', 'wp_shortlink_wp_head' );
remove_action( 'wp_head', 'feed_links', 2 );
remove_action( 'wp_head', 'feed_links_extra', 3 );

function custom_feed_rss2( $for_comments ) {
    $template_file = '/feed-rss2' . ( $for_comments ? '-comments' : '' ) . '.php';
    $template_file = ( file_exists( get_stylesheet_directory() . $template_file )
        ? get_stylesheet_directory()
        : ABSPATH . WPINC
        ) . $template_file;
    load_template( $template_file );
}
add_action('do_feed_rss2', 'custom_feed_rss2', 10, 1);

何をやっているかというと、既存の RSS 出力の関数を参照しないようにして、HTML 内に出力される RSS 参照のヘッダータグを出力させないようにしています(RSS 関連だけでなく、ついでに他のタグも削除してます)。

そしてチャイルドテーマにコピーした themename-child\feed-rss2.php を参照する構文を追加しています。

ただしこの時点ではチャイルドテーマ内の feed-rss2.php もオリジナルと同じ内容なので、出力される内容も同じものです。これはこの後変更します。

チャイルドテーマの feed-rss2.php の書き換え

さて、ここで RSS フィードに出力される内容を書き換えていきます。

まず 40 行目付近に以下のコードがあるかと思います。

<atom:link href="(編集環境のURL)/feed/" rel="self" type="application/rss+xml" />
<link>(編集環境のURL)</link>

ここを、公開環境の URL に変更します。

<atom:link href="https://avalon-studio.work/feed/" rel="self" type="application/rss+xml" />
<link>https://avalon-studio.work/</link>

そしてその下、90~95行目あたりに <item> で始まるエリアがあると思います。その <item> の2行下に以下のコードがあるかと思います。ここが個別の記事の URL を出力する箇所になります。

<link><?php the_permalink_rss(); ?></link>

私の環境では冒頭で申したように編集環境と公開環境の URL が異なっているため、Wordpress からの出力をルートからの相対リンクにするため Relative URL というプラグインを入れております。このため、ここに出力されるコードはプラグインにより http(s)://www.hogehoge.com というドメインの部分が除去され、

<link>/blog/wordpress/linkcard/</link>

というような形式で出力されます。ですので、ここに公開環境の URL を静的に付与してあげます。
すなわち、

<link>https://www.avalon-studio.work<?php the_permalink_rss(); ?></link>

と変更してあげます。

これで、Wordpress から出力される RSS2 形式のフィードの中身が変更されました。試しに https://www.avalon-studio.work/feed/ にアクセスしてみましょう。ちゃんとベタ打ちした URL に置き換わっていることが確認できると思います。

header.php に参照リンクの追加

このままでも feed の運用的には問題ないのですが、各記事ページから Feed に辿れるように、RSS へのリンクを設定してあげます。こちらは wp-content\(お使いのテーマのフォルダ)\header.php の中身に1行追加するだけです(本当はチャイルドテーマ使ったほうが良いのでしょうけど、1行だけですから・・・)
※テーマがバージョンアップした際はこのカスタマイズが消えますので、ここだけ再度作業を行ってください

<link rel="alternate" type="application/rss+xml" title="RSS" href="https://www.avalon-studio.work/feed/" />

以上で、カスタマイズした RSS が出力でき、それを参照する HTML タグを出力することができました。