2026年10月15日
2026年10月15日
WordPressのRSSフィードを最適化してコンテンツ配信を強化する方法
はじめに
WordPressのRSSフィードはブログ読者への配信・Googleニュースへの掲載・SNS自動投稿など多くの用途に活用できますが、デフォルト設定のままでは最適化が不十分です。記事数・コンテンツ量の制御・カスタム配信チャンネルの追加・キャッシュ設定を適切に行うことで、コンテンツ配信の効率と読者体験を大幅に改善できます。
症状・原因
- RSSフィードに含まれる記事が少なすぎてRSSリーダーでの購読体験が悪い
- フィードにアイキャッチ画像が含まれておらず、視覚的に見劣りする
- アクセスのたびにフィードが動的に生成されておりサーバー負荷が高い
解決手順
ステップ1:posts_per_rssフィルターで配信件数と全文/抜粋を制御する
フィードの件数と本文の出力形式(全文・抜粋)をカスタマイズします。
<?php
// functions.php に追加 ─ RSSフィードの基本設定
// フィードに含める記事数を設定する(デフォルトは10件)
add_filter( 'posts_per_rss', function( $posts_per_rss ) {
return 20; // 最新20件をフィードに含める
} );
// 特定条件でフィードの件数を動的に変更する
add_filter( 'pre_get_posts', function( $query ) {
if ( $query->is_feed() && ! $query->is_singular() ) {
// カテゴリー別フィードは30件表示する
if ( $query->is_category() ) {
$query->set( 'posts_per_rss', 30 );
}
// カスタム投稿タイプのフィードは50件表示する
if ( $query->get( 'post_type' ) === 'product' ) {
$query->set( 'posts_per_rss', 50 );
}
}
} );
// フィードのコンテンツを全文ではなく抜粋にする
// (管理画面 > 設定 > 表示設定でも変更可能)
add_filter( 'the_content_feed', function( $content ) {
// フィードでは抜粋を使用したい場合(一部のRSSリーダーでは逆効果の場合もある)
global $post;
// 有料コンテンツはフィードでは抜粋のみ配信する
$access_level = get_post_meta( $post->ID, '_access_level', true );
if ( ! empty( $access_level ) && $access_level !== 'free' ) {
return '<p>' . get_the_excerpt() . '</p>'
. '<p><a href="' . get_permalink() . '">続きを読む →</a></p>';
}
return $content; // 無料コンテンツはフルテキストを配信する
} );
ステップ2:the_excerpt_rssとthe_content_feedでアイキャッチ画像を追加する
フィードにアイキャッチ画像を含めてRSSリーダーでのリッチな表示を実現します。
<?php
// functions.php に追加 ─ フィードにアイキャッチ画像を追加する
// フィードの本文先頭にアイキャッチ画像を追加する
add_filter( 'the_content_feed', function( $content ) {
global $post;
if ( ! has_post_thumbnail( $post->ID ) ) {
return $content;
}
// RSSフィード用のアイキャッチ画像HTMLを生成する
$thumbnail = get_the_post_thumbnail( $post->ID, 'medium', [
'style' => 'max-width:100%; height:auto; display:block; margin-bottom:16px;',
'alt' => esc_attr( get_the_title() ),
] );
// 本文の先頭に画像を挿入する
return $thumbnail . $content;
} );
// フィードのRSSネームスペースに画像情報を追加する(media:content要素)
add_action( 'rss2_ns', function() {
// Yahoo! Media RSS ネームスペースを追加する
echo 'xmlns:media="http://search.yahoo.com/mrss/"' . "\n";
} );
add_action( 'rss2_item', function() {
global $post;
if ( ! has_post_thumbnail( $post->ID ) ) {
return;
}
$thumbnail_id = get_post_thumbnail_id( $post->ID );
$thumbnail_url = wp_get_attachment_image_src( $thumbnail_id, 'large' );
if ( $thumbnail_url ) {
// media:content タグでリッチメディア情報を提供する(Googleニュース等で使用)
printf(
'<media:content url="%s" width="%d" height="%d" medium="image" />' . "\n",
esc_url( $thumbnail_url[0] ),
(int) $thumbnail_url[1],
(int) $thumbnail_url[2]
);
}
} );
ステップ3:add_feed()で特定投稿タイプ・カテゴリーのカスタムフィードを作成する
WordPressの標準フィードとは別に、独自のフィードURLを作成します。
<?php
// functions.php に追加 ─ カスタムフィードの登録
// カスタムフィードURL: /feed/press/ でプレスリリースのみ配信する
add_action( 'init', function() {
add_feed( 'press', 'render_press_release_feed' );
} );
function render_press_release_feed() {
// フィードのContent-Typeヘッダーを設定する
header( 'Content-Type: ' . feed_content_type( 'rss2' ) . '; charset=' . get_option( 'blog_charset' ), true );
// Transientキャッシュから既存のフィードを取得する
$cached = get_transient( 'press_release_feed' );
if ( $cached ) {
echo $cached; // キャッシュが有効な場合はそのまま出力する
return;
}
// プレスリリースカテゴリーの投稿を取得する
$posts = get_posts( [
'post_type' => 'post',
'category_name' => 'press-release', // プレスリリースカテゴリーのスラッグ
'posts_per_page' => 20,
'post_status' => 'publish',
] );
ob_start();
?>
<?php echo '<?xml version="1.0" encoding="' . get_option('blog_charset') . '"?>' . "\n"; ?>
<rss version="2.0" xmlns:content="http://purl.org/rss/1.0/modules/content/">
<channel>
<title><?php bloginfo_rss( 'name' ); ?> プレスリリース</title>
<link><?php bloginfo_rss( 'url' ); ?></link>
<description>最新のプレスリリース</description>
<?php foreach ( $posts as $post ) : setup_postdata( $post ); ?>
<item>
<title><?php the_title_rss(); ?></title>
<link><?php the_permalink_rss(); ?></link>
<pubDate><?php echo mysql2date( 'D, d M Y H:i:s +0000', get_post_time( 'Y-m-d H:i:s', true ) ); ?></pubDate>
<guid><?php the_guid(); ?></guid>
<content:encoded><![CDATA[<?php the_content_feed( 'rss2' ); ?>]]></content:encoded>
</item>
<?php endforeach; wp_reset_postdata(); ?>
</channel>
</rss>
<?php
$output = ob_get_clean();
// 生成したフィードを1時間キャッシュする
set_transient( 'press_release_feed', $output, HOUR_IN_SECONDS );
echo $output;
}
ステップ4:TransientAPIとfeed_cache_lifetimeでフィードをキャッシュする
フィードの生成コストを削減するためTransientとWordPress組み込みのキャッシュを活用します。
<?php
// functions.php に追加 ─ フィードキャッシュの設定
// WordPressのフィードキャッシュ有効期間を延長する(デフォルト: 43200秒=12時間)
add_filter( 'wp_feed_cache_transient_lifetime', function( $lifetime ) {
return 3600; // 1時間に変更する(更新頻度に合わせて調整)
} );
// フィードへのアクセスをTransientでキャッシュする(高トラフィック対策)
add_action( 'template_redirect', function() {
if ( ! is_feed() ) {
return;
}
$feed_type = get_query_var( 'feed', 'rss2' );
$cache_key = 'main_feed_' . $feed_type . '_' . md5( $_SERVER['REQUEST_URI'] );
$cached = get_transient( $cache_key );
if ( $cached !== false ) {
// キャッシュが存在する場合はContent-Typeを設定して出力する
header( 'Content-Type: application/rss+xml; charset=UTF-8' );
header( 'X-Cache: HIT' ); // キャッシュヒットを示すヘッダー
echo $cached;
exit;
}
// フィード生成後にTransientに保存するためob_startでバッファリングする
ob_start( function( $output ) use ( $cache_key ) {
set_transient( $cache_key, $output, HOUR_IN_SECONDS );
return $output;
} );
} );
// 投稿の公開・更新時にフィードキャッシュをクリアする
add_action( 'save_post', function( $post_id, $post ) {
if ( $post->post_status !== 'publish' ) {
return;
}
// フィードキャッシュを削除してフレッシュな内容を配信する
delete_transient( 'main_feed_rss2_' . md5( '/feed/' ) );
}, 10, 2 );
ステップ5:カスタムRSSネームスペースとIFTTT・Zapier連携でSNS自動配信を設定する
フィードを活用してTwitter・Facebook・Slackに記事を自動投稿する仕組みを構築します。
<?php
// functions.php に追加 ─ RSSネームスペースとSNS連携用メタデータの追加
// フィードにカスタムネームスペースを追加する
add_action( 'rss2_ns', function() {
echo 'xmlns:wpdr="https://example.com/rss-ext/"' . "\n";
echo 'xmlns:dc="http://purl.org/dc/elements/1.1/"' . "\n";
} );
// 各アイテムにSNS配信用のカスタム要素を追加する
add_action( 'rss2_item', function() {
global $post;
// 著者情報(dc:creator)を追加する
printf( '<dc:creator><![CDATA[%s]]></dc:creator>' . "\n", get_the_author() );
// カテゴリー(タグとして使用可能)
$categories = get_the_category();
foreach ( $categories as $cat ) {
printf( '<wpdr:category><![CDATA[%s]]></wpdr:category>' . "\n", $cat->name );
}
// ハッシュタグ用のカスタム要素
$tags = get_the_tags();
if ( $tags ) {
$hashtags = array_map( function( $tag ) {
// タグ名をハッシュタグ形式に変換する
return '#' . preg_replace( '/\s+/', '', $tag->name );
}, array_slice( $tags, 0, 3 ) ); // 最大3タグ
printf( '<wpdr:hashtags><![CDATA[%s]]></wpdr:hashtags>' . "\n",
implode( ' ', $hashtags ) );
}
// アイキャッチ画像のURLをenclosureとして追加する(Zapier等で画像取得に使用)
if ( has_post_thumbnail( $post->ID ) ) {
$img = wp_get_attachment_image_src( get_post_thumbnail_id( $post->ID ), 'large' );
if ( $img ) {
printf( '<enclosure url="%s" length="0" type="image/jpeg" />' . "\n",
esc_url( $img[0] ) );
}
}
} );
注意事項
- フィードのセキュリティ: カスタムフィードエンドポイントはレートリミットを設定し、大量アクセスによるサーバー過負荷を防ぐこと
- Transientキャッシュと更新遅延: キャッシュ有効期間中は新規投稿が反映されない。記事公開時のキャッシュクリア処理を必ず実装すること
- Googleニュース対応: Googleニュースへの掲載を狙う場合は記事本文を全文配信し、
を正確に設定すること。抜粋のみのフィードは審査で不合格になる
まとめ
WordPressのRSSフィードは posts_per_rss・the_content_feed・add_feed() の3つのAPIを組み合わせることで高度にカスタマイズできます。Transientキャッシュを活用してパフォーマンスを確保しながら、IFTTTやZapierと連携したSNS自動配信でコンテンツリーチを拡大しましょう。関連記事:WordPressのタクソノミーページをSEO最適化する方法