WordPress SmartNews 用フィードの追加方法

WordPress で SmartNews 用フィードの追加方法を紹介します。
例えば、投稿やカスタム投稿の記事を SmartNews で表示したい時に便利な方法です。

  1. 前提条件と事前に用意するもの
  2. SmartNews用のフィードの追加
  3. フィードテンプレートの追加
  4. フィードのチェック
    1. よくあるエラーメッセージ
    2. channel.description は 100 文字以下で指定してください
    3. item.content:encoded の記事内に多くのリンクが含まれています
    4. item.snf:analytics 内の script タグは一つだけ指定するようにしてください
  5. フィードの申請

前提条件と事前に用意するもの

紹介する方法はメインクエリをフィードとして出力するカスタマイズになります。
投稿を主に使用している場合や、メインクエリにカスタム投稿が含まれている場合は、そのまま利用可能です。
投稿を使用せずに、カスタム投稿のみの場合は、メインクエリの記述をサブクエリ(サブループ)にカスタマイズする必要があるので、ご注意ください。

事前に用意するものとして、以下の投稿の特定の項目と画像ファイルが必要になります。
・抜粋(投稿のディスクリプションに使用)※100文字以内のディスクリプションが別途用意できればそれでも可
・アイキャッチ画像(投稿に紐づくサムネイル画像に使用)※投稿に紐づく画像が用意できればそれでも可
・サイトを象徴するロゴ画像(横700px以下 x 縦およそ100px アルファ付きPNGファイルが推奨)
・サイトを象徴するロゴ画像(ダークモード用)※必須ではない
・アイキャッチ画像の代替画像(投稿にアイキャッチ画像がない時に代替画像として使用)※OGP画像などで代用可

SmartNews用のフィードの追加

まずは SmartNews 用のフィードを追加します。
テーマファイルにある function.php に次のコードを追加します。

/*【出力カスタマイズ】SmartNews用のフィードを追加 */
// SmartNews のフィードを追加
add_action('init', function (){
add_feed('smartnews', function () { // SmartNews のフィードを追加
get_template_part('temp','smartnews'); // フィードのテンプレートにテーマファイル内の「temp-smartnews.php」を選択
});
});
// SmartNews のフィードの Content-type をカスタマイズ
add_filter( 'feed_content_type', 'custom_feed_content_type', 10, 2);
function custom_feed_content_type($content_type, $type){
if('smartnews' === $type ){
return feed_content_type('rss2');
}
return $content_type;
}

記述に問題なければ、サイトの末尾に「/?feed=smartnews」を付与するとフィードページが表示されます。
このサイトの場合は以下のフィードURLになります。
※ページの表示がされない場合は管理画面からパーマリンク設定を保存し直して更新してください。

https://hirashimatakumi.com/?feed=smartnews

フィードテンプレートの追加

次にフィードテンプレートを追加します。
テーマファイルにファイル名「temp-smartnews.php」を追加。
追加した temp-smartnews.php ファイルに次のコードを追加します。

