はじめに
以下の質問に回答します。
Cocoonには、このような機能が既に搭載されています。
そこで、同様の機能を、他のテーマでも実装できるようにします。
この記事では、この方法について説明します。
完成イメージ

実装手順
以下のコードをfunctions.phpに追加します。
// メタボックスを追加
add_action('add_meta_boxes', function () {
add_meta_box(
'modified_date_control',
'更新日の設定',
'render_modified_date_control',
['post', 'page'],
'side',
'default'
);
});
/**
* メタボックスの入力フォームを出力
*
* @param WP_Post $post 投稿オブジェクト
* @return void
*/
if (!function_exists('render_modified_date_control')):
function render_modified_date_control($post) {
// 設定を取得
$value = get_post_meta($post->ID, 'my_modified_date_option', true);
if ($value === '') {
$value = 'update';
}
// nonceフィールドを出力
wp_nonce_field('modified_date_action', 'modified_date_nonce');
?>
<label><input type="radio" name="modified_date_option" value="update" <?php checked($value, 'update'); ?> /> 更新(現在の日時)</label><br>
<label><input type="radio" name="modified_date_option" value="keep" <?php checked($value, 'keep'); ?> /> 更新しない</label><br>
<label><input type="radio" name="modified_date_option" value="reset" <?php checked($value, 'reset'); ?> /> 更新日の消去</label>
<?php
}
endif;
/**
* 更新日の設定を保存
*
* @param int $post_id 投稿ID
* @return void
*/
if (!function_exists('save_modified_date_option')):
function save_modified_date_option($post_id) {
global $wpdb;
// nonceチェック
if (!isset($_POST['modified_date_nonce']) || !wp_verify_nonce($_POST['modified_date_nonce'], 'modified_date_action')) {
return;
}
// 自動保存チェック
if (defined('DOING_AUTOSAVE') && DOING_AUTOSAVE) {
return;
}
// リビジョンは除外
if (wp_is_post_revision($post_id)) {
return;
}
// 権限チェック
if (!current_user_can('edit_post', $post_id)) {
return;
}
// オプション値を取得
$option = $_POST['modified_date_option'] ?? 'update';
// オプション値を保存
update_post_meta($post_id, 'my_modified_date_option', $option);
// 一時的にアクションを削除
remove_action('save_post', 'save_modified_date_option');
$post = get_post($post_id);
switch ($option) {
case 'keep':
// 更新日時を保持
$original_modified = get_post_field('post_modified', $post_id);
$original_modified_gmt = get_post_field('post_modified_gmt', $post_id);
$wpdb->update(
$wpdb->posts,
[
'post_modified' => $original_modified,
'post_modified_gmt' => $original_modified_gmt,
],
['ID' => $post_id]
);
break;
case 'reset':
// 更新日時を投稿日へ変更
$post_date = get_post_field('post_date', $post_id);
$post_date_gmt = get_post_field('post_date_gmt', $post_id);
$wpdb->update(
$wpdb->posts,
[
'post_modified' => $post_date,
'post_modified_gmt' => $post_date_gmt,
],
['ID' => $post_id]
);
break;
}
// フックを再登録
add_action('save_post', 'save_modified_date_option', 20);
}
endif;
// 投稿データを保存
add_action('save_post', 'save_modified_date_option', 20);
注意点
投稿の保存時に「更新日コントロール」機能(更新・更新しない・更新日の消去)を選択した際、投稿日(post_date)と更新日(post_modified)がどのように変化するかを表1にまとめました。
| # | 操作・ステップ | 投稿日 (post_date) | 更新日 (post_modified) | 動作の解説・仕様 |
|---|---|---|---|---|
| 1 | 過去の日付で投稿・保存 | 2025年01月01日 | 2026年08月22日 (今日) | 新規作成・保存した時点の現在時刻が更新日として記録される。 |
| 2 | そのまま「更新しない」で編集・保存 | 2025年01月01日 | 2026年08月22日 (今日) | 直前の更新日時(今日)をそのまま維持する。 |
| 3 | 「更新日を消去」で保存 | 2025年01月01日 | 2025年01月01日 (投稿日と同じ) | 更新日が消去され、投稿日となる。 |
| 4 | その状態から「更新しない」で編集・保存 | 2025年01月01日 | 2026年08月22日 (今日)に戻る | 1で更新日を維持しているため、「今日」の日時に戻る。 |
さいごに
今回紹介した方法を使えば、投稿の更新日時を柔軟にコントロールできるようになります。
Cocoonのように「更新」「そのまま」「消去」といった選択肢を他テーマにも導入できるので、日付の管理が重要なブログやメディア運営に役立ちます。


