農場主の日常

なんちゃってエンジニアの日常をつらづらと

更新日時と実際の日付

 Blogで日記サイトをやっていると、その日に書かないと実際の日付と投稿日時がずれるので今ひとつ。
 うちのサイトもたいてい次の日の朝更新されるので、日付は1日ずれてしまいます。

 ある程度は記事に「最終更新:」というものを出力して、それで代用してるんですけどね。

 さて、Google Sitemapsに登録する場合、最終更新日時を書くことができるのですが、それが記事の日付だとちと具合が悪かったり。
 というわけで、うちで「最終更新:」を表示しているプラグイン、NP_UpdateTimeを改造しました。

 Google sitemaps用のXmlファイルの中では、<lastmod>にて更新日時を登録できます。

Google Sitemapなら…これをベースにされるといいんじゃないでしょうか?
hsurさんのGoogle Sitemaps 対応 Nucleus Skin
http://blog.cles.jp/item/889
 Nucleus日本語フォーラムで紹介いただいたこちらのサイトでは、Nucleusの<%date()%>テンプレート変数で出力されますが、私のサイトではアイテムの日時=更新日でないことも多いので、NP_UpdateTimeでlastmodを出力できるように改造します。

<%UpdateTime%>と<%date%>の使い分け方法
http://japan.nucleuscms.org/bb/viewtopic.php?t=893

 こちらのNucleus日本語フォーラムのjunさんの記事を参考に、<%date%>のitemの時間と<%UpdateTime%>の更新日時を比較し、新しいほうの時間を指定したフォーマットで出力させます。
 NP_UpdateTimeの107行付近、doTemplateVar(&$item)を以下のコードに置き換えます。
function doTemplateVar(&$item,$forMaps){
if($forMaps == ''){
$query = 'SELECT r.up_id, UNIX_TIMESTAMP(r.updatetime) as updatetime, UNIX_TIMESTAMP(i.itime) as itemtime FROM '.sql_table('plugin_rectime') . ' as r, '.sql_table('item') .' as i WHERE r.up_id='.$item->itemid.' and r.up_id=i.inumber';
$res = sql_query($query);
if($row = mysql_fetch_assoc($res)){
$data['utime'] = date($this->getOption('DateFormat'),$row['updatetime']);
if($row['updatetime'] > $row['itemtime']){
echo TEMPLATE::fill($this->getOption('AfterTime'),$data);;
}elseif($row['updatetime'] < $row['itemtime']){
echo TEMPLATE::fill($this->getOption('BeforeTime'),$data);;
}
}
}else{ // add
$query = 'SELECT r.up_id, UNIX_TIMESTAMP(r.updatetime) as updatetime, UNIX_TIMESTAMP(i.itime) as itemtime, i.inumber FROM '.sql_table('item') . ' as i left join '.sql_table('plugin_rectime') .' as r on r.up_id=i.inumber WHERE i.inumber='.$item->itemid;
$res = sql_query($query);
if($row = mysql_fetch_assoc($res)){
$data['utime'] = date($this->getOption('DateFormat'),$row['updatetime']);
$up_id = quickQuery('SELECT up_id as result FROM '.sql_table('plugin_rectime').' WHERE up_id = '.$row['inumber']);
if(!$up_id){
echo formatDate($forMaps, $row['itemtime'],$this->getOption('DateFormat'));
} elseif($row['updatetime'] > $row['itemtime']){
echo formatDate($forMaps, $row['updatetime'],$this->getOption('DateFormat'));
} else {
echo formatDate($forMaps, $row['itemtime'],$this->getOption('DateFormat'));
}
}
} // add end
}

 この変更後、テンプレートに
<lastmod><%UpdateTime(utc)%></lastmod>
 のように表記すると、更新日時がUTCフォーマットで出力されます。

 指定可能なフォーマットは、rfc822,rfc822GMT,utc,iso8601です。
 通常のNP_UpdateTimeの出力を行う場合には、これまでどおり<%UpdateTime%>と表記すればよいです。


