WordPressで外部ブログのRSSを表示したら日付が1日ずれちゃう。タイムゾーンの問題?
さてさて、先日から外部ブログのRSS情報を画像付きで表示するためにあれこれやっていますが、割と簡単にできた~!と思ったら落とし穴がありました。なぜか日付が1日ずれちゃうのです。
RSS情報に表示されている日付から1日ずれる
左下のスクリーンショットが外部ブログ、右下のスクリーンショットがRSSを拾って表示しているブログの方です。
外部ブログの方、「2014/09/12 Fri」と表示されておりRSS情報を確認してもちゃんとこの日付で表示されています。ところが、自ブログの方で表示しようとすると、日付が1日戻ってしまいます。
ピーンと来たのは「タイムゾーン」です。調べてみると、WordPress内の関数、基本的にはGMT(グリニッジ標準時)だそうで、これがそのまま表示されているようです。
というわけでタイムゾーンのためにいろいろと関数を試してみた!
まず、昨日のソースコードですが、日時取得を取得して表示しているところは、以下のソースコードになっています。
<?php echo $item->get_date( 'Y-m-d D' ); ?>
$itemにRSSの1件ずつの情報が入っており、そこからdate情報を「年-月-日 曜日(英語3文字)」でフォーマットして表示するようにしています。この結果が上記のスクリーンショットになります。どうもこのタイムゾーンが絡む日付関係、あまり情報がありません。というわけで、片っ端からあれこれ試してみます。
get_date_from_gmt()はどうかな?
まず最初に見つけたのが、「get_date_from_gmt()」という関数です。これは、「Y-m-d H:i:s」という書式で与えられたGMTを、WordPressに設定された時差で修正して出力してくれるとのこと。
Function Reference/get date from gmt « WordPress Codex
gmt_offset …
というわけで、こんなコードを書いてみました。
<?php echo get_date_from_gmt( $item->get_date( 'Y-m-d H:i:s' )); ?>
結果、時差は吸収してくれました。でも時間まで表示されています。「date」なのに時間まで表示しないでください…と言いたいのですが、なかなかそうも行かず。また、日時表示書式はWordPressに設定された書式になりました。
無理やり文字列を切って日付表示のみに使用かとも思ったのですが、あまりスマートじゃないのでまずは調査を進めることにしました。
date_i18n()を使ってみる!
さらに探してみると「date_i18n()」という関数にたどり着きました。これは「ローカライズされた書式で日付を取得する」関数とのことで、どうも今回の目的にぴったりっぽいです!なんで最初にこの情報にた取りつかなかったんでしょう?タイムゾーンって、案外、皆さん問題にならないのかな?
関数リファレンス/date i18n – WordPress Codex 日本語版
ローカライズされた書式で日付を取得する。 …
というわけで書いてみたコードはこんな感じです。まずはサンプルに従って、WordPressから日付書式を取得してみました。
<?php echo date_i18n(get_option('date_format'), strtotime(get_date_from_gmt( $item->get_date( 'Y-m-d H:i:s' )))); ?>
時差は無事吸収された模様です。
date_i18n()で曜日を指定したら漢字に。やな感じ。
お、これはいい展開!と思い、今度は「get_option(‘date_format’)」でWordPressに設定されている日付書式を取得しているところを、今回使用したい書式に変更してみました。
<?php echo date_i18n( 'Y.m.d D', strtotime(get_date_from_gmt( $item->get_date( 'Y-m-d H:i:s' )))); ?>
結果は…曜日が漢字になってしまいました
変だな~。「D」という書式オプションは「D 3文字のテキスト形式。 Mon から Sun」という意味です。
日付と時刻の書式 – WordPress Codex 日本語版
D 3文字のテキスト形式。 Mon から Sun …
そういえば、以前、「WordPress Popular Post」というプラグインを、サイドバーにウィジェットとしてではなくPHPコードから呼び出す方式にした時に、同じことで悩んだ記憶があります。不思議です。
じゃあ普通にdate()を使ったら?
だんだん話が複雑になってきましたが、それじゃあ、ということで試しに(根拠は全然ありません)「date_i18l()」をやめて「date()」を使ったらどうなるの?と当てずっぽうでやってみました。
<?php echo date( 'Y.m.d D', strtotime(get_date_from_gmt( $item->get_date( 'Y-m-d H:i:s' )))); ?>
気になる表示結果は…
あれ、できちゃいました。ばっちり、曜日も英語の3文字表示になっています。ふむふむ、このコードを入れればGushの「NEWエントリー」と同じ表示ができることがわかりました。
うーん、なんか長い道のりだったなぁ。ローカライズとかタイムゾーンの情報って意外に少なくて…。検索のキーワードが悪かったのかもしれませんが、ちょっと時間がかかっちゃいました。
SiSO-LAB風にするとこんな感じ
というわけで、気を良くして、外部ブログのRSS表示イメージをSiSO-LAB風にしてみました。昨日のGushに合わせたソースコードと比較すると、デザイン変更の参考になるのではないかな?と思います。
<?php
include_once(ABSPATH . WPINC . '/feed.php');
$rss = fetch_feed('http://localhost/?feed');
if (!is_wp_error( $rss ) ) :
$maxitems = $rss->get_item_quantity(5);
$rss_items = $rss->get_items(0, $maxitems);
endif;
?>
<?php if ($maxitems == 0) echo '
<li>記事が見つかりません。</li>';
else
foreach ( $rss_items as $item ) : ?>
<?php
$first_img = '';
if ( preg_match( '/<img.+?src=[\'"]([^\'"]+?)[\'"].*?>/msi', $item->get_content(), $matches ) ) {
$first_img = $matches[1];
}
?>
<div class="side_new">
<div class="side_thumb">
<a href='<?php echo $item->get_permalink(); ?>'>
<?php if ( !empty( $first_img ) ) : ?><img src="<?php echo esc_attr( $first_img ); ?>" alt="" style="width:90px;height:auto;">
<?php else: ?>
<img src="<?php echo get_template_directory_uri(); ?>/images/no-img.png" alt="no image" title="no image" width="90" height="90" />
<?php endif; ?>
</a></div>
<div class="side_title">
<a href='<?php echo $item->get_permalink(); ?>'><?php echo $item->get_title(); ?></a>posted on <?php echo date_i18n(get_option('date_format'), strtotime(get_date_from_gmt( $item->get_date( 'Y-m-d H:i:s' )))); ?></div>
</div>
<?php endforeach; ?>
実行結果はこんな感じです。左が現在のSiSO-LABでの新着記事表示で、右が今回の実行結果になります。
ん?
σ(´^`)
あれ?SiSO-LABのデザインに合わせこむだけなら「曜日表示」は不要でした。あと、「y.m.d」に直すのを忘れているとか…。
SiSO-LABのサイドバーでは、Gushの「Newエントリー」表示から、さらに「WordPress Popular Posts」の表示の雰囲気に合うように調整してあります。
なんでGushのデザインと変えてあるかと言いますと…実は以前、「WordPress Popular Posts」で表示される人気記事の書式をあれこれいじってみたんですが、どうにも「posted」が消せなかったりとかいろいろあり、現在のデザインに落ち着いた記憶があります。
というわけで、新サイトが立ち上げ後、SiSO-LABの方からも更新情報を表示する準備はバッチリです。本当は、ニュースのトップサイトみたいに、SiSO-LABのRSS情報に混ぜて流せるといいんですけど、もう少し勉強が必要そうです。rss.phpを改造しないとダメかな?
今日の一言二言三言
今日もまた いろいろ知識が 身について
知恵になったと 喜ぶ明け方
いや、まあ、あんまりハマりたくはないのですが、ハマったらハマったで情報収集に気合が入って、それはそれで楽しいものです。実はもう1つハマっていたんです。そんなわけで新ブログ立ち上げが遅れ中です。
まあ、その代わりに、ただの情報が経験値に変わっていくんだから、いっかな。
WordPressで画像付きRSSを出して別ブログで更新情報を表示!
複数のブログを運用していると、お互いのブログで更新情報を表示したくなります。本当はWordPressのネットーワーク機能(マルチサイト)を使えばスマートにできる予感がするのですが、まだまだスキルが足りないので、画像付きのRSSを出力するようにして、別ブログに新着情報として表示できるように頑張ってみました。 |
Your Message