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最適化する方法

お気軽にご相談ください

お見積りへ お問い合わせへ
▲