kamenokoki.com

RSS.xml(version1.0)をPHPで自作する方法

Posted:  Last Update:

ブログランキングサイトなどに送信するRSS version1.0を作りたい!でも、どこから手をつけていいのか分からない…。そんな方に向けて、この記事では「RSS version1.0」の形式や、PHPでの作成方法を詳しく紹介します。これさえ読めば、「RSS version1.0」をPHPで自作できるようになります!

RSS Version1.0とは

RSSは、サイトの更新情報を閲覧者に報せるためのファイルです。RSSはversion 1.0とversion 2.0の2系統に分かれています。今回紹介するversion1.0はRSS0.9を拡張する目的で作られ、リッチな情報を提供できるようになっています。

より簡易なRSS 2.0を利用することも可能ですが、一部のブログランキングサイトではRSS1.0にしか対応していないことがあります。もしブログランキングサイトに登録しているなら、RSS 1.0を作成しておいて損はありません。

RSS Version1.0の様式

RSS 1.0のスペックはRSS 1.0 specificationで確認することができます。今回はその中から、ブログランキングサイトなどに送信する、必須の情報のみをピックアップしてみました。

最初の2行は「RSS.xml」ファイルの形式を宣言しています。「channel」では、サイトのコア情報を記載。それに続く各アイテムには、サイトの聞くページの情報を羅列します。

<?xml version="1.0"?>
<rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"xmlns="http://purl.org/rss/1.0/">
<channel rdf:about="RSSのリンク">
<title>サイトの名前</title>
<link>サイトのホームページ</link>
<description>サイトの説明</description>
<items>
<rdf:Seq>
<rdf:li resource="最新記事1のリンク" />
<rdf:li resource="最新記事2のリンク" />
</rdf:Seq>
</items>
</channel>
<item rdf:about="1つ目の記事リンク">
<title>記事のタイトル</title>
<link>1つ目の記事リンク</link>
</item>
<item rdf:about="2つ目の記事リンク">
<title>記事のタイトル</title>
<link>2つ目の記事リンク</link>
</item>
※記事の分だけitemを繰り返す
</rdf:RDF>

実際のrss version1は当サイトのRSS version1.0でご確認いただけます。

次の小見出しからは、このRSS1.0をPHPを利用して作成する方法をご紹介します。

RSS Version1.0をPHPで作成する方法

ここでは、RSS Version1.0をPHPで作成する方法を紹介します。自由にコピペして使いまわしていただいてかまいません!

PHP全文紹介

最初に、PHPの全文をご紹介します。少し長いので、続く小見出して少しずつ内容を解説していきます。

内容をコピペして使いたい方は、このPHPをコピーしてノートなどに貼り付けます。次に、「createrss1.php」などのファイル名で、ベースディレクトリ(index.phpと同じ階層)に保存してください。なお、このPHPはベースディレクトリに置くことを前提に作成しています。

<?php
$myurl = "https://example.com";
$mypath = dirname(__FILE__);
$myname = "サイトの名称";
$mydescription = "サイトの説明文";
$folders = array("ファイル名1","ファイル名2");

$files = array();
foreach($folders as $folder){
array_push($files, glob("$mypath/$folder/*.html"));
}
foreach($files as $file){
foreach ($file as $value){
$filepath[filemtime($value)][] = $value;
}
}
krsort($filepath);

$fp = fopen("$mypath/rss1.xml", "w");
fwrite($fp, '<?xml version="1.0"?>
<rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns="http://purl.org/rss/1.0/">
<channel rdf:about="'
.$myurl.'/rss1.xml">
<title>'
.$myname.'</title>
<link>'
.$myurl.'</link>
<description>'
.$mydescription.'</description>
<items>
<rdf:Seq>'
."\n");

$i = 0;
foreach($filepath as $filename){
$filename = str_replace($mypath, $myurl, $filename[0]);
fwrite($fp, '<rdf:li resource="'.$filename.'" />'."\n");
$i++;
if($i >= 2){break;}
}

fwrite($fp , '</rdf:Seq>'."\n".'</items>'."\n".'</channel>'."\n");

foreach($filepath as $filename){
preg_match('/<title>(.*?)<\/title>/i', file_get_contents($filename[0]), $findvalue);
$title = str_replace('<title>', '', $findvalue[0]);
$title = str_replace('</title>', '', $title);
$filename = str_replace($mypath, $myurl, $filename[0]);
fwrite($fp, '<item rdf:about="'.$filename.'"><title>'.$title.'</title><link>'.$filename.'</link></item>'."\n");
}

fwrite($fp, '</rdf:RDF>');
fclose($fp);
?>

PHPの開始と終了

PHPを利用する際には、PHPの開始と終了を宣言します。サンプルのPHPでは、最初と最後の行がこれに当たります。

<?php

?>

サイトの基本情報を予め変数に入れておく

最初にサイトの基本情報を、PHPの変数に格納していきましょう。後ほどRSSにこの情報を書き込んでいくための準備です。サンプルの2行目からの部分です。

