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 -->

エイリアスで表示を切り替え、エントリーのカテゴリー情報を取得して英語と日本語を切り替えています。


執筆者情報
Profile Icon

ウェブ&マーケティングディレクター

清水公太

Web、映像、雑誌などの制作現場で、企画、デザイン、撮影、コーディング、マーケティング、業務改善などを経験してきました。 守備範囲は広めの雑食性のディレクターです。