投稿編集時に更新日を変更する機能を追加する方法

Cocoonカスタマイズ集
この記事は約6分で読めます。
記事内に広告が含まれています。

Cocoonには、標準機能として備わっています。

はじめに

以下の質問に回答します。

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のように「更新」「そのまま」「消去」といった選択肢を他テーマにも導入できるので、日付の管理が重要なブログやメディア運営に役立ちます。

タイトルとURLをコピーしました