$myurl = "https://example.com";
$mypath = dirname(__FILE__);
$myname = "サイトの名称";
$mydescription = "サイトの説明文";
$folders = array("ファイル名1","ファイル名2");
  • 「$myurl=""」の""内にご自身のサイトのドメイン名を「https:// (http://)」をつけて記入してください
  • $mypath = dirname(__FILE__);」では、基準となるファイルパスを取得しています。このPHPはベースディレクトリに置くことを前提にしており、index.htmlなどがある階層のパスを取得しています
  • 「$myname = "サイトの名称"」の""内に、ご自身のサイト名を入力してください
  • 「$mydescription = "サイトの説明文"」の""内にご自身のサイトの説明文を入れてください
  • $folders = array("ファイル名1","ファイル名2");」には、RSSに書き出したいファイルが格納されているファイル名を入れます。複数ある場合にはファイル名をそれぞれ「""」に入れて「,」で区切ってください

ページを読み込み、作成順に並べる

次に、「$folders = array("ファイル名1","ファイル名2");」内の各フォルダ内のファイルを取得するPHPです。

$files = array();
foreach($folders as $folder){
array_push($files, glob("$mypath/$folder/*.html"));
}
foreach($files as $file){
foreach ($file as $value){
$filepath[filemtime($value)][] = $value;
}
}
krsort($filepath);
  • PHPの配列関数「$files」にファイル名を入れていきます。最初に「$files = array();」で$filesを空の状態の変数であると宣言しています
  • foreach($folders as $folder)」で、先に指定した各フォルダについてそれぞれ作業をしています
  • array_push($files, ...);」で、$filesという関数に「...」の情報を追加しています
  • glob("$mypath/$folder/*.html")」では、フォルダ内にある「.html」で終わるファイルを一括で取得しています。拡張子が異なる場合は適宜変更してください
  • foreach($files as $file){foreach ($file as $value){」内で、先に取得したファイル一覧の作成日時を取得しています
  • $filepath[filemtime($value)][] = $value;」で、連想配列「$filepath」に、ファイルの作成日時と、ファイル名を格納しています
  • krsort($filepath);で、ファイルの作成日時が新しいものから、ファイルを並べ替えます

RSS.xml(RSS_ver1.xml)を開き、書き込み、閉じる

「fopen」でファイル「rss1.xml」を開き、「fwrite」で書き込みを行い、「fclose」でファイルを閉じています。

$fp = fopen("$mypath/rss1.xml", "w");

fwrite($fp, 'ABCDE...');

fclose($fp);

今回のPHPには「fwrite($fp, 'ABCDE...');」が5か所記載されています。それぞれ書き込む内容が異なっていますので、次から詳しく見ていきましょう。

サイトのコア情報を書き出す-固定部分

「rss1.xml」に、最初にサイトのコア情報を書き出していきます。

RSS version1.0の形式の該当部分がこちらです。

<?xml version="1.0"?>
<rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"xmlns="http://purl.org/rss/1.0/">
<channel rdf:about="RSSのリンク">
  <title>サイトの名前</title>
  <link>サイトのホームページ</link>
  <description>サイトの説明</description>
  <items>
  <rdf:Seq>

  </rdf:Seq>
  </items>
</channel>

</rdf:RDF>

PHPでは下記で書き出しています。


fwrite($fp, '<?xml version="1.0"?>
<rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns="http://purl.org/rss/1.0/">
<channel rdf:about="'
.$myurl.'/rss1.xml">
<title>'
.$myname.'</title>
<link>'
.$myurl.'</link>
<description>'
.$mydescription.'</description>
<items>
<rdf:Seq>'
."\n");

fwrite($fp , '</rdf:Seq>'."\n".'</items>'."\n".'</channel>'."\n");

fwrite($fp, '</rdf:RDF>');

少し長いですが、「fwrit」を使ってファイルに情報を書き込んでいます。「$myname」「$myurl」「$mydescription」は、最初にPHPの変数として指定した「サイトのURL」「サイトの名称」「サイトの説明文」が入ります。

サイトのコア情報を書き出す-随時変更部分

次にサイトのコア情報として書き出している、最新のページ2件を書き込んでいきます。

RSSの該当部分がこちらです。

  <rdf:li resource="最新記事1のリンク" />
  <rdf:li resource="最新記事2のリンク" />

PHPの書き出し部分がこちら。

$i = 0;
foreach($filepath as $filename){
        $filename = str_replace($mypath, $myurl, $filename[0]);
        fwrite($fp, '<rdf:li resource="'.$filename.'" />'."\n");
        $i++;
        if($i >= 2){break;}
}

先に取得したファイルの一覧は日付順に並べ替えてあります。ここではファイル一覧($filepath)のうち、最新の2件を書き出しています。また、ファイル名はパスで取得していますので、「$filename = str_replace($mypath, $myurl, $filename[0]);」でURLに置き換えています。

サイトの各ページの情報をかき込む

最後に、ファイルの一覧を書き出していきます。RSSの該当部分がこちらです。

  <item rdf:about="1つ目の記事リンク">
    <title>記事のタイトル</title>
    <link>1つ目の記事リンク</link>
  </item>
  <item rdf:about="2つ目の記事リンク">
    <title>記事のタイトル</title>
    <link>2つ目の記事リンク</link>
  </item>
 記事の分だけitemを繰り返す

PHPの書き出し部分がこちら。

foreach($filepath as $filename){
preg_match('/<title>(.*?)<\/title>/i', file_get_contents($filename[0]), $findvalue);
$title = str_replace('<title>', '', $findvalue[0]);
$title = str_replace('</title>', '', $title);
$filename = str_replace($mypath, $myurl, $filename[0]);
fwrite($fp, '<item rdf:about="'.$filename.'"><title>'.$title.'</title><link>'.$filename.'</link></item>'."\n");
}
  • 「preg_match」から続く3行で、各記事ファイル内の「<title></title>」に囲まれたタイトル情報を取得しています。タイトルはPHP変数「$title」に代入されています。
  • $filename = str_replace($mypath, $myurl, $filename[0]);」では、パス名で取得したファイル名「$filename」のファイルパス部分をURL(example.com)に置き換えています。
  • 「fwrite」でRSSに各ページの情報を書き出します。foreachで全てのページについて作業をするように指示を出していますので、新しいページから順番にRSSに書き込まれていきます

PHPをHTMLから動かせるようにする

お疲れさまでした!上記でRSS Version1.0のPHPの作成が完了しました。「createrss1.php」などのPHPファイルに内容をコピペして作成された方は、「createrss1.php」を開くと「rss1.xml」が自動的に作成されるはずです。

なお、PHPをローカル(自分のPC)で動かしたいときにはPHPのダウンロードや仮想サーバーが必要になります。

作成ページの設定

現在は「createrss1.php」を開くと何も書いていない白い画面が開くはずです。※もしエラー表示などがある場合にはPHPがうまく作成できていませんので、内容を確認してみてください。

白い画面のままでは作成できているのかよくわからないので、タイトルなどをつけておくといいかもしれません。下のサンプルでは「rss1.xml」のリンクをつけ、すぐに内容が確認できるようにしています。

<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE html><html>
<head></head>
<body>
<h1>RSS version1.0 の作成</h1>

<?php
$myurl = "https://example.com";
$mypath = dirname(__FILE__);
$myname = "サイトの名称";
$mydescription = "サイトの説明文";
$folders = array("ファイル名1","ファイル名2");

$files = array();
foreach($folders as $folder){
    array_push($files, glob("$mypath/$folder/*.html"));    
}
foreach($files as $file){
    foreach ($file as $value){
    $filepath[filemtime($value)][] = $value;
    }
}
krsort($filepath);

$fp = fopen("$mypath/rss1.xml", "w");
fwrite($fp, '<?xml version="1.0"?>
<rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns="http://purl.org/rss/1.0/">
<channel rdf:about="'
.$myurl.'/rss1.xml">
<title>'
.$myname.'</title>
<link>'
.$myurl.'</link>
<description>'
.$mydescription.'</description>
<items>
<rdf:Seq>'
."\n");

$i = 0;
foreach($filepath as $filename){
        $filename = str_replace($mypath, $myurl, $filename[0]);
        fwrite($fp, '<rdf:li resource="'.$filename.'" />'."\n");
        $i++;
        if($i >= 2){break;}
}

fwrite($fp , '</rdf:Seq>'."\n".'</items>'."\n".'</channel>'."\n");

foreach($filepath as $filename){
        require($filename[0]);
        $filename = str_replace($mypath, $myurl, $filename[0]);
        fwrite($fp, '<item rdf:about="'.$filename.'"><title>'.$articletitle.'</title><link>'.$filename.'</link></item>'."\n");
}

fwrite($fp, '</rdf:RDF>');
fclose($fp);
?>


<p><a href="/rss1.xml" target="_blank">rss1.xml</a>の作成が完了しました。</p>
</body></html>

作成したRSS 1.0を検証する

実際に作成したrss1.xmlは、当サイトのRSS version1.0のようになっていると思います。

ご自身のRSS version1.0がきちんと作成できているか知りたいときはFeed Validation Serviceで調べてみましょう。

作成したrss1.xmlのURLを入力して「validate」をクリックするとエラーの有無を教えてくれます。まだサーバーにアップロードしていない場合には「Validate by direct input」にRSS1.0の内容をコピペして確認することも可能です。

編集後記

この記事ではRSS version1.0をPHPで作成する方法を紹介しました。やり方が分かってしまえば意外と簡単に作成できますのでぜひ挑戦してみてください。この記事がサイトを自作されている動詞の方の一助に鳴れば幸いです。

記事をシェアする

亀の子に連絡

ランキング参加中!ぽちっとしてね

F2cランキングアイコン 人気ブログランキング ブログランキング・にほんブログ村へ

RELATED

サイトパーツ作成方法 ・サーチエンジン対策 ・PHPの小技集 

広告