人間感覚で〇年前、〇ヶ月前といった相対的な経過時間を表現するWordPressショートコードの実装方法

〇年前、〇ヶ月前を計算して表記

僕は、当ブログの記事等で、以下のような表現を使うことがあります。

エックスサーバーは、21年前にサービス提供が開始されました。

mixhostは、8年前にサービス提供が開始されました。

カラフルボックスは、6年前にサービス提供が開始されました。

上記のように、〇年前、〇ヶ月前、○週間前、○日前と記事に書いてしまうと、ブログ運営上で面倒な部分が出てきます。

それは月日が経つにつれ、表記の差が出てきて1年前、2年前、3年前と記事を修正する必要が出てくるからです。

「時間が経過するごとに記事を修正する」という作業は実際かなり面倒くさいです。

ならば、こう書けばいいじゃないかと思われるかもしれません。

エックスサーバーは、2003年7月にサービス提供が開始されました。

mixhostは、2016年6月22日にサービス提供が開始されました。

カラフルボックスは、2018年7月26日にサービス提供が開始されました。

もちろんこれでもいいんです。

けれどこれだと、人間感覚的に一拍考えてしまうというか「いまいち、いつ頃だったか分かりづらい」という難点があります。

人間の会話でも、

あれは16年前だったかなぁ…、あの時…

というのはよくあっても、

あれは2008年のことだった。あの時…

と言いづらいのと似た感覚というか。

なので記事で相対時間を書くとき、僕の中では「〇年前という表記が分かりやすくて使いたいんだけど、後の記事修正が面倒なんだよなぁ…」という葛藤がありました。

それを解消する手段として、「WordPressのショートコードを利用してサーバー側で計算させればいいじゃん!」と思いついたので実装してみました。

ちなみに、冒頭の例文は以下のように表記しており、年月が経っても記事は自動的に修正されるようになっています。

エックスサーバーは、21年前にサービス提供が開始されました。

mixhostは、8年前にサービス提供が開始されました。

カラフルボックスは、6年前にサービス提供が開始されました。
スポンサーリンク
レクタングル(大)広告

カスタマイズ方法

カスタマイズ方法は、かなり簡単です。

以下のコードをテーマ(子テーマ)のfunctions.phpに貼り付けるだけです。

//人間感覚的な時間取得
if ( !function_exists( 'get_human_time_diff_advance' ) ):
function get_human_time_diff_advance( $from, $to = '' ) {
  if ( empty($to) )
      $to = time();
  $diff = (int) abs($to - $from);
  // 条件: 3600秒 = 1時間以下なら (元のまま)
  if ($diff <= 3600) {
      $mins = floor($diff / 60);
      if ($mins <= 1) {
          $mins = 1;
      }
      $since = sprintf(_n('%s min', '%s mins', $mins), $mins);
  }
  // 条件: 86400秒 = 24時間以下かつ、3600秒 = 1時間以上なら (元のまま)
  else if (($diff <= 86400) && ($diff > 3600)) {
      $hours = floor($diff / 3600);
      if ($hours <= 1) {
          $hours = 1;
      }
      $since = sprintf(_n('%s hour', '%s hours', $hours), $hours);
  }
  // 条件: 604800秒 = 7日以下かつ、86400秒 = 24時間以上なら (条件追加)
  elseif (($diff <= 604800) && ($diff > 86400)) {
      $days = floor($diff / 86400);
      if ($days <= 1) {
          $days = 1;
      }
      $since = sprintf(_n('%s day', '%s days', $days), $days);
  }
  // 条件: 2678400秒 = 31日以下かつ、2678400秒 = 7日以上なら (条件追加)
  elseif (($diff <= 2678400) && ($diff > 604800) ) {
      $weeks = floor($diff / 604800);
      if ($weeks <= 1) {
          $weeks = 1;
      }
      $since = sprintf(_n('%s週間', '%s週間', $weeks), $weeks);
  }
  // 条件: 31536000秒 = 365日以下かつ、2678400秒 = 31日以上なら (条件追加)
  elseif (($diff <= 31536000) && ($diff > 2678400) ) {
      $months = floor($diff / 2678400);
      if ($months <= 1) {
          $months = 1;
      }
      $since = sprintf(_n('%sヶ月', '%sヶ月', $months), $months);
  }
  // 条件: 31536000秒 = 365日以上なら (条件追加)
  elseif ($diff >= 31536000) {
    $years = floor($diff / 31536000);
    $months = floor(($diff % 31536000) / 2678400);
    if ($years <= 1) {
        $years = 1;
    }
    //3年以上経っている場合は年だけでOK
    if (($months == 0) || ($years >= 3)) {
      $since = sprintf(__('%s年', sprintf), $years);
    } else {
      $since = sprintf(__('%s年%sヶ月', THEME_NAME), $years, $months);
    }
  }
  return $since;
}
endif;

