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