<?php
// SmartNews用のFeedを出力
// 基本情報の設定
$site_name = get_bloginfo('name'); // 管理画面「サイトのタイトル」を取得
$site_url = get_bloginfo('url'); // 管理画面「キャッチフレーズ」を取得
$site_desc = get_bloginfo('description'); // 管理画面「キャッチフレーズ」を取得
if(mb_strlen($site_desc)>96){ // エラー回避:キャッチフレーズが100文字超える場合に末尾を省略
$site_desc = mb_substr($site_desc,0,96); // 文字数の制限
$site_desc = str_replace(array("\r", "\n"), '', $site_desc).・・・; // 改行の削除、末尾に「...」を追加
} else {
$site_desc = str_replace(array("\r", "\n"), '', $site_desc); // 改行の削除
}
$site_post_date = mysql2date('D, d M Y H:i:s +0900', get_post_time('Y-m-d H:i:s', true ), false ); // 投稿の公開日時を取得
$site_lang = 'ja'; // サイトの言語設定
$site_copyright = '(c) '. date('Y') .' hogehoge'; // コピーライト
$site_logo = get_template_directory_uri().'/img/logo-smartnews.png'; // サイトロゴ
$site_logo_dm = get_template_directory_uri().'/img/logo-smartnews-dm.png'; // サイトロゴ
$site_analytics = 'UA-xxxxxxx-x'; // GoogleアナリティクスのトラッキングIDを指定
?>
<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:media="http://search.yahoo.com/mrss/" xmlns:snf="http://www.smartnews.be/snf">
<channel>
<title><?php echo $site_name; ?></title>
<link><?php echo $site_url; ?></link>
<description><?php echo $site_desc; ?></description>
<pubDate><?php echo $site_post_date; ?></pubDate>
<language><?php echo $site_lang; ?></language>
<copyright><?php echo $site_copyright; ?></copyright>
<ttl>1</ttl>
<snf:logo><url><?php echo $site_logo; ?></url></snf:logo>
<snf:darkModeLogo><url><?php echo $site_logo_dm; ?></url></snf:darkModeLogo>
<?php // メインループ開始
while (have_posts()) : the_post();
?>
<item>
<title><?php echo get_the_title(); ?></title>
<link><?php the_permalink(); ?></link>
<guid><?php the_permalink(); ?></guid>
<description><![CDATA[
<?php // エラー回避:抜粋の文字数制限
$post_excerpt = strip_tags(get_the_excerpt());
if(mb_strlen($post_excerpt)>96 ) {
$content = mb_substr($post_excerpt,0,96); // 文字数の制限
echo $description = str_replace(array("\r", "\n"), '', $content).・・・; // 改行の削除、末尾に「...」を追加
} else {
echo $description = str_replace(array("\r", "\n"), '', $post_excerpt); // 改行の削除
}
?>
]]></description>
<pubDate><?php echo get_the_date('Y-m-d H:i:s'); ?> GMT</pubDate>
<content:encoded><![CDATA[
<?php // 本文の指定
$post_content = get_the_content();
echo preg_replace('/<a .*?>(.*?)<\/a>/', '$1', $post_content); // エラー回避:本文中のaタグを削除
?>
]]></content:encoded>
<?php // カテゴリの指定
$custom_post_tag = 'blog-tag'; // 投稿に紐づくカテゴリまたはタクソノミースラッグを指定
$custom_post_tag_terms = wp_get_object_terms($post->ID, $custom_post_tag);
if(!empty($custom_post_tag_terms)){
if(!is_wp_error( $custom_post_tag_terms )){
echo '<category>';
foreach($custom_post_tag_terms as $term){
$tag_term_link = get_term_link($term->slug, $custom_post_tag);
$tag_term_name = $term->name;
echo $tag_term_name.',';
}
echo '</category>';
}
}
?>
<dc:creator><?php the_author_nickname(); ?></dc:creator>
<dc:language><?php echo $site_lang; ?></dc:language>
<?php // サムネイル画像の指定
$og_image = get_stylesheet_directory_uri().'/img/ogp.png'; // 標準画像の準備
if (has_post_thumbnail($post_object->ID)) {
$thumbnail_id = get_post_thumbnail_id($post_object->ID); // アタッチメントIDの取得
$image = wp_get_attachment_image_src( $thumbnail_id, 'full' ); // full サイズのアイキャッチの情報を取得
$og_image = $image[0]; // アイキャッチ画像の絶対パスを代入
}
?>
<media:thumbnail url="<?php echo $og_image; ?>" />
<snf:analytics><![CDATA[
<script>
(function(i,s,o,g,r,a,m){i['GoogleAnalyticsObject']=r;i[r]=i[r]||function(){
(i[r].q=i[r].q||[]).push(arguments)},i[r].l=1*new Date();a=s.createElement(o),
m=s.getElementsByTagName(o)[0];a.async=1;a.src=g;m.parentNode.insertBefore(a,m)
})(window,document,'script','//www.google-analytics.com/analytics.js','ga');
ga('create', '<?php echo $site_analytics; ?>', '<?php echo $site_url; ?>');
ga('require', 'displayfeatures');
ga('set', 'referrer', 'http://www.smartnews.com/');
ga('send', 'pageview', '<?php the_permalink(); ?>');
</script>
]]>
</snf:analytics>
</item>
<?php endwhile; ?>
</channel>
</rss>

この時点で一度表示のテストを行い、表示に問題がなければコード内の以下の項目を任意の値に変更してください。

コード内の「基本情報設定」などを任意の値に変更

紹介しているコードは WordPress 構築時に入力している値を自動で出力しています。
必ず変更が必要な以下の項目と合わせ、任意の値を表示する場合は適宜調整を加えてください。
・「コピーライト」
・「サイトロゴ」
・「サイトロゴ(ダークモード)」
・「GoogleアナリティクスのトラッキングID」。
・メインクエリ内の「カテゴリ(タクソノミー)スラッグ」
・「サムネイル画像のファイルの保存先」
など

SmartNews が提供しているテンプレートに広告枠の設定などがありますが、今回紹介しているコードには記載がありません。
広告枠が必要な場合はSmartFormatのSmartFormat仕様書をご覧ください。

フィードのチェック

用意したフィードはSmartNewsが提供しているチェックツールを使用してコードのチェックが可能です。

SmartFormat チェックツール

よくあるエラーメッセージ

判定結果が「Valid」であれば問題ありませんが、エラーが表示される場合は「エラー内容」に従ってテンプレートを修正してください。
以下に、表示されやすいエラーメッセージをまとめました。

channel.description は 100 文字以下で指定してください

ディスクリプションは100文字以下に納める必要があります。
※紹介しているコードには100文字以下に納める処理を行っていますが、不備がある場合は調整を加えてください。

item.content:encoded の記事内に多くのリンクが含まれています

投稿の本文内にリンクタグが多いとエラーが表示されます。
※紹介しているコードには本文内からリンクタグを削除する処理を加えています。

item.snf:analytics 内の script タグは一つだけ指定するようにしてください

投稿に同じGoogleアナリティクスのトラッキングコードが記載されていると表示される場合があります。
独自のGA4タグなどを加える場合は SmartNews 用の調整が必要のため注意が必要です。
※紹介しているコードにはUAコード用の記述を使用しています。

そのほか、不明なエラーはSmartFormatチェックツール上でのエラー文章についてをご覧ください。

フィードの申請

エラーコードが解消できた場合は、SmartFormat申請フォームからフィードを申請、審査が通れば完了です。

SmartFormat申請フォーム

まとめ

WordPress で SmartNews 用フィードの追加方法を紹介しました。