WordPress のメイン フィードを切り替える方法

April 14, 2015

WordPress サイトのメイン フィード //example.com/feed/ の中身を、例えば特定カテゴリのフィードや、カスタム投稿タイプのフィードに切り替える方法です。

How to Customize Main Feed in WordPress

サイトのメイン フィードは、デフォルトだと投稿した記事(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 側の 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 取るとか書いてられないよ。筆者はぷりぷり思いました。

コメントを残す

メールアドレスが公開されることはありません。