WordPressでは、テーマの切り替えやカスタム画像サイズの追加によって、過去にアップロードされた画像が現在の仕様に合わない場合があります。こうしたときに必要になるのが「サムネイル画像サイズの再生成」です。
この記事では、プラグイン「Regenerate Thumbnails」を使わずに、PHPコードで画像サイズを一括再生成する方法を紹介します。
なぜ画像サイズの再生成が必要なのか
WordPressでは画像をアップロードすると、登録された各サイズ(例:thumbnail、medium、large)で自動生成されます。しかし、テーマや設定の変更で新しいサイズを追加しても、すでにアップロード済みの画像には適用されません。そのため、古い画像にも新しいサイズを生成する必要があります。
一括再生成用のコード
以下のコードをテーマの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;
}
安全に一度だけ実行する方法
この関数を
add_action('init', 'regenerate_all_thumbnails')のようにフックすると、サイトへのあらゆるアクセス(訪問者のページ閲覧・管理画面へのアクセスすべて)のたびに実行されてしまいます。無制限の画像処理が全リクエストで走り続け、サーバー負荷やタイムアウトの原因になります。管理画面にボタンを設置し、クリックしたときだけ実行する方式が安全です。// 管理画面「設定」>「一般」にボタンを設置し、クリックしたときだけ実行する
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 media regenerate --yes
WP-CLIが利用できる場合はこちらの方が推奨されます。
よくある質問(FAQ)
まとめ
WordPressで画像サイズを一括で再生成する必要がある場合、プラグインに頼らずPHPコードで直接対応することも可能です。特に運用中のサイトでは、軽量な対応方法として便利です。
ただし、作業前にはバックアップを取ったうえで、wp-admin/includes/image.phpの読み込みを忘れず、initフックへの直接登録ではなく管理画面ボタンなど明示的なトリガーで実行しましょう。必要に応じてWP-CLIも併用することで、より効率的な再構築が可能です。