//相対的な時間経過を取得するショートコード
add_shortcode('ago', 'ago_shortcode');
if ( !function_exists( 'ago_shortcode' ) ):
function ago_shortcode( $atts ){
  extract( shortcode_atts( array(
    'from' => null,
  ), $atts ) );
  //入力エラー出力
  if (!$from) {
    return '<span class="ago-error">日付未入力</span>';
  }
  $from = strtotime($from);
  return get_human_time_diff_advance($from);
}
endif;

上記のget_human_time_diff_advance関数は、以下のページを参考に改良させていただきました。

参考 相対的な経過時間を表示する WordPress 関数 human_time_diff() // understandard

あくまで人間感覚的な数字なので、正確な相対日時を表示するのには向きません。
年数に関しては、3年までは○ヶ月付きで出力するようにしました。3年より後は「何ヶ月とかはあまり気にしないかな」と思い、年数のみとしました。ここらへんは、個人の好みで変更してください。僕は3年にするか5年にするか迷いましたが、とりあえず3年にしました。

動作確認

以下では実際に動作させるための例文と動作状態です。

例文

以下の例文から、ある程度使い方は推測できるかと思います。

あなたは[ago from="2011/11/07"]間、毎日ブログを書き続けた。

ちょうど[ago from="1993-01-21"]前、この道を通った夜。昨日の事のように今はっきりと思い出す。

日本で気象観測が始まってから、[ago from="1883.3.1"]が経つ。

息子がアメリカに移住してから、もう[ago from="20000101"]にもなる。

[ago from="10 September 1995"]前のあの日に事件の真相がある。

岐阜県不破郡関ケ原町で、[ago from="1600/10/21"]前に天下分け目の決戦が開かれた。

今年は、西郷隆盛生誕[ago from="18280123"]、没後[ago from="18770924"]になる。

寝ログを運営しだしてから、もう[ago from="2014-01-01"]になる。

この記事は、[ago from="20180914"]前に書かれました。

よく利用される日付のフォーマットとしては、こんな感じでしょうか。

個人的には「20180914」形式が入力しやすいです。分かりやすさで言えば、「2018/09/14」とかになるかも。

表示例

実際の表示例がこちらになります。

  • あなたは13年間、毎日ブログを書き続けた。
  • ちょうど31年前、この道を通った夜。昨日の事のように今はっきりと思い出す。
  • 日本で気象観測が始まってから、141年が経つ。
  • 息子がアメリカに移住してから、もう24年にもなる。
  • 29年前のあの日に事件の真相がある。
  • 岐阜県不破郡関ケ原町で、424年前に天下分け目の決戦が開かれた。
  • 今年は、西郷隆盛生誕196年、没後147年になる。
  • 寝ログを運営しだしてから、もう10年になる。
  • この記事は、6年前に書かれました。

こんな感じで、計算後の相対時間が表示されます。

まとめ

こんな感じで、実際の日付を書くよりも、多少なりとも読み手に分かりやすい文章を作るために利用できるかと思います。

やっぱり、「2007年」と書くのと、「17年前」と書くのでは、読み手の受け取り方も全然違ってきます。

どちらの表記方法が優れているとかではなくて、「文章の内容に沿って効果的に双方使えれば」ということで機能を作成してみました。

記事を書いていて、

時間経過の相対表記は記事修正が面倒なんだよね…

西暦日付表示は分かりづらいんだよなぁ…

と思ったことがある人は、使うと多少は便利になるかもしれません。