プラグインなしでWordPressプラグインの更新履歴と更新日時を一覧画面に表示する方法

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

はじめに

WordPressサイトを運用する上で、プラグインのアップデート履歴を把握しておくことは保守・トラブルシューティングの観点から非常に重要です。
しかし、標準の管理画面では「いつ、どのバージョンから何へ更新されたか」を一目で確認する機能が備わっていません。

以下の記事では、長期未更新のプラグインを赤色で強調表示して管理しやすくする方法を紹介しました。

完成イメージ

実装手順

以下のコードをfunctions.phpに追加します。

// プラグイン更新時にバージョンと日時を自動記録
add_action('upgrader_process_complete', function ($upgrader_object, $options) {
  // プラグイン更新以外の場合は処理対象外
  if (!isset($options['action'], $options['type']) || $options['action'] !== 'update' || $options['type'] !== 'plugin') {
    return;
  }

  // 既存のログデータを取得
  $logs = get_option('my_plugin_update_logs', []);
  $updated_plugins = [];

  // 更新対象のプラグイン一覧を取得
  if (isset($options['plugins'])) {
    $updated_plugins = $options['plugins'];
  } elseif (isset($options['plugin'])) {
    $updated_plugins = [$options['plugin']];
  }

  // get_plugin_data() に必要なファイルを読み込み
  if (!function_exists('get_plugin_data')) {
    require_once ABSPATH . 'wp-admin/includes/plugin.php';
  }

  // 更新された各プラグインを確認
  foreach ($updated_plugins as $plugin_file) {
    $full_path = WP_PLUGIN_DIR . '/' . $plugin_file;

    // プラグインファイルが存在しない場合は処理対象外
    if (!file_exists($full_path)) {
      continue;
    }

    // 更新後のプラグインバージョンを取得
    $plugin_data = get_plugin_data($full_path, false, false);
    $new_version = isset($plugin_data['Version']) ? $plugin_data['Version'] : '';

    // 更新前のバージョンを取得
    $old_version = isset($logs[$plugin_file]['current_version']) ? $logs[$plugin_file]['current_version'] : '不明';

    // バージョン変更履歴を設定
    if ($old_version === '不明' || $old_version !== $new_version) {
      $flow = ($old_version !== '不明' ? $old_version : '---') . ' → ' . $new_version;
    } else {
      $flow = $new_version;
    }

    // 更新情報をログに設定
    $logs[$plugin_file] = [
      'date'            => current_time('Y-m-d H:i:s'),
      'flow'            => $flow,
      'current_version' => $new_version,
    ];
  }

  // 更新ログを保存
  update_option('my_plugin_update_logs', $logs);
}, 10, 2);


// 管理画面一覧にカラムを追加
add_filter('manage_plugins_columns', function ($columns) {
  $columns['pl_tracker_flow'] = '更新履歴';
  $columns['pl_tracker_date'] = '更新日時';

  return $columns;
});


// 管理画面一覧のカラムにデータを表示
add_action('manage_plugins_custom_column', function ($column_name, $plugin_file, $plugin_data) {
  $logs = get_option('my_plugin_update_logs', []);

  switch ($column_name) {
    case 'pl_tracker_flow':
      // バージョン変更履歴を表示
      if (isset($logs[$plugin_file]['flow'])) {
        echo '<strong style="white-space: pre;">' . esc_html($logs[$plugin_file]['flow']) . '</strong>';
      } else {
        echo '<span style="white-space: pre;">記録なし</span>';
      }
      break;

    case 'pl_tracker_date':
      // 更新日時を表示
      if (isset($logs[$plugin_file]['date'])) {
        echo '<span style="white-space: pre;">' . esc_html($logs[$plugin_file]['date']) . '</span>';
      } else {
        echo '<span style="white-space: pre;">-</span>';
      }
      break;
  }
}, 10, 3);


// 更新履歴のクリア処理
add_action('admin_init', function () {
  if (!isset($_POST['pl_tracker_clear_logs'])) {
    return;
  }

  // nonceチェック
  if (!check_admin_referer('pl_tracker_nonce_action', 'pl_tracker_nonce_field')) {
    return;
  }

  // 権限チェック
  if (!current_user_can('manage_options')) {
    return;
  }

  // 更新履歴を削除
  delete_option('my_plugin_update_logs');

  // 通知を一時保存
  set_transient('my_admin_notice', [
    'type'    => 'success',
    'message' => '全てのプラグイン更新履歴をクリアしました。',
  ], 30);

  // プラグイン一覧へリダイレクト
  wp_safe_redirect(admin_url('plugins.php'));
  exit;
});


// 通知メッセージを出力
add_action('admin_notices', function () {
  if ($notice = get_transient('my_admin_notice')) {
    echo '<div class="notice notice-' . esc_attr($notice['type']) . ' is-dismissible"><p>' . esc_html($notice['message']) . '</p></div>';
    delete_transient('my_admin_notice');
  }

  // 更新履歴を取得
  $logs = get_option('my_plugin_update_logs', []);
  $count = is_array($logs) ? count($logs) : 0;

  ?>
  <div class="notice notice-info" style="padding: 10px 15px; margin-top: 15px; display: flex; align-items: center; justify-content: space-between;">
    <span>現在記録されている更新履歴:<?= esc_html($count); ?> 件</span>
    <?php if ($count > 0): ?>
      <form method="post" action="">
        <?php wp_nonce_field('pl_tracker_nonce_action', 'pl_tracker_nonce_field'); ?>
        <input type="submit" name="pl_tracker_clear_logs" class="button button-secondary" value="更新履歴をクリア" onclick="return confirm('本当に全ての更新履歴をクリアしますか?');">
      </form>
    <?php endif; ?>
  </div>
  <?php
});

さいごに

今回紹介した方法を使えば、WordPressのプラグイン一覧画面でバージョン推移と更新日時をひと目で確認できるようになります。
サイト管理の効率化やトラブル発生時の原因特定にも役立ちますので、ぜひ活用してみてください。

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