フィードのテンプレートを触らずにアイキャッチ画像のURLをRSSに追加する
むか~し、こちらの記事とかあちらの記事とかでWordPressのフィードのテンプレートに出力する内容をカスタマイズしていたことがあった。
今回、ひさびさにアイキャッチ画像のURLをRSSに追加しようと思ったが、やりたかったこととしては、<item>の中に、<title>や<pubDate>と同じレベルで<image>を追加するということ。
ガチガチに弄くり倒すならまだしも、ただそれだけを追加するのにこれらの記事みたいなやり方をすることが雑作になった。
わざわざこれらの記事のようなことをせずとも、手間暇抑えてなんとかならんかということで考えてみた。
フィードのテンプレートであるwp-include/feed-hoge.phpはテーマのテンプレートとかと同じように、単にRSS(又はATOM・RDF等)に出力するDOMの基本構成がつらつら書かれているだけ。
一番に目に付くフックも、色んな所でよく取り上げられるthe_excerpt_rss()くらい。
だが、これだと<item>内の<description>の中に書き出してしまうわけで、当然、<title>や<pubDate>と同じレベルで追加するということは行えない。
で、何かフックできそうなとこはないかとザラッと探していたところ、the_category_rss()なるものを発見した。
the_category_rss()は単体ないし複数のカテゴリの情報を書き出すためのテンプレート関数。
the_category_rss()はget_the_category_rss()の中でフィルター化されており、これに引っ掛けることができる。
なんと都合のいいことに、こいつはどのフィードでも<item>の直下に書き出されている。(当たり前?)
「記事が必ずカテゴリに紐付いている」という制約があるが、そもそも普通の投稿タイプ(post)だけならば、デフォルトで紐づくカテゴリが設定できるから特に問題はない。
というわけで、こんな感じでフィルターフックを作成。
function theme_add_feed_eyecatch( $the_list ) { $string = $the_list; $image = wp_get_attachment_image_src( get_post_thumbnail_id() ); if ( false !== $image ) $string .= '<image>' . esc_url( $image[0] ) . '</image>'; else $string .= '<image></image>'; return $string; } add_filter( 'the_category_rss', 'theme_add_feed_eyecatch', 10, 1 );
あとは普通にRSSの読み込み側でこんな感じにでも書けばよし。
$feed = simplexml_load_string( file_get_contents( 'WordPressのフィードのURL' ), 'SimpleXMLElement', LIBXML_NOCDATA ); $posts = $feed->channel->item; foreach ( $posts as $post ) : if( '' != $post->image ) : echo sprintf( '<img src="%s$1" alt="%s$2" />', $post->image, $post->title ) endif; endforeach;
どうしてもthe_excerpt_rss()のフックを使わずにやりたい(イコール、<description>に書き出したくない)場合は制約はあれどこのやり方で問題ないと思う。
制約はあるが、これで「<item>の中に、<title>や<pubDate>と同じレベルで<image>を追加する」という要件は満たせる。