更新日時と実際の日付

Webネタ・サイト更新

 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%>と表記すればよいです。

サクラキャンドル

 都内在住。理系高校理系大学を経て、電機関係の会社でリーマンやってます。
 仕事内容とサイトの内容はほとんど関係がなく、趣味の延長線上でいろいろと紹介します。

サクラキャンドルをフォローする
スポンサーリンク
農場主の日常

コメント

  1. ミシマ より:

    |=’)
    着々と・・・

  2. サクラキャンドル より:

     いや、見た目はほとんど変わらない上に、読みに来てる人にはつまんない記事ですんません。
     そういえばミシマさんはRSSとか扱ってるようで。xmlを使った技術とか詳しい?

  3. サクラキャンドル より:

    暫定的な対応ですが、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での関数の変更理由がまだ調べきれてないので、後日また修正するかもしれません。

  4. な! より:

    お世話になります。
    Nucleus ver3.21のときは問題なかったのですが、3.22-CR1にしたところ、以下のようなエラーが出ます。
    —– ここから —–
    <url>
    <loc>http://nakachi.org/item/408</loc&gt;

    <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です。

  5. サクラキャンドル より:

    こんにちは、いらっしゃいませ。
    3.22RC1のglobalfunctions.phpを見てみましたが、3.21とは大幅に変更されているようです。パラメータが1つ増えているのと、gmdate関数がdate関数に変更になっているなど。
    ご指摘のエラーは、このプラグインがformatDate関数を使う部分で、パラメータが4つ必要なのに3つしかないのでメッセージが出ているようです。
    修正ほうほうはもう少々お待ちください。

  6. な! より:

    報告が遅くなって申し訳ありませんでした。
    上記変更を加えたらエラーなく動作するようになりました。

  7. な! より:

    別の解を教えてもらいました。
    場所は
    http://www.higuchi.com/item
    です。
    NP_UpdateTimeのformatDate()を呼び込むところで、第4パラメータとして $this->blog を加えるだけでエラーがなくなりました。
    ご報告まで。

  8. サクラキャンドル より:

     確かに第4パラメータを追加するとエラーは出なくなるのですが、この方法だと3.21以前のNucleusだとエラーが出そうなんですよねえ。
     それと、出力Formatが変わっている関係で、UTCで出力した時間にずれが出るかも知れない点も。
     時間にかんしては3.22の方が正しそうなので、そちらを参考に修正するのが良いのだろうとは考えています。

  9. な! より:

    あー、なるほど。
    3.21と3.22の互換性を保つためにわざわざNP_UpdateTimeの中でformatDate()を定義したわけですね。
    しかし、今後もNucleusのバージョンアップは続くし、今回のような大幅な変更もあるでしょうから、過去のバージョンとの互換性を維持していくのはかなりたいへんですね。

タイトルとURLをコピーしました