プラグインなしでWordPressバージョンに非対応で長期未更新のプラグインを赤色で強調表示する方法

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

はじめに

WordPressサイトを長期間運用していると、気づかないうちに一部のプラグインが更新停止状態になっていることがあります。
特に、現在使用しているWordPressのバージョンに対応していない、かつ数ヶ月も更新がないプラグインを放置することは、セキュリティやサイトの動作安定性の面で大きなリスクを伴います。

そこでプラグイン「Plugin Report」などを使用せずに、こうした「危険な状態のプラグイン」を一目で判別できるよう、管理画面のプラグイン一覧で名前を赤色に強調表示します。

この記事では、この方法について説明します。

完成イメージ

実装手順

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

/**
 * バージョン文字列からメジャー・マイナー部分を取得
 *
 * @param string $version バージョン文字列(例:6.5.3、6.0)
 * @return string メジャー・マイナー形式のバージョン文字列(例:6.5、6.0)
 */
if (!function_exists('wppc_get_major_minor_version')):
function wppc_get_major_minor_version($version) {
  $parts = explode('.', $version);

  return $parts[0] . '.' . ($parts[1] ?? '0');
}
endif;


// プラグイン一覧に追加
add_action('admin_head-plugins.php', function () {
  // 判定基準となる「月数」を設定
  $months_threshold = 6;
  $highlight_files = [];

  // プラグインの有効化権限があるユーザーのみ対象
  if (!current_user_can('activate_plugins')) {
    return;
  }

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

  // WordPress本体のバージョンを取得
  global $wp_version;

  // 現在のWordPressバージョンをメジャー・マイナー形式に変換
  $current_major_minor = wppc_get_major_minor_version($wp_version);

  // インストール済みの全プラグインを取得
  $all_plugins = get_plugins();

  // 各プラグインを確認
  foreach ($all_plugins as $plugin_file => $plugin_data) {
    // プラグインスラッグを取得
    $slug = dirname($plugin_file);
    if ($slug === '.') {
      $slug = basename($plugin_file, '.php');
    }

    // キャッシュデータを取得
    $cache_key = 'wppc_info_' . md5($slug);
    $response = get_transient($cache_key);

    // キャッシュがない場合は外部APIからデータを取得
    if ($response === false) {
      // plugins_apiの引数をオブジェクト(stdClass)で用意
      $api_args = new stdClass();
      $api_args->slug = $slug;
      $api_args->fields = [
        'tested'       => true,
        'last_updated' => true,
      ];

      // APIからプラグイン情報を取得
      $response = plugins_api('plugin_information', $api_args);

      // キャッシュデータを保存
      set_transient($cache_key, $response, DAY_IN_SECONDS);
    }

    // 公式リポジトリに存在しないプラグインを対象
    if (is_wp_error($response)) {
      $highlight_files[] = $plugin_file;
      continue;
    }

    // 動作確認済みバージョンがない場合は処理対象外
    if (empty($response->tested)) {
      continue;
    }

    // 動作確認済みバージョンをメジャー・マイナー形式に変換
    $tested_major_minor = wppc_get_major_minor_version($response->tested);

    // 現在のWPバージョンに対応しているかどうか判定
    $is_compatible = version_compare($tested_major_minor, $current_major_minor, '>=');

    // 現在のWordPressバージョンに非対応の場合
    if (!$is_compatible) {
      // 最終更新日時をタイムスタンプに変換
      $last_updated_time = !empty($response->last_updated) ? strtotime($response->last_updated) : false;

      // 判定基準となる更新日時を設定
      if ($last_updated_time) {
        $threshold_time = strtotime("-{$months_threshold} months");

        if ($last_updated_time < $threshold_time) {
          $highlight_files[] = $plugin_file;
        }
      }
    }
  }

  // 該当プラグインがない場合は処理を終了
  if (empty($highlight_files)) {
    return;
  }

  $css_rules = '';
  foreach ($highlight_files as $plugin_file) {
    $css_rules .= sprintf(
      'tr[data-plugin="%s"] .plugin-title strong { color: #d63638 !important; }',
      esc_attr($plugin_file)
    );
  }

  echo '<style>' . $css_rules . '</style>';
});

さいごに

今回紹介した方法を使えば、プラグインを無駄に増やすことなく、サイト内の潜在的なリスクをスマートに可視化できるようになります。

特に多くのWordPressサイトを保守・管理しているエンジニアやコーダーにとって、どのプラグインが寿命を迎えているか、あるいは公式から削除されているかを一目で判断できるこの仕組みは、日々のメンテナンス効率を劇的に高めてくれるはずです。
安全なサイト運用のために、ぜひあなたの環境でも役立ててみてください。

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