2022年3月に機能確認したところ、このページで過去に掲載していた方法でカスタマイズを行った場合、カスタム投稿タイプやカテゴリー限定で使用した際に情報が反映されないことが判明したため、に、問題なく動作するよう、本文やコードを大幅に刷新しました。
WordPressの標準機能であるRSS Feed機能。RSSリーダーなどで最新の情報をチェックしたり、他のサイトの更新情報などを取得して表示する際に重宝する機能です。
RSS FeedはWordPressに限った機能ではなく、時系列の投稿を管理するブログなどでは標準搭載されていて、アクセスアップに一役買う場合もあります。
ただ、この機能は、「公開日」順での出力が基本となっていて、後から更新することの多いサイトでは、せっかく更新してもRSS Feedとしては出力されず、更新されたことが伝わらない難点があります。
そこで今回は、RSS Feedの内容を「最終更新日」順に出力されるようにして、更新を行ったコンテンツにも目を留めてもらえるようにする方法を紹介します。
今回行うカスタマイズは、外部からフィードURLへアクセスされた際に、WordPress標準のRSS用テンプレートを別のテンプレートに置き換えるという機能を実装するものです。
具体的には以下の手順で行います。
- WordPress標準のRSS Feed用ファイルをコピーして更新日順になるように書き換えたファイルを作る
- テーマへファイルをアップロードする
- フィードアドレス(通常は「サイトのドメイン/feed/」)へアクセスされた時に書き換えたファイルの内容が出力されるようにする
カスタマイズには、以下のようなスキルが必要です
- FTPなどを使って、WordPress本体内のファイルのダウンロード、テーマへのファイルアップロードができる
- テーマのfunctions.phpへプログラムコードを追記したことがある
- エラーなどが発生した際に対処ができる
また、きちんと設定できたかの確認を行うため以下のような環境があるとベストでしょう。
- RSSフィードリーダを使って動作確認する(Feed Watcherなどを使う)
- ドメインが異なるWordPressサイトを使って確認する
- RSSフィードリストを追加できるようなブログサービスのブログを使って確認する
本記事では2の環境を使って確認することを前提にしています
すべての環境で問題なく動作するという保証はできませんし、状況によってはエラーが発生することもありますので、自己責任でのカスタマイズをお願いします。
ちなみに今回のRSS Feedではなく、WordPressサイトで新着投稿の一覧を更新日順にしたい場合には、「「公開日順」で表示されるWordPressのいろいろなリストを「更新日順」で表示する方法」をご覧ください。
別のWordPressサイトでテストするための準備
WordPressでは、他サイトのRSSフィードを表示させる際、ページが開くたびに情報を取得しにいく負荷を軽減するため、12時間のキャッシュ(一時保存)機能を備えています。
キャッシュ機能が有効になっていると、今回のカスタマイズが正常に機能しているのかをきちんと確認することができません。
そこで、以下のコードを確認する側のサイトのテーマにあるfunctions.phpへ追記して、フィードキャッシュを暫定的に無効にします(即時反映されるようにします)。
/***** フィードのキャッシュをオフにする *****/
function turn_off_feed_caching($feed){
$feed-> enable_cache(false);
}
add_action('wp_feed_options','turn_off_feed_caching');
テストが終了したら上記コードは忘れずに削除してください
テスト側サイトの準備が完了したら、出力側サイトのカスタマイズを進めていきましょう
RSSリーダーなどを使ってテストを行う場合には、それぞれのサービスでキャッシュのクリア方法をご確認ください
WordPressで出力するRSSフィードを「公開日順」から「更新日順」に変更する手順
RSS Feedを更新日順で出力するためのファイルを作る
WordPress標準のRSSフィード用ファイルの一部を変更し、更新日順出力用のファイルを作ります。
ファイルの加工は、メモ帳ではなくEmEditorなどのテキストエディタを使用してください
サーバー内の「wp-includes」→「feed-rss2.php」をパソコンへ一旦ダウンロードします。
ダウンロードしたファイルを開き、以下を修正します。
1.フィードリスト内の日付を最終更新日にする
多くのフィードリーダーでは、取得したフィード情報を自身で日付順に並び替えるため、通常一覧上に出力される公開日を最終更新日に変える必要があります(というか、これをしておけばまず間違いなく更新日順で表示されます)。
ダウンロードしたfeed-rss2.phpを開き、96行目付近にある
<?php echo mysql2date( 'D, d M Y H:i:s +0000', get_post_time( 'Y-m-d H:i:s', true ), false ); ?>
という記述を以下へ書き換えて保存します。
<?php echo mysql2date( 'D, d M Y H:i:s +0000', get_post_modified_time( 'Y-m-d H:i:s', true ), false ); ?>
コード中のget_post_time(公開日時)をget_post_modified_time(最終更新日時)へ変更しています
2.出力されるリストを更新日順にする
上記の処理では、受け取り側(RSSフィードリーダー側)が更新日で並び替えることを前提にしていますので、ひょっとすると更新日順で表示されないかも知れません。
これは、出力側のフィード一覧(https://〇〇/feedで表示される内容)が、日付のみ更新日になっているだけで並び変わっていないからです。
ただ、いろいろなフィードリーダー等でテストした結果、特にこの措置をする必要はないように感じますが、一応出力リストも更新日順になるようにしておくと安心かも知れません。
これを行うには、feed-rss2.phpを開き、90行目付近にある以下の記述
while ( have_posts() ) :
の上に、以下のコードを1行追加します。
query_posts("&orderby=modified&posts_per_page=".get_option("posts_per_rss"));
繰り返しますが、この措置をしなくてもほとんどのリーダーでは更新日順で表示されるので、追記する必要はないと思います。
テーマへファイルをアップロードする
書き換えたファイルを子テーマのフォルダ直下(style.cssやfunctions.phpのある場所)へアップロードします
親テーマへアップロードした場合、将来的にテーマの更新によって削除や変更が行われる可能性がありますので、子テーマの使用、子テーマへのアップロードをおすすめします。
フィードアドレスへアクセスされた時に書き換えたファイルの内容が出力されるようにする
以下のコードを子テーマのfunctions.phpへ追記して、フィードアドレスにアクセスされた際に、書き換えたファイル(テンプレート)が開かれるようにします。
/***** 標準のフィードを停止 *****/
remove_filter('do_feed_rss2', 'do_feed_rss2', 10);
/***** 更新日順用のフィード出力 *****/
if ( !function_exists( 'ha_modify_feed_rss2' ) ){
function ha_modify_feed_rss2(){
$template_file = get_stylesheet_directory() .'/feed-rss2.php';
load_template($template_file);
}
}
add_action('do_feed_rss2', 'ha_modify_feed_rss2', 10);
上の2行で標準のFeedテンプレートを停止し、4行目以降のコードで先ほどアップロードしたテンプレートを開くようにするコードです。
親テーマへ追記する場合は、コード中のget_stylesheet_directory()をget_template_directory()へ書き換えてください(非推奨)。
テスト側サイトでの動作確認
最後にきちんと動作するかをテスト側サイトで確認しましょう。
投稿を新規追加、または何かの投稿の編集画面を開き、RSSブロックを追加します。
URL欄へ「カスタマイズしたサイトのトップページURL/feed/」を入力します。
以下のように、公開日順だったもの(画像上)が更新日順(画像下)になっていればOKです。
また、カテゴリー限定したり、カスタム投稿タイプで限定したものについて確認したい場合は、
- カテゴリーの記事一覧を表示させ、URL末尾に/feed/を付けたものをフィードURLに指定する
- カスタム投稿タイプの記事一覧を表示させ、URL末尾に/feed/を付けたものをフィードURLに指定する
などいろいろと試して問題がないかを確認ください。
テストが終了したらテストサイトに追加した、フィードのキャッシュをオフにするために追加したコードは忘れずに削除してください
テストサイト等での確認で、変更が確認できないときは
RSSフィードを取得して表示する場合、ほとんどのサービスでは一定期間情報を保存(キャッシュ)して、負荷の軽減を図っています。
これはWordPressについても同様ですので、今回の方法で更新日順(日付に更新日を出力)した場合で、他のWordPressサイトのRSSブロックなどを使ってテストする場合には、一旦キャッシュ機能をクリアすると、変化がスムーズに確認できます。
RSSフィードキャッシュは、以下のコードをテーマのfunctions.phpへ追加することで簡単に無効にできます。
function ha_turn_off_feed_caching( $feed ) {
$feed->enable_cache( false );
}
add_action( 'wp_feed_options', 'ha_turn_off_feed_caching' );
後述
本記事は以下のページを参考に、一部コードの改変と自サイトでの検証を行って問題なく動作した方法を掲載しています、というかしていました。
- 【WordPress】RSSにカスタム投稿タイプを追加して更新日時順に並び替える
- WordPressのRSS表示を更新日順に変更する方法(RSSのカスタマイズ)
- WordPressでfeedのテンプレートをカスタマイズする手順まとめ
各記事とも少しずつ違ってて、いろいろ試行錯誤して設置完了!で記事を公開していました。ところが冒頭でもお知らせした通り公開当初の段階から最近まではそのコードで不具合があることにも気づいていませんでした(参考にされた方申し訳ありません)。
公開から1年半、テーマの自作(こちらで配布もしています)もできるようになり、今回の件に限らずいろいろなところで紹介されているコードについても理解してから設置することができるようになった今、なーんだって話でしたので備忘録を兼ねて掲載しておきます。
改めてフィードテンプレートのソースを見ると、その構造は、基本ループで抽出した内容を指定回数繰り返す処理をしているという、通常の投稿リスト(home.phpなど)と同じ。
ただし、投稿テンプレートのように自動判別して適用するということはしてくれません。
これを踏まえて必要な処置としては、
- 更新日順用のフィード出力用テンプレートを作る
- テンプレートの内容について、「公開日順」になっているところを「更新日順」に変えて、更新日基準で抽出されるようにする
- テンプレートは自動上書きされない(自動判別されない)から、入れ替えるためのプログラムを追加する
の3つ。それが分かれば...という話でした。
おまけ RSSフィードを「公開日順」から「更新日順」に並び替えるだけなら
この方法での確実な検証は行っていません
ORDER WORDPRESS RSS FEED BY MODIFIED RATHER THAN PUBLISHEDという海外サイトに掲載されている方法です。
やり方は簡単で、テーマのfunctions.phpへ以下を追加するだけです(参照元サイトのコードを変更しています)
/***** RSSフィードを更新日順に並び替える *****/
function habone_feed_date_alter_the_query( $request )
{
$change_feed_mod_query = new WP_Query();
$change_feed_mod_query->parse_query($request);
if($change_feed_mod_query->is_feed())
$request['orderby'] = 'modified';
return $request;
}
add_filter('request', 'habone_feed_date_alter_the_query');
たったこれだけの作業(コードの追加)で、RSSフィードを「更新日順」に並び替えることができます。
・・・が、この方法だと問題が発生します。それは「RSSリーダーなどに更新した日付が伝えられず、結局公開日順でしか表示されない」ことです(リーダーによって違うかも知れません..)
RSSフィードを他のサイトで読み込んで表示するというシーンなら使えるのかも知れませんが、リーダーのように最終的に日付順で並び替えて表示されるようにするためには、きちんと日付を伝える必要がありそうです。
本記事の更新(変更)履歴
更新日 | 更新内容 |
---|---|
2020年 6月22日 | 記事公開しました |
2022年 3月15日 | 旧方法では限定フィード(カテゴリーやカスタム投稿タイプ)で不具合があったため、正常に機能するよう、記事内容を大幅に変更しました。 |
2022年10月28日 | WordPressでテストをする際のフィードキャッシュ削除方法を追記しました |