WordPress サイトのメイン フィード //example.com/feed/ の中身を、例えば特定カテゴリのフィードや、カスタム投稿タイプのフィードに切り替える方法です。
サイトのメイン フィードは、デフォルトだと投稿した記事(post_type が post )のフィードです。この内容を変更する方法は いくつかあるのですが、メイン フィードである、という条件判定が意外に手間なので、リライト ルールを操作することにしました。
尚、本稿でご紹介する方法はパーマリンク設定をデフォルト以外にしている場合のみ有効です。また、パーマリンクをカスタム構造にしている場合は適宜、読み替えてください。
メイン フィードを特定カテゴリのフィードに切り替える
以下のコードを functions.php に追加します。
追加したら、管理画面のパーマリンク設定画面を一度 開くと有効になります(一度だけ開くだけで OK です)。また、フィードを確認する際は Ctrl+F5 で再読み込みしてください。ブラウザによっては通常の再読み込みだとキャッシュを表示してしまう場合があるようです。
xxxxx 部分は対象カテゴリの名前(スラッグ)を指定します。
function my_main_feed_rewrite_rule() { add_rewrite_rule( '^(feed|rdf|rss|rss2|atom)/?$', 'index.php?category_name=xxxxx&feed=$matches[1]', 'top' ); add_rewrite_rule( '^feed/(feed|rdf|rss|rss2|atom)/?$', 'index.php?category_name=xxxxx&feed=$matches[1]', 'top' ); } add_action( 'init', 'my_main_feed_rewrite_rule' );
メイン フィードをカスタム投稿タイプのフィードに切り替える
yyyyy 部分は対象のカスタム投稿タイプの名前(register_post_type の第一引数)を指定します。
function my_main_feed_rewrite_rule() { add_rewrite_rule( '^(feed|rdf|rss|rss2|atom)/?$', 'index.php?post_type=yyyyy&feed=$matches[1]', 'top' ); add_rewrite_rule( '^feed/(feed|rdf|rss|rss2|atom)/?$', 'index.php?post_type=yyyyy&feed=$matches[1]', 'top' ); } add_action( 'init', 'my_main_feed_rewrite_rule' );
プチ解説
このコードでやっていることを完全に説明するのは なかなか難しい。筆者は以下のサイトで勉強させていただきました。
- WordPress の表示ロジックを理解する – Reloaded – | プライム・ストラテジー株式会社
- Rewrite APIその1 「Rewriteとパーマリンク」(WordPressプラグイン開発のバイブルのボツ原稿から) | Shinichi Nishikawa’s
尚、このリライト ルールの操作は WordPress 側の Rewrite API を利用していますが、.htaccess を使っても同じことができます。どちらでもお好みでどうぞ。
.htaccess でリライトする例
ハイライトした部分を追加しています。
# BEGIN WordPress <IfModule mod_rewrite.c> RewriteEngine On RewriteBase / RewriteRule ^(feed|rdf|rss|rss2|atom)/?$ index\.php\?post_type=yyyyy&feed=$1 [L] RewriteRule ^feed/(feed|rdf|rss|rss2|atom)/?$ index\.php\?post_type=yyyyy&feed=$1 [L] RewriteRule ^index\.php$ - [L] RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d RewriteRule . /index.php [L] </IfModule> # END WordPress
(おまけ)全く別のアプローチ: クエリを操作する方法
やってみたけど諦めた系ですが、pre_get_posts アクション フックで $query->is_feed() を使って条件分岐してクエリ パラメータをいじってみようとしたところ、メイン フィード //example.com/feed/ なのに is_home() も is_front_page() も True になっていないので早々に諦めました。ほとんどの is_xxxxx を OR 条件に放り込んで not 取るとか書いてられないよ。筆者はぷりぷり思いました。