投稿時間と現在時間の差を表示する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;
}