GeneratePressで記事の更新日を表示する

当サイトでは、記事の投稿日を表示しており、また後日に更新した場合には更新日も併せて表示するようにしています。

これは以下のコードをfunctions.phpに入れることで実現しているのですが、その前に、GeneratePressのデフォルトの挙動を確認しておきましょう。

デフォルトの投稿日表示コード

投稿日について、デフォルトでは以下のようなコードが出力されます。posted-onというクラスの付いたspan要素に、更新日データ、投稿日データの順で出力されています。そのうえで、cssで更新日データは消されています。

<span class="posted-on"><time class="updated" datetime="2025-10-29T10:25:00+09:00" itemprop="dateModified">2025年10月29日</time><time class="entry-date published" datetime="2025-10-29T07:45:19+09:00" itemprop="datePublished">2025年10月29日</time></span>

普通、こういう凝ったことはしないと思うのですが、こういう細かな気遣いにGeneratePressの奥深さが垣間見えます。

当サイトでの運用

当サイトでは、まず投稿日を表示し、別の日に更新を行った場合のみに、かっこ書きで更新日を表示するようにしています。公開後に誤字脱字などのちょっとした修正を行うことはよくあることですので、同じ日の更新については表示をしていません。

これを実現するために、元の出力コードを重視してCSSやJavaScriptでごにょごにょしてみたのですが、スッキリとした実装になりませんでしたので、普通にPHPで変更を行っています。

具体的なコードは以下です。

// 投稿日の表示形式をカスタマイズ (公開日 [更新日])
add_filter( 'generate_post_date_output', function( $output ) {
    // 日付フォーマットを設定
    $date_format   = 'Y年n月j日';
    // 公開日と更新日を指定フォーマットで取得
    $published     = get_the_date( $date_format );
    $modified      = get_the_modified_date( $date_format );
    // ISO 8601 形式の日付を取得 (構造化データ用)
    $published_iso = get_the_date( 'c' );
    $modified_iso  = get_the_modified_date( 'c' );
    // まず公開日のHTML (<time>タグ) を生成
    $html = sprintf(
        '<time class="entry-date published" datetime="%s" itemprop="datePublished">%s</time>',
        esc_attr( $published_iso ), // datetime属性用にエスケープ
        esc_html( $published )      // 表示テキスト用にエスケープ
    );
    // 公開日と更新日の日付文字列が異なる場合のみ、更新日のHTMLを追加
    if ( $published !== $modified ) {
        $html .= sprintf(
            ' <time class="updated" datetime="%s" itemprop="dateModified">(%s更新)</time>',
            esc_attr( $modified_iso ),
            esc_html( $modified )
        );
    }
    // 全体を <span class="posted-on"> で囲んで返す
    return sprintf( '<span class="posted-on">%s</span>', $html );
} );