【WordPress】RSSをまるごとカスタマイズする

ネコニウム研究所

PCを利用したモノづくりに関連する情報や超個人的なナレッジを掲載するブログ

【WordPress】RSSをまるごとカスタマイズする

2024-7-23 | ,

WordPressが発行するRSSをまるごとカスタマイズしたい!

概要

今回の記事では、WordPressが発行するRSSをまるごとカスタマイズする手順を掲載する。

下記の記事ではフィルターを使ってちまちまRSSをカスタマイズしてたんだけども、今回は丸ごとカスタマイズしちゃう。

仕様書

環境

  • WordPress 6.5.5

手順書

WordPressのディレクトリーのwp-includes/feed-rss2.phpを自分のテーマのディレクトリー(function.phpがあるとこ)にコピーして、ファイル名を適当にcustomize-rss2.phpに変更する。

function.phpに下記を追加する。

remove_filter('do_feed_rss2', 'do_feed_rss2', 10);
function custom_feed_rss2(){
    $template_file = '/customize-rss2.php';
    load_template(get_template_directory() . $template_file);
}
add_action('do_feed_rss2', 'custom_feed_rss2', 10);

既存のRSS2の発行を止めて、先ほどテーマのディクトリーにコピーしたcustomize-rss2.phpを使うよう設定する。

例1: 記事の投稿時刻をカスタマイズする

例として<item>(記事)の<pubDate>の時刻を記事の公開日時と完全に同一にする。

完全にとは、WordPressのGUI上では年月日時分で記事の公開日時を設定できるんだけども、実際にはデータベースに秒まで記録されてて、<pubDate>には秒まで表示されるようになってる。私のサイトのように記事の公開日時を0:00に固定してると記事毎に秒だけ0:00:13みたいにバラバラで変な感じになるので秒も00となるようにRSSの発行側で対応してみる。

<item>の部分を抜粋。

    <item>
        <title><?php the_title_rss(); ?></title>
        <link><?php the_permalink_rss(); ?></link>
        <?php if ( get_comments_number() || comments_open() ) : ?>
            <comments><?php comments_link_feed(); ?></comments>
        <?php endif; ?>

        <dc:creator><![CDATA[<?php the_author(); ?>]]></dc:creator>
        <pubDate><?php echo mysql2date( 'D, d M Y H:i:00 +0000', get_post_time( 'Y-m-d H:i:00', true ), false ); ?></pubDate>
        <?php the_category_rss( 'rss2' ); ?>
        <guid isPermaLink="false"><?php the_guid(); ?></guid>

        <?php if ( get_option( 'rss_use_excerpt' ) ) : ?>
            <description><![CDATA[<?php the_excerpt_rss(); ?>]]></description>
        <?php else : ?>
            <description><![CDATA[<?php the_excerpt_rss(); ?>]]></description>
            <?php $content = get_the_content_feed( 'rss2' ); ?>
            <?php if ( strlen( $content ) > 0 ) : ?>
                <content:encoded><![CDATA[<?php echo $content; ?>]]></content:encoded>
            <?php else : ?>
                <content:encoded><![CDATA[<?php the_excerpt_rss(); ?>]]></content:encoded>
            <?php endif; ?>
        <?php endif; ?>

        <?php if ( get_comments_number() || comments_open() ) : ?>
            <wfw:commentRss><?php echo esc_url( get_post_comments_feed_link( null, 'rss2' ) ); ?></wfw:commentRss>
            <slash:comments><?php echo get_comments_number(); ?></slash:comments>
        <?php endif; ?>

        <?php rss_enclosure(); ?>

        <?php
        /**
         * Fires at the end of each RSS2 feed item.
         *
         * @since 2.0.0
         */
        do_action( 'rss2_item' );
        ?>
    </item>
    <?php endwhile; ?>

更に<pubDate>の部分に絞り込むと。

<pubDate><?php echo mysql2date( 'D, d M Y H:i:00 O', get_post_time( 'Y-m-d H:i:00', true ), false ); ?></pubDate>

フォーマットをH:i:00として、秒を00固定にしてる。

例2: <dc:date>を追加する

WordPressのRSS2では標準で<dc:date>を出力しないので出力してみる。

function.phpに下記を追加する。

function insert_dc_date()
{
    global $post;
    echo '<dc:date>' . date_i18n('Y-m-d\TH:i:00P', strtotime($post->post_date)) . '</dc:date>
';
}

投稿時刻をi18nなフォーマット(2024-07-23T15:00:00+09:00)で取得して、<dc:date>タグで囲んで出力する関数。

<pubDate>とはフォーマットが違うらしい。

customize-rss2.php<dc:date>を追加したい場所に先ほど追加した関数をおく。

...
    <item>
        <title><?php the_title_rss(); ?></title>
        <?php insert_dc_date(); ?>
        ...
    </item>
...

例3: <dc:subject>を追加する

WordPressのRSS2では標準で<dc:subject>を出力しないので出力してみる。<dc:subject>はカテゴリーが記録されてるサイトが多いみたい。

function.phpに下記を追加する。

function insert_dc_subject() {
    global $post;
    $categories = get_the_category($post->ID);
    echo '<dc:subject>' . $categories[0]->name . '</dc:subject>
';
    return;
}

WordPressではカテゴリーが必ず1つは設定されてるので要素数のチェックを省いてる。カテゴリーを複数設定することもできるんだけども、一番最初のカテゴリーを取得してタグに設定する。

customize-rss2.php<dc:subject>を追加したい場所に先ほど追加した関数をおく。

...
    <item>
        <title><?php the_title_rss(); ?></title>
        <?php insert_dc_subject(); ?>
        ...
    </item>
...

まとめ(感想文)

WordPressのソースコードを見るとどこにアクションやフィルターがあるか分かって勉強になると思う今日のこの頃。