[a-blog cms] RSSフィードを多言語対応する
a-blog cmsとRSSフィード
日本産のCMSのa-blog cmsでは、デフォルトでRSSフィードの出力に対応しています。
各ディレクトリに「rss2.xml」を付けてアクセスするとフィードが表示されます。
これを、多言語サイトに対応した形式にする方法をご紹介いたします。
a-blog cmsの多言語サイト構築について
a-blog cmsでは、いくつかの方法で多言語サイトを構築できます。
ここでは、カスタムフィールドとエイリアス機能を使って多言語サイトを構築した場合のRSSフィールドの多言語対応についてまとめます。
エイリアス機能とは「異なるURLで同じブログを参照する」といった事が可能になる機能です。
詳しくはこちらの公式ドキュメントをご覧ください。
エイリアス機能 | 運用管理 | ドキュメント | a-blog cms developer
ちなみに、実際に多言語サイトを構築する場合は「ルール機能」という、特定の条件下においてCMSの設定を変更できる機能を利用する事も多いため、ご興味のある方は、以下の公式ドキュメントもご覧ください。
エイリアス機能を使って多言語サイトを用意する | その他 | カスタマイズtips | a-blog cms developer
RSS用のテンプレートファイルを多言語対応にする
前提
以下のように、既に英語用のカスタムフィールドが作成されている事が前提です。
- サイトの英語名がブログのカスタムフィールドに作成されている。もしくはエイリアス名を利用する。
- カテゴリーの英語名がカテゴリーのカスタムフィールドに作成されている。
- エントリーの英語名がエントリーのカスタムフィールドに作成されている。
- ユーザーの英語名がユーザーのカスタムフィールドに作成されている。
また、英語サイトの表示用にエイリアス機能を使います。
エイリアスIDは1と仮定します。
このエイリアスIDをIF文の条件に利用します。
Step01 : カスタマイズ用のテンプレートファイルを作成する
まず、以下のファイルを利用しているテーマファイル直下にコピーします。
/themes/system/rss2.xml
上記のファイルを直接編集するとCMSのアップデート時に編集した内容が消える可能性があるため、必ずテーマファイル直下にコピーしましょう。
カスタマイズ前のコードは以下の通りです。
Feed_Rss2
というモジュールが利用されています。
このモジュール自体は、シンプルで分かりやすいのですが、これだけではエントリーのカスタムフィールド等が取得できません。
<?xml version="1.0" encoding="UTF-8"?>
<rss xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/" version="2.0" xml:lang="ja"><!-- BEGIN_MODULE Feed_Rss2 -->
<channel>
<title>%{BLOG_NAME}<!-- BEGIN_MODULE Touch_Category --> - %{CATEGORY_NAME}<!-- END_MODULE Touch_Category --></title>
<link>%{BASE_URL}</link>
<atom:link href="%{INHERLINK}" rel="self" type="application/rss+xml" />
<description>%{META_DESCRIPTION}</description>
<language>ja</language>
<copyright>Copyright (C) %{Y} %{BLOG_NAME} All rights reserved.</copyright>
<lastBuildDate>{lastBuildDate}</lastBuildDate>
<generator>a-blog cms</generator>
<docs>http://blogs.law.harvard.edu/tech/rss</docs><!-- BEGIN item:loop -->
<item>
<dc:creator>{creator}</dc:creator>
<title>{title}</title>
<link>{link}</link>
<description><![CDATA[
@include("/include/unit-rss.html")
]]></description><!-- BEGIN category:veil -->
<category>{category}</category><!-- END category:veil -->
<guid isPermaLink="true">{permalink}</guid>
<pubDate>{pubDate}</pubDate>
</item><!-- END item:loop -->
</channel><!-- END_MODULE Feed_Rss2 -->
</rss>
Step02 : Entry_Body のモジュールIDを作成し、カスタムフィールドが利用できるようにする
今回は、Feed_Rss2
に加えてEntry_Body
のモジュールを利用するため、Entry_Body_for_RSS
という名前でEntry_Body
のモジュールIDを新たに作成します。
Feed_Rss2
のモジュールでは、カスタムフィールドは使用しないのでモジュールIDも作成しないで大丈夫です。
作成後は、モジュールIDの表示設定
のフィールド
の項目で基本設定とカスタムフィールドが表示できるようにチェックを入れます。
Step03 : rss2.xmlをカスタマイズ
テーマファイル直下にコピーしたrss2.xml
を次の用に変更します。
<?xml version="1.0" encoding="UTF-8"?>
<rss xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/" version="2.0" xml:lang="<!-- BEGIN_IF [%{ALIAS_ID}/eq/1] -->en<!-- ELSE -->ja<!-- END_IF -->"><!-- BEGIN_MODULE Entry_Body id="Entry_Body_for_RSS" -->
<channel>
<title><!-- BEGIN_IF [%{ALIAS_ID}/eq/1] -->%{ALIAS_NAME}<!-- ELSE -->%{ROOT_BLOG_NAME}<!-- END_IF --><!-- BEGIN_MODULE Touch_Category --><!-- BEGIN_MODULE Category_Field --> - <!-- BEGIN_IF [%{ALIAS_ID}/eq/1] -->{category_meta_title-en}<!-- ELSE -->{category_meta_title}<!-- END_IF --><!-- END_MODULE Category_Field --><!-- END_MODULE Touch_Category --></title>
<link>%{BASE_URL}</link>
<atom:link href="%{INHERLINK}" rel="self" type="application/rss+xml" />
<description><!-- BEGIN_MODULE Blog_Field --><!-- BEGIN_IF [%{ALIAS_ID}/eq/1] -->{blog_meta_description-en}<!-- ELSE -->{blog_meta_description}<!-- END_IF --><!-- END_MODULE Blog_Field --></description>
<language><!-- BEGIN_IF [%{ALIAS_ID}/eq/1] -->en<!-- ELSE -->ja<!-- END_IF --></language>
<copyright>Copyright (C) %{Y} <!-- BEGIN_IF [%{ALIAS_ID}/eq/1] -->%{ALIAS_NAME}<!-- ELSE -->%{ROOT_BLOG_NAME}<!-- END_IF --> All rights reserved.</copyright>
<!-- BEGIN_MODULE Feed_Rss2 --><lastBuildDate>{lastBuildDate}</lastBuildDate><!-- END_MODULE Feed_Rss2 -->
<generator>a-blog cms</generator>
<docs>http://blogs.law.harvard.edu/tech/rss</docs><!-- BEGIN entry:loop -->
<item>
<dc:creator><!-- BEGIN userField --><!-- BEGIN_IF [%{ALIAS_ID}/eq/1] -->{name-en}<!-- ELSE -->{fieldUserName}<!-- END_IF --><!-- END userField --></dc:creator>
<title><!-- BEGIN_IF [%{ALIAS_ID}/eq/1] -->{title_en}<!-- ELSE -->{title}<!-- END_IF --></title>
<link>{titleUrl}</link>
<description><![CDATA[
@include("/include/unit.html")
]]></description>
<!-- BEGIN category:veil --><!-- BEGIN categoryField --><category><!-- BEGIN_IF [%{ALIAS_ID}/eq/1] -->{category_meta_title-en}<!-- ELSE -->{category_meta_title}<!-- END_IF --></category><!-- END categoryField --><!-- END category:veil -->
<guid isPermaLink="true">{titleUrl}</guid>
<pubDate>{sdate#r}</pubDate>
</item><!-- END entry:loop -->
</channel><!-- END_MODULE Entry_Body -->
</rss>
概要を説明しますと、このカスタマイズでは、以下のモジュールを利用しています。
- Entry_Body : エントリーの情報とそれに付随するカスタムフィールドを取得
- Blog_Field : ブログ情報を取得
- Category_Field : 今いるカテゴリーページを取得
- Feed_Rss2 : 最終配信日である
lastBuildDate
タグの日付を取得
コード内にある変数の内、-en
の接尾句が付与されているものは英語用のカスタムフィールドです。
ただし、エントリータイトルのみハイフンではなくアンダースコアでtitle_en
という名前になっています。
本当はEntry_Body
か、Feed_Rss2
のみで多言語対応できればシンプルで良いのですが、難しそうです。
では、主なカスタマイズ箇所を見ていきます。
rssタグ
<rss xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/" version="2.0" xml:lang="<!-- BEGIN_IF [%{ALIAS_ID}/eq/1] -->en<!-- ELSE -->ja<!-- END_IF -->">
エイリアスで表示を変えています。
channelタグ > titleタグ
<title><!-- BEGIN_IF [%{ALIAS_ID}/eq/1] -->%{ALIAS_NAME}<!-- ELSE -->%{ROOT_BLOG_NAME}<!-- END_IF --><!-- BEGIN_MODULE Touch_Category --><!-- BEGIN_MODULE Category_Field --> - <!-- BEGIN_IF [%{ALIAS_ID}/eq/1] -->{category_meta_title-en}<!-- ELSE -->{category_meta_title}<!-- END_IF --><!-- END_MODULE Category_Field --><!-- END_MODULE Touch_Category --></title>
エイリアスで表示を変えています。
またタッチモジュールを使い、カテゴリーページではカテゴリーも表示されるようにしています。
これはカテゴリーのフィールドモジュールを利用しています。
channelタグ > descriptionタグ
<description><!-- BEGIN_MODULE Blog_Field --><!-- BEGIN_IF [%{ALIAS_ID}/eq/1] -->{blog_meta_description-en}<!-- ELSE -->{blog_meta_description}<!-- END_IF --><!-- END_MODULE Blog_Field --></description>
エイリアスで表示を切り替え、表示内容はブログのカスタムフィールドを利用しています。
channelタグ > languageタグ
<language><!-- BEGIN_IF [%{ALIAS_ID}/eq/1] -->en<!-- ELSE -->ja<!-- END_IF --></language>
エイリアスで表示を切り替え、表示内容はハードコーディングです。
channelタグ > copyrightタグ
<copyright>Copyright (C) %{Y} <!-- BEGIN_IF [%{ALIAS_ID}/eq/1] -->%{ALIAS_NAME}<!-- ELSE -->%{ROOT_BLOG_NAME}<!-- END_IF --> All rights reserved.</copyright>
エイリアスで表示を切り替え、表示内容はエイリアス名と、ルートブログのグローバル変数を利用しています。
channelタグ > lastBuildDateタグ
<!-- BEGIN_MODULE Feed_Rss2 --><lastBuildDate>{lastBuildDate}</lastBuildDate><!-- END_MODULE Feed_Rss2 -->
lastBuildDate
タグは、最新のエントリー記事の日付のみを取得できれば良いのですが、それが難しそうなため、ここだけFeed_Rss2
モジュールを使い、lastBuildDate
変数で最終更新日時
を表示しています。
channelタグ > itemタグ > dc:creatorタグ
<dc:creator><!-- BEGIN userField --><!-- BEGIN_IF [%{ALIAS_ID}/eq/1] -->{name-en}<!-- ELSE -->{fieldUserName}<!-- END_IF --><!-- END userField --></dc:creator>
エイリアスで表示を切り替え、表示内容はエントリーの執筆ユーザー(日本語名)か、そのユーザーフィールドのカスタムフィールド(英語名)で切り替えています。
channelタグ > itemタグ > titleタグ
<title><!-- BEGIN_IF [%{ALIAS_ID}/eq/1] -->{title_en}<!-- ELSE -->{title}<!-- END_IF --></title>
エイリアスで表示を切り替え、エントリーのカスタムフィールドで表示を切り替えています。
channelタグ > itemタグ > categoryタグ
<!-- BEGIN category:veil --><!-- BEGIN categoryField --><category><!-- BEGIN_IF [%{ALIAS_ID}/eq/1] -->{category_meta_title-en}<!-- ELSE -->{category_meta_title}<!-- END_IF --></category><!-- END categoryField --><!-- END category:veil -->
エイリアスで表示を切り替え、エントリーのカテゴリー情報を取得して英語と日本語を切り替えています。