投稿時間と現在時間の差を表示する2つの方法
「◯分前の投稿」といった表示をWordPressでしたい時のメモです。
方法1.組み込み関数を使って表示する
echo human_time_diff( get_the_time("U"), current_time('timestamp') ) . __(' ago');
ほとんどのケースはこれで大丈夫です。
この場合、日本語だと例えば「1分前」と表示されて問題ないのですが、英語だと「1 day ago」と表示され「a day ago」と表示することができません。
「1 day ago」でも問題はないのですが、これが気になるという場合は、方法2の独自関数を作って対応するのが良いと思います。
方法2.独自関数で投稿時間と現在時間の差を表示する
本当は別に独自関数を作る必要はないのだけど、方法1.の関数を知らずに作ってしまったのでメモがてら残しておきます。
(本当は英語対応もhuman_time_diff()が1だったらaにするとかすればOKという話は置いておくとして)
注意点は、WordPressではPHPの組み込み関数のtime()が出力するのは常にUTCとなっているので、JSTと比べると9時間ずれてしまうというとこです。
これを回避するには、current_time()かdate_i18n()を使います。
function the_time_diff(){
global $post;
$seconds_ago = intval( current_time( 'timestamp' ) ) - intval( get_the_time( 'U', $post->ID ) );
$years_ago = intval( floor( $seconds_ago / ( 3600 * 24 * 30 * 365 ) ) );
$months_ago = intval( floor( $seconds_ago / ( 3600 * 24 * 30 ) ) );
$weeks_ago = intval( floor( $seconds_ago / ( 3600 * 24 * 7 ) ) );
$dates_ago = intval( floor( $seconds_ago / ( 3600 * 24 ) ) );
$hours_ago = intval( floor( ( $seconds_ago / 3600 ) % 24) );
$minutes_ago = intval( floor( ( $seconds_ago / 60 ) % 60 ) );
if ( $years_ago === 1 ) :
_e('a year ago');
elseif ( $years_ago > 1 ) :
echo "{$years_ago}".__(' years ago');
elseif ( $months_ago === 1 ) :
_e('a month ago');
elseif ( $months_ago > 1 ) :
echo "{$months_ago}".__(' months ago');
elseif ( $weeks_ago === 1 ) :
_e('a week ago');
elseif ( $weeks_ago > 1 ) :
echo "{$weeks_ago}".__(' weeks ago');
elseif ( $dates_ago === 1 ) :
_e('a day ago');
elseif ( $dates_ago > 1 ) :
echo "{$dates_ago}".__(' days ago');
elseif ( $hours_ago === 1 ) :
_e('an hour ago');
elseif ( $hours_ago > 1 ) :
echo "{$hours_ago}".__(' hours ago');
elseif ( $minutes_ago === 1 ) :
_e('a minute ago');
elseif ( $minutes_ago > 1 ) :
echo "{$minutes_ago}".__(' minutes ago');
elseif ( $seconds_ago === 1 ) :
_e("a second ago");
else :
echo "{$seconds_ago}".__(' seconds ago');
endif;
}