WordPressにスマートニュース向けのフィードを追加

毎回めんどくさいので諸々まとめとく。

[SmartFormat 仕様](https://publishers.smartnews.com/hc/ja/articles/360010977793) 
[SmartFormat Validator](http://validator.engine.smartnews.be)

[関連：WordPressにグノシー向けのフィードを追加](https://qiita.com/ki6ool/items/90fee94f495dce5caa3a)

```php:/path/to/theme/functions.php
//フィード追加
add_action('init', function() {
	add_feed('smartnews', function() { get_template_part('/feed/smartnews'); });
});

//クエリ変更
add_action('pre_get_posts', function($query) {
	if ( is_admin() ) return $query;
	if ( $query->is_main_query() && $query->is_feed('smartnews') ) {
		//投稿タイプ変更or追加
		$query->set('post_type', ['post', 'any']);
		//削除に対応する場合
		$query->set('post_status', ['publish', 'trash']);
	}
	return $query;
});
```

リライトルールを追加することになるので
設定>パーマリンク設定で更新する必要があります。

```php:/path/to/theme/feed/smartnews.php
<?php
/*
 * Atom /wp-includes/feed-atom.php
 * RSS2.0 /wp-includes/feed-rss2.php
 */

//ATOM版
header('Content-Type: ' . feed_content_type('atom') . '; charset=' . get_option('blog_charset'), true);
$more = 1;

echo '<?xml version="1.0" encoding="'.get_option('blog_charset').'"?'.'>';
do_action( 'rss_tag_pre', 'atom' );
?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:media="http://search.yahoo.com/mrss/" xmlns:snf="http://www.smartnews.be/snf">
	<title><?php echo get_option('blogname');?></title>
	<link type="text/html" href="<?php echo home_url('/');?>" rel="alternate"/>
	<subtitle><?php echo get_option('blogdescription');?></subtitle>
	<updated><?php echo mysql2date('Y-m-d\TH:i:s\Z', get_lastpostmodified('GMT'), false); ?></updated>
	<rights>【コピーライト】</rights>
	<logo><url>【ロゴ】</url></logo>
	<snf:logo><url>【ロゴ】</url></snf:logo>
	<ttl>15</ttl>
<?php while ( have_posts() ) : the_post(); global $post;?>
	<entry>
		<title><?php the_title_rss();?></title>
		<link type="text/html" href="<?php the_permalink_rss();?>" rel="alternate"/>
		<id><?php the_permalink_rss();?></id>
		<updated><?php echo get_post_modified_time('Y-m-d\TH:i:s\Z', true);?></updated>
		<content><![CDATA[
<?php if ( has_post_thumbnail() ):?>
			<figure>
			    <img src="<?php echo get_the_post_thumbnail_url($post->ID, 'large');?>">
			    <figcaption><?php echo get_the_post_thumbnail_caption($post->ID);?></figcaption>
			</figure>
<?php endif;?>
<?php the_content_feed('atom');?>
		]]></content>
<?php
$categories = get_the_category($post->ID);
if ( !empty($categories) ):
	foreach ($categories as $category) $cats[] = $category->name;
?>
		<category><?php echo implode(',', $cats);?></category>
<?php endif;?>
		<author><?php echo get_option('blogname');?></author>
		<dc:language>ja</dc:language>
<?php if ( has_post_thumbnail() ):?>
		<media:thumbnail url="<?php echo get_the_post_thumbnail_url($post->ID, 'large');?>" />
<?php endif;?>
		<media:status><?php echo (get_post_status($post->ID)=='publish') ? 'active' : 'deleted';?></media:status>
<?php do_action( 'atom_entry' );?>
	</entry>
<?php endwhile;?>
</feed>
```

仕様書は
```<logo>http://times.smartnews.co.jp/logo.png</logo>```
って書いてあるけど
ほんとうは
```<logo><url>http://times.smartnews.co.jp/logo.png</url></logo>```
っていうことらしいので注意。

まあ完璧な仕様書作れるとこってほぼないしね。仕方ないね。

本文のとこは本文前にアイキャッチ入れてるので適宜変更してください。