【WordPress】メディアライブラリの画像サイズを一括再生成する方法|Regenerate Thumbnailsなしで対応

【WordPress】メディアライブラリの画像サイズを一括再生成する方法|Regenerate Thumbnailsなしで対応 WordPress

WordPressでは、テーマの切り替えやカスタム画像サイズの追加によって、過去にアップロードされた画像が現在の仕様に合わない場合があります。こうしたときに必要になるのが「サムネイル画像サイズの再生成」です。

この記事では、プラグイン「Regenerate Thumbnails」を使わずに、PHPコードで画像サイズを一括再生成する方法を紹介します。

スポンサーリンク

なぜ画像サイズの再生成が必要なのか

WordPressでは画像をアップロードすると、登録された各サイズ(例:thumbnail、medium、large)で自動生成されます。しかし、テーマや設定の変更で新しいサイズを追加しても、すでにアップロード済みの画像には適用されません。そのため、古い画像にも新しいサイズを生成する必要があります。

一括再生成用のコード

以下のコードをテーマのfunctions.phpに追加することで、全画像のサイズを再生成する関数を用意します。

functions.php:一括再生成する関数の定義
function regenerate_all_thumbnails() {
  // wp_generate_attachment_metadata()はwp-admin/includes/image.phpに定義されており
  // 管理画面以外では自動読み込みされないため、明示的に読み込む
  require_once ABSPATH . 'wp-admin/includes/image.php';

  $args = array(
    'post_type'      => 'attachment',
    'post_mime_type' => 'image',
    'post_status'    => 'inherit',
    'posts_per_page' => -1,
  );

  $images = get_posts($args);
  $count = 0;

  foreach ($images as $image) {
    $fullsize_path = get_attached_file($image->ID);
    if (file_exists($fullsize_path)) {
      // wp_update_attachment_metadata()が既存メタデータを丸ごと上書きするため、
      // 事前に削除する処理は不要(存在しない関数の呼び出しを避ける)
      $metadata = wp_generate_attachment_metadata($image->ID, $fullsize_path);
      if (!empty($metadata)) {
        wp_update_attachment_metadata($image->ID, $metadata);
        $count++;
      }
    }
  }

  return $count;
}

安全に一度だけ実行する方法

initフックへの直接登録は避ける
この関数をadd_action('init', 'regenerate_all_thumbnails')のようにフックすると、サイトへのあらゆるアクセス(訪問者のページ閲覧・管理画面へのアクセスすべて)のたびに実行されてしまいます。無制限の画像処理が全リクエストで走り続け、サーバー負荷やタイムアウトの原因になります。管理画面にボタンを設置し、クリックしたときだけ実行する方式が安全です。
functions.php:管理画面ボタンからの安全な実行
// 管理画面「設定」>「一般」にボタンを設置し、クリックしたときだけ実行する
function render_regenerate_thumbnails_button() {
  if (!current_user_can('manage_options')) return;
  $url = wp_nonce_url(admin_url('options-general.php?run_regenerate_thumbnails=1'), 'run_regenerate_thumbnails');
  echo '<p><a href="' . esc_url($url) . '" class="button">画像サイズを一括再生成する</a></p>';
}
add_action('admin_notices', 'render_regenerate_thumbnails_button');

function handle_regenerate_thumbnails_request() {
  if (!isset($_GET['run_regenerate_thumbnails'])) return;
  if (!current_user_can('manage_options')) return;
  check_admin_referer('run_regenerate_thumbnails');

  $count = regenerate_all_thumbnails();

  add_action('admin_notices', function () use ($count) {
    echo '<div class="notice notice-success"><p>' . intval($count) . '件の画像サイズを再生成しました。</p></div>';
  });
}
add_action('admin_init', 'handle_regenerate_thumbnails_request');

「設定」>「一般」画面に表示されるボタンをクリックすると、nonceと権限チェックを経て一括再生成が実行されます。実行後はコード自体を削除して構いません。

再生成される画像サイズとは?

add_image_size()や設定画面で定義されている画像サイズが再生成対象になります。テーマやプラグインで追加されたカスタムサイズも含まれます。

実行後の確認方法

再生成後は、メディアライブラリから各画像の詳細を確認することで、登録されたすべてのサイズが正常に生成されているかチェックできます。また、開発者向けにはwp_get_attachment_metadata()で確認することも可能です。

WP-CLIを使った再生成も可能

もしSSHが使える環境であれば、wp media regenerateコマンドを使うことで、より高速かつ安全に再生成が可能です。

WP-CLIでの再生成
wp media regenerate --yes

WP-CLIが利用できる場合はこちらの方が推奨されます。

よくある質問(FAQ)

Qプラグインなしでサムネイルを一括再生成するWP-CLIコマンドは?
Awp media regenerateコマンドで全メディアのサムネイルを再生成できます。–yes フラグで確認プロンプトをスキップできます。大量の場合は–batch-size=50等でバッチ処理します。
QPHPコードでサムネイルを再生成するには?
Arequire_once ABSPATH . ‘wp-admin/includes/image.php’を読み込んだ上で、wp_generate_attachment_metadata()にアタッチメントIDとファイルパスを渡し、wp_update_attachment_metadata()で保存します。get_posts(array(‘post_type’ => ‘attachment’))で全アタッチメントIDを取得してループします。この読み込みを忘れるとフロントエンドでの実行時に「関数が未定義」の致命的エラーになるため注意してください。
Q新しいサムネイルサイズを追加した後に既存の画像を再生成する必要がありますか?
Aはい。add_image_size()で新サイズを追加しても既存の画像には適用されません。サムネイルの再生成が必要です。WP-CLIかRegenerate Thumbnailsプラグインが最も手軽です。

まとめ

WordPressで画像サイズを一括で再生成する必要がある場合、プラグインに頼らずPHPコードで直接対応することも可能です。特に運用中のサイトでは、軽量な対応方法として便利です。

ただし、作業前にはバックアップを取ったうえで、wp-admin/includes/image.phpの読み込みを忘れず、initフックへの直接登録ではなく管理画面ボタンなど明示的なトリガーで実行しましょう。必要に応じてWP-CLIも併用することで、より効率的な再構築が可能です。