関連記事[更新日時

前後の記事 - [Nucleus]::タイトル一覧

コメント


ミシマ wrote:
|=')
着々と・・・
05/09/09 10:03:02
 いや、見た目はほとんど変わらない上に、読みに来てる人にはつまんない記事ですんません。

 そういえばミシマさんはRSSとか扱ってるようで。xmlを使った技術とか詳しい?
05/09/10 08:29:43
な! wrote:
お世話になります。

Nucleus ver3.21のときは問題なかったのですが、3.22-CR1にしたところ、以下のようなエラーが出ます。
----- ここから -----
<url>
<loc>http://nakachi.org/item/408</loc>
-
<lastmod>
<br/>
<b>Warning</b>
: Missing argument 4 for formatdate() in
-
<b>
/***/public_html/nucleus/libs/globalfunctions.php
</b>
on line
<b>1133</b>
<br/>

2005-11-17T12:44:48Z
</lastmod>
</url>
----- ここまで -----
date(utc)を使うと問題ありません。
Nucleusのバージョンアップに伴う不具合でしょうか。

サーバはXREA.COMを利用していて、phpはセーフモード、php4.4.2-devです。
05/11/19 07:31:51
こんにちは、いらっしゃいませ。
3.22RC1のglobalfunctions.phpを見てみましたが、3.21とは大幅に変更されているようです。パラメータが1つ増えているのと、gmdate関数がdate関数に変更になっているなど。
ご指摘のエラーは、このプラグインがformatDate関数を使う部分で、パラメータが4つ必要なのに3つしかないのでメッセージが出ているようです。
修正ほうほうはもう少々お待ちください。
05/11/19 10:24:54
暫定的な対応ですが、NP_UPDateTimeの修正部分にある
formatDate

$this->formatDate
に変更し、
} // add end
}
のあとに、以下のコードを追加してみてください。
function formatDate($format, $timestamp, $defaultFormat) {
if ($format == 'rfc822') {
return date('r', $timestamp);
} else if ($format == 'rfc822GMT') {
return gmdate('r', $timestamp);
} else if ($format == 'utc') {
return gmdate('Y-m-d\TH:i:s\Z', $timestamp);
} else if ($format == 'iso8601') {
$tz = date('O', $timestamp);
$tz = substr($tz, 0, 3) . ':' . substr($tz, 3, 2);
return gmdate('Y-m-d\TH:i:s', $timestamp) . $tz;
} else {
return strftime($format ? $format : $defaultFormat,$timestamp);
}

}
3.22RC1での関数の変更理由がまだ調べきれてないので、後日また修正するかもしれません。
05/11/19 12:49:24
な! wrote:
報告が遅くなって申し訳ありませんでした。
上記変更を加えたらエラーなく動作するようになりました。
05/12/02 10:53:49
な! wrote:
別の解を教えてもらいました。
場所は
http://www.higuchi.com/item...
です。

NP_UpdateTimeのformatDate()を呼び込むところで、第4パラメータとして $this->blog を加えるだけでエラーがなくなりました。
ご報告まで。
05/12/02 22:52:24
 確かに第4パラメータを追加するとエラーは出なくなるのですが、この方法だと3.21以前のNucleusだとエラーが出そうなんですよねえ。
 それと、出力Formatが変わっている関係で、UTCで出力した時間にずれが出るかも知れない点も。
 時間にかんしては3.22の方が正しそうなので、そちらを参考に修正するのが良いのだろうとは考えています。
05/12/03 08:42:58
な! wrote:
あー、なるほど。
3.21と3.22の互換性を保つためにわざわざNP_UpdateTimeの中でformatDate()を定義したわけですね。

しかし、今後もNucleusのバージョンアップは続くし、今回のような大幅な変更もあるでしょうから、過去のバージョンとの互換性を維持していくのはかなりたいへんですね。
05/12/03 19:28:53


コメントの追加


トラックバック

このエントリにトラックバックはありません
このトラックバックURLを使ってこの記事にトラックバックを送ることができます。

↑ PAGE TOP